C# .NET MVC客户端验证在值无效时不显示属性的消息

C# .NET MVC客户端验证在值无效时不显示属性的消息,c#,asp.net-mvc,validation,C#,Asp.net Mvc,Validation,我已经读了很多关于这个主题的帖子,但我仍然在与我的问题作斗争。我有一个表单,它有14个属性和5个复杂类型以及自定义模板编辑器。客户端验证适用于所有属性和自定义模板编辑器,但下面的属性除外。如果我输入文本,它将删除文本框的全部内容,而不显示任何消息。但是,如果我输入2,我会收到错误消息,说它必须是一个数字。有人经历过这种行为吗?这也发生在我的其他一些表格上 作为旁注:客户端是否应该验证可为null的int范围?似乎没有,除非我添加一个范围验证器。多谢各位 更新 我所有的int都是这样的?性质 型号

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

作为旁注:客户端是否应该验证可为null的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")
@使用(Html.BeginForm(“EditPerson”,“Maintenance”,FormMethod.Post,new{@class=“operation form”}))
{
@Html.AntiForgeryToken()
@Html.HiddenFor(model=>model.PersonId)
@Hidden(“ModifiedBy”,User.Identity.Name)
@Html.ValidationSummary(false,“,new{@class=“text danger”})
@LabelFor(model=>model.Life)
@EditorFor(model=>model.Life,new{htmlAttributes=new{@class=“to center routebox”}})
@Html.ValidationMessageFor(model=>model.Life,“,new{@class=“text danger”})
}
@节脚本{
@Scripts.Render(“~/bundles/jqueryval”)

有这样的选项:

  • 使用
    [范围(0,int.MaxValue)]
  • 使用
    [正则表达式([0-9]+)”)
  • 从中使用
    [Integer]
  • 在客户端注册时使用您自己的自定义
    ValidationAttribute

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

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

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

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


    您可以通过将其更改为
    @Html.TextBoxFor(m=>m.Life)
    进行测试,该选项将呈现
    type=“text”
    。现在,当您输入文本并尝试提交时,不引人注目的验证将阻止提交并显示“字段寿命必须是一个数字”。至于验证范围,如果您没有向属性添加适当的属性(例如
    [range(0,int.MaxValue)]
    ),则
    jquery.validate.unobtrusive
    无法进行测试,因此它会发回,但是它会在服务器上验证,当您返回视图时,将显示验证错误,如“值'99999999999999999999999999999999999999999999999999999'无效".

    你说得对,你必须使用范围验证器谢谢。我以前没有尝试过扩展,但使用范围和正则表达式并不能阻止文本框删除所有内容。范围确实验证了实际整数,但如果我输入文本,它仍然会删除字段,而不显示任何消息,而这可能确实会给你带来错误你想要的结果不是“解决问题”,它只是掩蔽它。这可能会以其他方式影响您。不幸的是,您没有显示足够的实际模型和实际页面来诊断真正的问题。我知道我正在掩蔽它。视图的其余部分与每个属性的片段完全相同,我认为模型的其余部分不会影响这一点错误本身,因为错误发生在所有
    int?
    属性上,并且不是特定于模型的。这就是为什么我省略了其他看起来像噪音的代码。有许多细微的事情会影响验证,如果不将整个页面和模型视为一个整体,很难看到整个图片。此外,你包括哪些javascript,安装了哪些全局过滤器,等等。问题可能隐藏在很多地方。此外,你有任何int.cshtml或Object.cshtml编辑器模板吗?可以理解,我将在今晚稍后发布我的整个模型和视图。表面上,我看不到任何特殊的过滤器或模板奈德,但我会小心的。成功了!谢谢。