使模型 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() 时将在 &lt;input&gt; 中显示的 type 属性 这很有趣。因为我在验证工作和不工作之间所做的唯一更改是将模型从 int 更改为 Nullable。我来回添加和删除了几次,只是为了确保我没有发疯,而且确实如此,这导致字母在 int 字段中被允许客户端(然后在传递给时被丢弃)控制器)。我没有看到任何 JS 错误。不过,我会继续寻找。 参考this DotNetFiddle。将文本框留空或输入有效整数,它将正确提交。但是输入说“ABC”,你会得到一个客户端错误并且不会提交表单(注意我会在几天内删除小提琴) 谢谢。有效。首先要注意的一件事:由于某种原因,当我今天启动我的项目并将文本放在一个整数字段中并标出时,字母消失了。我发誓这不是昨天发生的,我也没有疯。这是一件好事,所以人们不提交文本,但它也很糟糕,因为有人可能输入了一个数字并不小心输入了一个字母,然后他们的整个数字就会被抹去。话虽这么说:问题是我使用的是 EDITORFOR 而不是 TEXTBOXFOR。如果无效,EDITORFOR 会在 onblur 期间清除该值。 TEXTBOX 会触发实际验证! 【参考方案1】:

Stephen Muecke 的示例帮助我解决了问题。

我使用的是 Html.EditorFor 而不是 Html.TextboxFor。

当我点击/模糊时,前者会清除无效文本,导致不小心在字段中输入字母的人的号码被清除,导致人们因不得不重新输入而生气......甚至更糟糕的是,不是意识到它被清除并提交了一个空白值,因为他们没有注意。当我切换到 Html.TextBoxFor 时,它保留了有效,触发了验证错误消息并阻止了表单提交,这正是我想要的。

【讨论】:

使用EditorFor()和使用TextBoxFor()是一样的,只是因为int的类型会加上type="number",这会生成浏览器的数值控制。所以你看到的任何行为都是由于浏览器不允许不是数字的值。

以上是关于使模型 INT 字段可为空会禁用客户端验证的主要内容,如果未能解决你的问题,请参考以下文章

代码首先为必填字段生成可为空的列

禁用一个类的 Grails 脚手架验证

OroCRM 如何禁用客户端验证?

ASP .NET MVC在每个字段级别禁用客户端验证

单击复选框时,如何在单个字段上使用 jquery 禁用客户端验证?

将可为空的 int 映射到可为空的 int + automapper