私はASP.NET MVC 5アプリケーションで作業していますが、プロジェクト所有者はnullable型以外の型の検証に起因する「アンダーポスト」問題を懸念しています(http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.htmlおよびhttp://www.asp.net/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-apiに記載されているように)。nullを許可しない型のASP.NET MVC 5モデルの検証(Int32)
私はこの問題をASP.NET MVC 5で再現するためのテストケースを作成しましたが、運がありません。
モデル:
public class ContactModel
{
[Required]
public Int32 data1 { get; set; }
public Int32 data2 { get; set; }
}
ビュー:
<div class="form-group">
@Html.LabelFor(model => model.data1)
<div>
@Html.EditorFor(model => model.data1)
</div>
</div>
<div>
@Html.LabelFor(model => model.data2)
<div>
@Html.EditorFor(model => model.data2)
</div>
</div>
コントローラー:
public ActionResult Index(Models.ContactModel contact)
{
if (ModelState.IsValid)
{
Response.Write("modelstate is valid<br>");
return View();
}
else
{
Response.Write("modelstate is invalid<br>");
return View();
}
}
それは思わdata1
とdata2
はポストにnullのとき、モデルにおけるそれらの値( contact
)は0になります。ただし、ModelState.IsValidは0になります。 偽(真のの代わりに2つの記事に示されています)。
私が持っているもの:
第二の記事は示したもの:
私はASP.NETでどのように機能するかのモデルの検証上の変更に関するすべての情報を見つけることができませんでしたMVCなので、私はテストケースに何か間違っていると思っています。どんな考えや提案も感謝しています。
'(必須の)'属性は 'int'プロパティには必要ありません(カスタムエラーメッセージが必要な場合を除き)。' int'は 'null'になることはありません。 'DefaultModelBinder'は、' int'に 'null'を代入することができず、' ModelState.IsValid = false'をセットするので、エラーを追加します。しかし、それは 'int'のデフォルト値であるので、値は' 0'です –
@StephenMueckeこれは私が最初に考えたものです。しかし、ブラッドウィルソン(私の質問の最初のリンク)の投稿によると:_これのオフショットは、[必須]は、nullable値の型では、フォームが値を含むことを保証するものではありません。値が含まれていない場合、モデル・バインディングはスキップされます。つまり、モデル・バインディングの失敗は発生しません。さらに、[必須]バリデーターが実行されると、値型のデフォルト値(通常は0)を含むモデルから値を照会し、「それはヌルではなく、すべてがすべてここでうまくいきます」。 – Jim
これは間違っており、モデルのバインディングは決してスキップされません。値型であるプロパティや '[Required]'属性を持つ参照型に対して値が送られた場合、 'ModelState.IsValid'は常にfalseになります –