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]}
アクションプロパティにモデルプロパティと同じ名前を付けないように注意してください。名前を指定しないと、バインダーはパラメータにバインドしようとして失敗します。
public async Task<IActionResult> Index( EmailModel email ){ ... }
public class EmailModel{ public string Email { get; set; } }
アクションパラメータ「メール」を別の名前に変更すると、期待どおりにバインドされます。
public async Task<IActionResult> Index( EmailModel uniqueName ){ ... }
私はそれが同じケースであるかどうかはわかりませんが、私は同じ問題を抱えていて、実際に私のために働くように見えるものはありません。
私の場合の問題は、ビューモデルクラスにModelというプロパティがあったことです。
public string Model { get; set; }
プロパティの名前をModelNameに変更すると、FromForm属性がなくてもすべて正常に機能しました。
いくつかの特別なプロパティ名は、asp.net mvcモデルバインディングでは少し問題になるようです。
そのため、私のアドバイスは、モデルのプロパティをチェックし、問題があるかどうかを確認するために、1つずつ名前を変更してみることです。
お役に立てれば。
私はこのドキュメントがモデルバインディングを理解するのに役立つ同じ問題を抱えています https://docs.asp.net/en/latest/mvc/models/model-binding.html
プロパティ名がフォームフィールド名と完全に一致するようにすることで問題を解決し、[FromForm]属性を追加してバインディングソースを正確に指定します。
この問題は、リクエストモデルの1つ以上のプロパティがリクエストモデルで受け入れ可能なプロパティにバインドできない場合にも発生する可能性があります。
私の場合、List<string>
プロパティに入力したが、誤ってstring
を渡した。これにより、リクエストモデル全体がnull
になりました。
今日私はこれに遭遇しましたが、後知恵で明らかですが、バインドしているモデルのプロパティのアクセス修飾子が正しいことを確認する必要があると付け加えただけです。私はpublic MyProperty { get; internal set; }
いくつかと彼らはバインドしません。 internal
を削除したところ、うまく機能しました。
voidをActionResultに変更します。
[HttpPost]
public ActionResult Index(EmailModel email)
また、ビューとアクションからAntiForgeryTokenを検証することを忘れないでください。
// to your form in view
@Html.AntiForgeryToken()
// ------------
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(EmailModel email)
私の場合、投稿するオブジェクトに名前を付けるというMVC 4.0の規則を使用していました。例えば。、
js:
$http.post("SaveAnswer", { answer: answerValues })
C#:
public ActionResult SaveAnswer([FromBody] AnswerVM answer) {...}
Jsを$http.post("SaveAnswer", answerValues)
に変更すると、すべてが機能します。