【发布时间】:2016-06-28 08:57:48
【问题描述】:
我正在开发一个 ASP.NET MVC 5 应用程序,项目所有者担心由于验证不可为空的类型(如 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 中所述)导致的“发布不足”问题。
我创建了一个测试用例来在 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在post中为null时,它们在模型(contact)中的值将为0。但是,ModelState.IsValid也会为false (而不是两篇文章中显示的true)。
我有什么:
第二篇文章展示的内容:
我找不到任何有关 ASP.NET MVC 中模型验证工作方式更改的信息,所以我猜我的测试用例做错了。任何想法和建议都表示赞赏。
【问题讨论】:
-
您不需要
[Required]属性上的int属性(除非您想要自定义错误消息) -int永远不能是null。DefaultModelBinder添加了一个错误,因为您不能将null分配给int并设置ModelState.IsValid = false。但是值是0,因为这是int的默认值 -
@StephenMuecke 这就是我最初的想法。但根据 Brad Wilson 的帖子(我的问题中的第一个链接):其分支是不可为空值类型上的 [Required] 不能作为表单包含值的保证。如果不包含值,则跳过模型绑定,即不会发生模型绑定失败。此外,当 [Required] 验证器运行时,它会从模型中查询值——其中将包含值类型的默认值,通常为 0——并说“这不是 null,这里一切都很好!”。
-
这是错误的,模型绑定永远不会被跳过。如果为具有
[Required]属性的值类型或引用类型的属性发送值,ModelState.IsValid将始终为 false -
如果你想对整数类型进行验证,
[Required]属性在这种特定场景下是无用的。正如文章中所说:这是否是一个问题取决于您的方案。因此,如果您想对整数类型进行验证,我建议使用[Range]验证属性,因为它在这种情况下更有意义。
标签: asp.net-mvc asp.net-mvc-5 model-validation