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