使模型 INT 字段可为空会禁用客户端验证
Posted
技术标签:
【中文标题】使模型 INT 字段可为空会禁用客户端验证【英文标题】:Making model INT field nullable disables client side validation 【发布时间】:2018-06-19 19:24:14 【问题描述】:我有一个 MVC 6 项目,其中有一个包含各种数据类型(字符串、整数、日期时间等)的简单模型。
我包含了 query-validation 和 jquery.validation.unobtrisive.js 文件。我使用 html.Editorfor 和 Html.Validationmessagefor 行为每个字段添加一个输入。当我在 int 字段中添加任何字母字符或添加不正确的日期格式并尝试提交时,我会收到一些不错的、接近错误的消息,提醒我注意问题并阻止我提交表单。
但是,如果我在模型中将 INT 字段设为可为空,则不再进行验证。它让我提交,ModelState.Isvalid 变为真,它基本上只是丢弃任何无效的数据,对于报告应用程序,这可能导致用户获取太多数据(没有意识到他们的过滤器被丢弃)并制作基于这些他们没有注意到的额外数据的决定不应该存在。
有没有办法让可空 int 类型的客户端大小验证与不可空 int 类型完全相同?对于可为空的日期时间字段,这似乎不是问题。可能是因为在模型中我可以选择添加数据属性,例如
[DataType(DataType.DateTime)]
public Nullable<DateTime> datestart get; set;
此数据类型枚举似乎不包含整数值,仅包含“日期时间、HTML、电子邮件、ImageUrl 等字段”。添加如下注释也无济于事:
[Range(0, int.MaxValue, ErrorMessage = "This must be a positive number")]
【问题讨论】:
使其可空并不会禁用客户端验证 - 它只是意味着您可以将输入留空,它会发回null
值。如果您输入(比如说)“ABC”,您仍然会收到一条客户端验证消息。如果这对您不起作用,那么它是由于您的代码中的某些内容。 (附带说明,[DataType]
属性与验证无关 - 它只是确定使用 EditorFor()
时将在 <input>
中显示的 type
属性
这很有趣。因为我在验证工作和不工作之间所做的唯一更改是将模型从 int 更改为 NullableStephen Muecke 的示例帮助我解决了问题。
我使用的是 Html.EditorFor 而不是 Html.TextboxFor。
当我点击/模糊时,前者会清除无效文本,导致不小心在字段中输入字母的人的号码被清除,导致人们因不得不重新输入而生气......甚至更糟糕的是,不是意识到它被清除并提交了一个空白值,因为他们没有注意。当我切换到 Html.TextBoxFor 时,它保留了有效,触发了验证错误消息并阻止了表单提交,这正是我想要的。
【讨论】:
使用EditorFor()
和使用TextBoxFor()
是一样的,只是因为int
的类型会加上type="number"
,这会生成浏览器的数值控制。所以你看到的任何行为都是由于浏览器不允许不是数字的值。以上是关于使模型 INT 字段可为空会禁用客户端验证的主要内容,如果未能解决你的问题,请参考以下文章