假设您有一个像这样的简单对象:
public class MyObject {
public int Test { get; set; }
}
并且您依靠默认模型绑定(bind)器来确保用户在发布如下所示的表单时不会将“测试”字段留空:
<form method="post" action="/test">
<p>
<%=Html.TextBox("Test") %>
<%=Html.ValidationMessage("Test") %>
</p>
<input id="Submit1" type="submit" value="submit" />
</form>
这个 Action :
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Test(MyObject o) {
return View();
}
当表单数据包含“Test”键(例如“Test=val
”或“Test=
”)时,这一切都会按预期工作
但是如果 key 不在表单数据中,则不会进行验证。因此,如果是空的 post 请求或带有 AnotherField=foo
之类的数据的请求,模型对象上的属性默认为类型的默认值(在本例中为 0)。并且 ModelState.IsValid
返回 true。
在我看来,这不是人们所期望的行为。
那么您建议如何改变这种行为?
编辑: 请记住,恶意用户可以使用 FireBug 轻松篡改表单数据。或Tamper Data插件来通过默认模型绑定(bind)器的验证,这可能会导致一些安全问题。
最佳答案
不幸的是,它没有按设计验证字段。请看一下这个Codeplex issue我发现并评论过。
非常不幸的是,MS 已确定这是其模型绑定(bind)程序的正确行为。
我相信默认模型绑定(bind)器应该验证整个实体,而不仅仅是发布的数据。
关于asp.net-mvc - 当字段不在表单数据中时,为什么默认模型绑定(bind)器不验证字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/784960/