asp.net-mvc - 当字段不在表单数据中时,为什么默认模型绑定(bind)器不验证字段?

标签 asp.net-mvc

假设您有一个像这样的简单对象:

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/

相关文章:

asp.net-mvc - 我如何为我的单元测试实现/构建/创建 'in memory database'

asp.net-mvc - MVC 中的路径中的花括号意味着什么?

javascript - 在不使用 Jquery 的情况下,在 MVC View 中的页面中按 Enter 时按钮触发

javascript - JSON发送的数据始终为空

javascript - 如何使用 javascript 勾选页面加载的复选框?

asp.net-mvc - 将 ASP 网站部署到 IIS 后,如何修复与 Access 数据库丢失的连接?

LaunchSettings.json中的Asp.Net Core更改URL不起作用

c# - MVC 4 表单例份验证 - 除了在 web.config 上声明的操作之外,无法访问任何其他操作

asp.net-mvc - MVC : Updating a FK Relationship from a SelectList

c# - 使用 MVC 模型显示只读文本