web-dev-qa-db-ja.com

Asp.netコアモデルはフォームからバインドしません

3番目の静的ページ(Adobe Museによって生成された)からの投稿要求をキャッチし、MVCアクションで処理します。

<form method="post" enctype="multipart/form-data">
   <input type="text" name="Name">
   ...
</form>

空のフォームアクションのルーティング:

app.UseMvc(routes => routes.MapRoute(
   name: "default",
   template: "{controller=Home}/{action=Index}"));

しかし、アクションでは、すべてのプロパティが空のモデルがあります

アクション:

[HttpPost]
public void Index(EmailModel email)
{
   Debug.WriteLine("Sending email");
}

モデル:

public class EmailModel
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Company { get; set; }
    public string Phone { get; set; }
    public string Additional { get; set; }
}

Request.Formはフォームからのすべての値を持っていますが、モデルは空です

[0] {[Name, Example]}
[1] {[Email, [email protected]]}
[2] {[Company, Hello]}
[3] {[Phone, Hello]}
[4] {[Additional, Hello]}
13
Kovpaev Alexey

アクションプロパティにモデルプロパティと同じ名前を付けないように注意してください。名前を指定しないと、バインダーはパラメータにバインドしようとして失敗します。

public async Task<IActionResult> Index( EmailModel email ){ ... }

public class EmailModel{ public string Email { get; set; } }

アクションパラメータ「メール」を別の名前に変更すると、期待どおりにバインドされます。

public async Task<IActionResult> Index( EmailModel uniqueName ){ ... }
37
Stuart

私はそれが同じケースであるかどうかはわかりませんが、私は同じ問題を抱えていて、実際に私のために働くように見えるものはありません。
私の場合の問題は、ビューモデルクラスにModelというプロパティがあったことです。

public string Model { get; set; }

プロパティの名前をModelNameに変更すると、FromForm属性がなくてもすべて正常に機能しました。

いくつかの特別なプロパティ名は、asp.net mvcモデルバインディングでは少し問題になるようです。

そのため、私のアドバイスは、モデルのプロパティをチェックし、問題があるかどうかを確認するために、1つずつ名前を変更してみることです。

お役に立てれば。

2
Velyo

私はこのドキュメントがモデルバインディングを理解するのに役立つ同じ問題を抱えています https://docs.asp.net/en/latest/mvc/models/model-binding.html

プロパティ名がフォームフィールド名と完全に一致するようにすることで問題を解決し、[FromForm]属性を追加してバインディングソースを正確に指定します。

0
phen

この問題は、リクエストモデルの1つ以上のプロパティがリクエストモデルで受け入れ可能なプロパティにバインドできない場合にも発生する可能性があります。

私の場合、List<string>プロパティに入力したが、誤ってstringを渡した。これにより、リクエストモデル全体がnullになりました。

0
daniel.caspers

今日私はこれに遭遇しましたが、後知恵で明らかですが、バインドしているモデルのプロパティのアクセス修飾子が正しいことを確認する必要があると付け加えただけです。私はpublic MyProperty { get; internal set; }いくつかと彼らはバインドしません。 internalを削除したところ、うまく機能しました。

0
Mikah Barnett

voidActionResultに変更します。

[HttpPost]
public ActionResult Index(EmailModel email)

また、ビューとアクションからAntiForgeryTokenを検証することを忘れないでください。

// to your form in view 
@Html.AntiForgeryToken()
// ------------

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(EmailModel email)
0
agenc

私の場合、投稿するオブジェクトに名前を付けるというMVC 4.0の規則を使用していました。例えば。、

js:$http.post("SaveAnswer", { answer: answerValues })

C#:public ActionResult SaveAnswer([FromBody] AnswerVM answer) {...}

Jsを$http.post("SaveAnswer", answerValues)に変更すると、すべてが機能します。

0
Daniel