C# 数据注释MVC 4位
我正在尝试实现一个接受4位数字的字段,或者将其保留为空C# 数据注释MVC 4位,c#,regex,asp.net-mvc,data-annotations,C#,Regex,Asp.net Mvc,Data Annotations,我正在尝试实现一个接受4位数字的字段,或者将其保留为空 [RegularExpression(@"^(\d{4})$", ErrorMessage = "Enter a valid 4 digit Year")] [Display(Name = "Year")] public int Year { get; set; } 当输入4个以上的数字时,将显示错误消息。问题是,当我输入任何不是数字或数字与非数字混合的值时,验证错误消息不会显示 我肯定错过了什么。帮帮我:)沃伦 尝试使用nullable
[RegularExpression(@"^(\d{4})$", ErrorMessage = "Enter a valid 4 digit Year")]
[Display(Name = "Year")]
public int Year { get; set; }
当输入4个以上的数字时,将显示错误消息。问题是,当我输入任何不是数字或数字与非数字混合的值时,验证错误消息不会显示
我肯定错过了什么。帮帮我:)沃伦
尝试使用nullableint,这样,若模型中并没有任何内容,它将允许共同发送数据,请参阅下面的代码以了解实现
public class TestModel
{
[RegularExpression(@"^(\d{4})$", ErrorMessage = "Enter a valid 4 digit Year")]
[Display(Name = "Year")]
public int? Year { get; set; }
}
更新:
我对这段代码的工作原理的看法如下
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Index</h2>
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>TestModel</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Year)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Year)
@Html.ValidationMessageFor(model => model.Year)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
罪魁祸首是使用@HTML.EditorFor属性int创建元素
<input type="number"/>
输入数值以外的值时,元素将忽略该值,并且不会启动验证
解决方法是使用非数字类型的字段,如@HTML.TextBoxFor将
int
更改为string
。然后将字符串转换为C#中的整数。您不需要担心无法转换的字符串,即来自输入的“123”、“123a”、“aaa”
,因为使用Regex进行数据验证将解决这个问题。如果输入值与给定的正则表达式模式不匹配,正则表达式将抛出验证错误
由于它不是[Required]
字段,因此也需要一个空字符串。因此,有效的输入应该是”、“9999”或“dddd”
小心
不要使用可为空的int,int?
使用该属性,您将倾向于在input
字段中使用type=“number”
属性。在这种情况下,如果用户输入say“123a”
,则值不能转换为数字(在js中),因此模型绑定将获得null
值,并且不会触发任何验证错误
当我使用
int?
时,Regex没有按预期工作。不幸的是,这也不能解决我在请求帮助之前尝试过的问题。我找到了罪魁祸首,并将更新线程的详细信息。我们有相同的查看代码作为示例。要解决这个问题,我必须将@Html.EditorFor(model=>model.Year)更改为@Html.txtBoxFor(model=>model.Year)。
<input type="number"/>