【问题标题】:.NET MVC client side validation not showing message for property when value invalid.NET MVC 客户端验证在值无效时不显示属性消息
【发布时间】:2014-11-04 07:02:38
【问题描述】:

我已经阅读了很多关于这个主题的帖子,但我仍在努力解决我的问题。我有一个带有自定义模板编辑器的 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")

【问题讨论】:

  • 你是对的,你必须使用范围验证器

标签: c# asp.net-mvc validation


【解决方案1】:

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

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

【讨论】:

  • 做到了!谢谢。
【解决方案2】:

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

Nullable int validation not showing message for non-numeric values

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

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

【讨论】:

  • 虽然这确实可以为您提供您正在寻找的结果,但这并不是“解决问题”,它只是掩盖它。这可能会以其他方式回来咬你。不幸的是,您没有展示足够多的实际模型和实际页面来诊断真正的问题。
  • 我知道我在掩盖它。视图的其余部分看起来与每个属性的 sn-p 完全一样,我认为模型的其余部分本身不会影响此错误,因为错误发生在所有 int? 属性上并且不是特定于模型的。这就是为什么我放弃了其他看起来像噪音的代码。
  • 有很多细微的东西会影响验证,如果不把整个页面和模型看成一个整体,就很难看清全貌。此外,您包含哪些 javascript,安装了哪些全局过滤器等。有很多地方可以隐藏问题。
  • 另外,你们有 int.cshtml 或 Object.cshtml 编辑器模板吗?
  • 可以理解,我将在今晚晚些时候发布我的整个模型和视图。从表面上看,我没有看到您提到的任何特殊过滤器或模板,但我会继续关注。
【解决方案3】:

有这样的选择:

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

【讨论】:

  • 谢谢。我之前没有尝试过扩展,但是使用范围和正则表达式并不能阻止文本框删除所有内容。该范围确实验证了一个实际的整数,但如果我输入文本,它仍然会删除没有消息的字段
猜你喜欢
  • 2020-11-15
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 2016-10-11
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多