首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C# MVC模型验证时序

C# MVC模型验证时序
EN

Stack Overflow用户
提问于 2017-04-26 15:30:49
回答 2查看 1.1K关注 0票数 3

我们有一个模型,它显示在一个具有模型验证的部分视图上的表单中。我们有几个这样的领域:

代码语言:javascript
运行
复制
[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; }

然后,在视图中,我们将为这些字段显示文本框,并为它们提供验证消息,如下所示:

代码语言:javascript
运行
复制
<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保留为空白,则在提交表单之前不会出现验证消息,请检查模型状态是否有效并返回到页面。

但是,如果我用无效的条目编辑邮政编码,即使我没有提交表单,验证消息也会不折不扣地弹出。

是否有办法让他们同时处理,这样用户就不会觉得奇怪了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-26 15:52:25

ASP.NET MVC使用数据注释进行服务器端和客户端验证.

在视图中,您使用的是Razor。当使用Helper方法(例如@Html.TextBoxFor)呈现输入字段时,剃刀视图引擎将查看应用于引用属性的数据注释,并向HTML标记添加其他属性。

但是,只有某些/标准的数据注释对客户端有效,它们是:

  • 必需-如果您将验证消息保留为空,您将不会看到它&在单击submit之前。客户端的性能在单击'Submit‘和表单没有发送到服务器后显示为,因为客户机已经注意到这些字段是空的。您可以通过右键单击表单所在的页面,然后单击“检查”,然后单击“网络”选项卡,然后单击submit (将所有必需字段保留为空)来检查。您不应该在该选项卡下看到任何内容,因为客户端在将表单发送到服务器之前对其进行了验证。
  • StringLength
  • 范围
  • 比较
  • 电话
  • EmailAddress
  • Url
  • RegularExpression

此外,为了使其工作,在您的Bundle.config中。你有一个很可能叫"~/bundles/jqueryval"的包。而且在您的_Layout页面中没有引用该包。但是,您可能在_Layout页面的底部有一个名为@RenderSection("scripts", required: false)的部分。

因此,在要使用验证的视图的底部,您需要编写:

代码语言:javascript
运行
复制
@section scripts{
    @Scripts.Render("~/bundles/jqueryval")
}
票数 3
EN

Stack Overflow用户

发布于 2017-04-26 16:22:53

很难说,如果不能够实际使用表单,则必须在消息出现之前触发客户端验证。提交表单当然是触发所有字段验证的蛮力方式,但否则,它是基于表单字段状态的。

jQuery验证文档的详细信息:

默认情况下,表单在submit上进行验证,由用户单击submit按钮或在表单输入聚焦时按enter (选项onsubmit)触发。此外,一旦一个字段被高亮显示为无效,只要用户在字段中键入某项内容(选项onkeyup),就会验证该字段。当用户向有效字段输入无效内容时,也会在字段失去焦点(选项onblur)时验证该字段。(强调地雷)

关键是关于“一旦字段被突出显示为无效”。在验证字段之前,除非字段中的值发生了更改,或者验证了完整的表单(例如在提交时),否则不会自动在该字段上运行验证。如果字段最初为空,而您将其保持为空,则从技术上讲,它没有更改,因此没有验证状态。您可能会添加自己的触发器,以在模糊状态下验证字段。例如:

代码语言:javascript
运行
复制
$('#MyRequiredField').on('blur', function () {
    $(this).valid();
});

但是,这违反了jQuery验证插件的约定:

这些交互的目的是尽早提供反馈,同时避免用户的烦恼。在用户有机会输入错误信息之前显示错误消息是没有帮助的。

请注意,用户可能在表单中跳转是完全有原因的,仅仅因为用户还没有填写所需的字段,所以显示错误消息并不总是合适的。

更新

在我第一次阅读您的问题时,我忽略了关于在将这些字段保留为空白之前再次返回视图之前实际返回操作的一点。我似乎记得我以前遇到过一个类似的问题,但我不记得它是特定于MVC版本的还是持久的。基本上,如果您使用TextBoxFor,就不会应用“必需的”客户端验证。您要么需要使用EditorFor,要么用@Html.TextBoxFor(m => m.Foo, new { required = true })手动应用它。

我认为您仍然会遇到问题,没有像上面所描述的那样对字段进行初步验证,但是进行这种更改应该确保它实际上被客户端验证所捕获,而不是首先返回到服务器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43638564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档