当MV值无效时,.NET MVC客户端validation不显示属性消息

我已经阅读了很多关于这个主题的post,但我仍然在与我的问题作斗争。 我有一个具有14个属性和5个复杂类型的表单,其中包含自定义模板编辑器。 客户端validation适用于所有属性和自定义模板编辑器,但下面的属性。 如果我输入文本,它将删除文本框的全部内容而不显示任何消息。 但是,如果我输入2.,我收到错误消息,说它必须是一个数字。 有没有人经历过这种行为? 这也发生在我的其他一些forms上。

作为旁注:客户端是否应该validation可空的int范围? 似乎它没有,除非我添加范围validation器。 谢谢。

更新这实际上发生在我的所有int? 性能

模型

[Display(Name = "Lifetime")] public int? Life { get; set; } 

视图

 @using (Html.BeginForm("EditPerson", "Maintenance", FormMethod.Post, new { @class = "operation-form" })) { @Html.AntiForgeryToken() @Html.HiddenFor(model => model.PersonId) @Html.Hidden("ModifiedBy", User.Identity.Name) 
@Html.ValidationSummary(false, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.Life)
@Html.EditorFor(model => model.Life, new { htmlAttributes = new { @class = "to-center routebox" } }) @Html.ValidationMessageFor(model => model.Life, "", new { @class = "text-danger" })
} @section Scripts { @Scripts.Render("~/bundles/jqueryval")

如果您使用现代浏览器,问题可能是使用@Html.EditorFor()默认情况下,这会将type="number"添加到输入中,因此将生成数字控件的浏览器实现。 我只使用Chrome对此进行了测试,但是如果您输入的文本不是有效数字,则浏览器会拦截它并阻止设置value属性。 现在,当您回发时, Life为null,因此有效,当您返回视图时, ModelState值为null,解释为什么它似乎“擦除文本框的整个内容而没有消息”

您可以通过将其更改为@Html.TextBoxFor(m => m.Life)来测试它,这将呈现type="text" 。 现在,当您输入文本并尝试提交时,不显眼的validation将阻止提交并显示“字段生活必须是数字” 。 至于validation范围,如果你没有为属性添加适当的属性(例如[Range(0, int.MaxValue)] )那么jquery.validate.unobtrusive没有任何jquery.validate.unobtrusive可以测试,所以它回发了,但是它的validation在服务器上,当您返回视图时,将显示validation错误,如“值’999999999999999999999999999999999999999999’无效”

有一次我发现了那个int? 是问题,我在这里找到了一个解决方案:

Nullable int validation不显示非数字值的消息

我所做的只是将数据类型注释添加到所有int? 。 不知道为什么这个有效。

 [Display(Name = "Lifetime")] [DataType(DataType.Text)] public int? Life { get; set; } 

有这样的选择:

  1. 使用[Range(0, int.MaxValue)]
  2. 使用[RegularExpression("([0-9]+)")]
  3. 使用DataAnnotationExtensions中的 [Integer]
  4. 使用您自己的自定义ValidationAttribute并在客户端注册