我已经阅读了很多关于这个主题的帖子,但我仍然在与我的问题作斗争。我有一个表单,它有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")
答案 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)
有这样的选择:
[Range(0, int.MaxValue)]
[RegularExpression("([0-9]+)")]
[Integer]
ValidationAttribute
并在客户端