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

时间:2014-11-03 17:54:49

标签: c# asp.net-mvc validation

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

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

更新 这实际上发生在我所有的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)

    <div class="form-horizontal">
        @Html.ValidationSummary(false, "", new { @class = "text-danger" })
      <div class="col-md-4">
        <div class="row person-field">
          <div class="col-md-6 field-name">
             @Html.LabelFor(model => model.Life)
          </div>
          <div class="col-md-6">
             @Html.EditorFor(model => model.Life, new { htmlAttributes = new { @class = "to-center routebox" } })
             @Html.ValidationMessageFor(model => model.Life, "", new { @class = "text-danger" })
          </div>
        </div>
      </div>
    </div>
}

 @section Scripts {
@Scripts.Render("~/bundles/jqueryval")

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

Nullable int validation not showing message for non-numeric values

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

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

答案 2 :(得分:0)

有这样的选择:

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