【问题标题】:ASP.NET MVC - server-side validation for value typesASP.NET MVC - 值类型的服务器端验证
【发布时间】:2011-06-28 18:09:39
【问题描述】:

我有一个包含值类型(例如boolDateTime、枚举等)的模型,并且我用[Required] 属性标记了属性。

我加载页面,不提供任何值,然后提交表单。客户端验证已关闭。显然ModelState 是无效的。

然而,当表单返回给客户端时,这些字段将填充类型的默认值(例如falseDateTime.MinValue、第一个枚举值等)。这不是我真正想要的,我希望这些字段保持空白。

目前我通过使属性可以为空(例如bool?)来解决这个问题。这是“正确”的做法吗?还是我应该做其他事情来确保 MVC 不会自动使用默认值填充值类型属性?

【问题讨论】:

  • 或者我可能会被告知我应该使用只有字符串的 View Model 类...?不幸的是,这有点晚了,部分原因是要求,部分原因是我的经验不足。我会保存到下一个项目!
  • 我会坚持使用可空选项。这是我想做的事情,除了可能不使用 MVC 客户端验证并创建自己的验证之外,我找不到更简单的解决方案。不过,这似乎工作量太大了。

标签: asp.net-mvc asp.net-mvc-3 validation


【解决方案1】:

我假设您希望表单中的字段在下次访问时保持为空 - 在这种情况下,可空类型是一种可行的方法。字符串是另一个。

注意:我倾向于不在 ViewModel 中使用 Enum,而是使用可为空的整数 - 我发现它更容易。

另一个技巧是将用于组合框中的枚举保留为 0 未映射,然后添加“请选择”(值 = 0)选项。在这种情况下,最好不要使用可空类型,因为 0 很有用。

如果您有一个与域对象分开的 ViewModel,所有这些都会更好地工作 - 使用等效的 Automapper 在它们之间进行映射。这允许您在为您的 UI 设计的 ViewModel 中拥有一组类型,而不会影响您在域层中拥有的内容。

【讨论】:

    猜你喜欢
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    相关资源
    最近更新 更多