【问题标题】:Asp.Net MVC does automatic model validation for DateTime but no othersAsp.Net MVC 对 DateTime 进行自动模型验证,但没有其他的
【发布时间】:2010-03-16 00:27:22
【问题描述】:

我正在使用 MVC 2 和我构建的 LinqToSql 项目中的一些模型。我看到,当我在编辑具有来自模型的 DateTime 字段的表单后发回控制器操作时,MVC Html.ValidationMessageFor() 助手将在日期文本框旁边很好地显示一个错误。

当您在 Controller Action 中测试 ModelState.IsValid() 时,这似乎会自动发生,就好像 MVC 模型绑定自动知道 DateTime 字段不能为空一样。我的问题是......我在这些 LinqToSql 生成的类中有一些其他字符串字段是不可为空的(在传递给 LinqToSql 生成的类的 Sql Server 中标记为不可空),那么 MVC 先生为什么不接并在我为这些字段添加的 ValidationMessageFor() 占位符中显示“必需”消息,就像为 DateTime 字段一样?

当然,我已经成功添加了 MetadataType(typeof) 伙伴类来覆盖这些不可为空的字符串字段,但是当 LinqToSql 生成的类已经包含足够的内容时,将所有这些元数据添加到伙伴类中确实是多余的MVC 可以嗅出的信息,就像它对 DateTime 所做的那样。如果 MVC 验证自动与 DateTime 一起使用,为什么这些不可为空的字段也不能呢?

【问题讨论】:

    标签: asp.net-mvc-2


    【解决方案1】:

    AFAIK 所有值类型的操作参数都是自动需要和验证的,而引用类型的操作参数则不是。他们通过一些验证提供者进行验证,即。数据注释。

    【讨论】:

    • 匹配我在 Asp.Net MVC 论坛上收到的一个答案:“活页夹只知道静态类型信息。由于 DateTime 是不可为空的值类型,活页夹可以检测到传入的空值有绝对没有机会被正确绑定。由于String是引用类型,它可以接受空值,所以绑定器试图将这些属性设置为空。它无法从静态类型信息本身知道数据库中的后备列是不可为空的。”
    【解决方案2】:

    由于您提到了 ValidationMessageFor(),我假设您在表单上有此字段(在 MVC 2 的后续版本中有一个更改,如果该字段不在模型中,则模型中的“必需”不是真正需要的查看)。

    我注意到的另一个原因是 MVC 先生可能会注意到有一个错误;但是消息被 DataAnnotation 设置抑制,甚至可能被 ValidationMessageFor() 本身抑制。我现在不记得细节了,但是我很困惑为什么没有消息,发现只是验证消息本身是空的。

    排除这种可能性的最简单方法是中断调试器,查看 ModelState.IsValid 是否为真。如果为假,那么显然 MVC 先生 确实 拿起了...如果为真 - 我从未见过这样的事情(字段按要求定义,但未检测到错误);但我主要与 EF 合作。虽然我希望 LinqToSql 的行为相同 - 我没有第一手经验

    【讨论】:

    • 我确实打破了它并通过发布操作进行跟踪...当字符串字段为空时,ModelState.IsValid 为真,因此 MVC 先生 没有 看到任何验证错误。但是,当我尝试 Save() 模型时,我确实会收到 DAL 错误,因为 SQL Server 知道字段不能为空,我必须处理它。一旦我连接了伙伴类,MVC 就会看到错误,我什至从未尝试过 Save() 命中 DAL。如问题所述,MVC 立即看到一个空的 DateTime,并且它包含在伙伴类或其他任何地方。
    • 顺便说一句,是的,我确实在模型上的每个属性的表单上都有输入字段。
    • 完全抓住一根稻草......模型是否有可能将其定义为 not 必填字段(例如,它有一个默认值,但你传递了一个 NULL,并且分配默认值不会启动)。当您说 empty 字符串时,我假设您的意思是 NULL,而不是“”。如果此字段在 DB 中不可为空,默认值为 "",但在模型中可空 - 你可以拥有我上面描述的内容,正如我所说,我从未在 EF 中看到过这种情况;所以如果这没有帮助 - 我放弃:(
    • Hmmm... 您认为表单正在回发一个空字符串,该字符串通过了模型验证,因此在 MVC 中不会出现验证错误。假设这是真的(我可以稍后通过调试器进行检查)......好吧,那么 UpdateModel(dalObject) 方法应该将该空字符串传递给 DAL 对象(但我不认为它是)因为那时我在我的 DAL 类上调用 Save() 并且 that 是 DAL 类被通知 DB 字段不能为空的地方。不过,你给了我一些东西可以研究。
    • 实际上,我建议该模型不强制执行不可为空性,并对原因进行一些猜测。如果表单要传递空字符串,那么你是对的 - DAL 也不会有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    相关资源
    最近更新 更多