我们有一个模型,它显示在一个具有模型验证的部分视图上的表单中。我们有几个这样的领域:
[Required(ErrorMessage = "{0} cannot be empty")]
public string FirstName { get; set; }
[Required(ErrorMessage = "{0} cannot be empty")]
public string LastName { get; set; }
[RegularExpression(@"(\d{5})?", ErrorMessage = "Zip must be a 5 digit number or empty.")]
public string ZipCode { get; set; }然后,在视图中,我们将为这些字段显示文本框,并为它们提供验证消息,如下所示:
<td>
@Html.TextBoxFor(m => m.Officer.FirstName)
@Html.ValidationMessageFor(m => m.Officer.FirstName)
</td>
<td>
@Html.TextBoxFor(m => m.Officer.LastName)
@Html.ValidationMessageFor(m => m.Officer.LastName)
</td>
<td>
@Html.TextBoxFor(m => m.Officer.ZipCode)
@Html.ValidationMessageFor(m => m.Officer.ZipCode)
</td>验证是有效的,但我注意到一些奇怪的时间,我还没有找到任何文件,为什么。
在填写表单时,如果我将FirstName或LastName保留为空白,则在提交表单之前不会出现验证消息,请检查模型状态是否有效并返回到页面。
但是,如果我用无效的条目编辑邮政编码,即使我没有提交表单,验证消息也会不折不扣地弹出。
是否有办法让他们同时处理,这样用户就不会觉得奇怪了?
发布于 2017-04-26 15:52:25
ASP.NET MVC使用数据注释进行服务器端和客户端验证.
在视图中,您使用的是Razor。当使用Helper方法(例如@Html.TextBoxFor)呈现输入字段时,剃刀视图引擎将查看应用于引用属性的数据注释,并向HTML标记添加其他属性。
但是,只有某些/标准的数据注释对客户端有效,它们是:
此外,为了使其工作,在您的Bundle.config中。你有一个很可能叫"~/bundles/jqueryval"的包。而且在您的_Layout页面中没有引用该包。但是,您可能在_Layout页面的底部有一个名为@RenderSection("scripts", required: false)的部分。
因此,在要使用验证的视图的底部,您需要编写:
@section scripts{
@Scripts.Render("~/bundles/jqueryval")
}发布于 2017-04-26 16:22:53
很难说,如果不能够实际使用表单,则必须在消息出现之前触发客户端验证。提交表单当然是触发所有字段验证的蛮力方式,但否则,它是基于表单字段状态的。
jQuery验证文档的详细信息:
默认情况下,表单在submit上进行验证,由用户单击submit按钮或在表单输入聚焦时按enter (选项onsubmit)触发。此外,一旦一个字段被高亮显示为无效,只要用户在字段中键入某项内容(选项onkeyup),就会验证该字段。当用户向有效字段输入无效内容时,也会在字段失去焦点(选项onblur)时验证该字段。(强调地雷)
关键是关于“一旦字段被突出显示为无效”。在验证字段之前,除非字段中的值发生了更改,或者验证了完整的表单(例如在提交时),否则不会自动在该字段上运行验证。如果字段最初为空,而您将其保持为空,则从技术上讲,它没有更改,因此没有验证状态。您可能会添加自己的触发器,以在模糊状态下验证字段。例如:
$('#MyRequiredField').on('blur', function () {
$(this).valid();
});但是,这违反了jQuery验证插件的约定:
这些交互的目的是尽早提供反馈,同时避免用户的烦恼。在用户有机会输入错误信息之前显示错误消息是没有帮助的。
请注意,用户可能在表单中跳转是完全有原因的,仅仅因为用户还没有填写所需的字段,所以显示错误消息并不总是合适的。
更新
在我第一次阅读您的问题时,我忽略了关于在将这些字段保留为空白之前再次返回视图之前实际返回操作的一点。我似乎记得我以前遇到过一个类似的问题,但我不记得它是特定于MVC版本的还是持久的。基本上,如果您使用TextBoxFor,就不会应用“必需的”客户端验证。您要么需要使用EditorFor,要么用@Html.TextBoxFor(m => m.Foo, new { required = true })手动应用它。
我认为您仍然会遇到问题,没有像上面所描述的那样对字段进行初步验证,但是进行这种更改应该确保它实际上被客户端验证所捕获,而不是首先返回到服务器。
https://stackoverflow.com/questions/43638564
复制相似问题