数据注释 MVC 4 位数字
本文关键字:数字 MVC 注释 数据 | 更新日期: 2023-09-27 17:55:09
我正在尝试实现一个接受 4 位数字或将其留空的字段。
[RegularExpression(@"^('d{4})$", ErrorMessage = "Enter a valid 4 digit Year")]
[Display(Name = "Year")]
public int Year { get; set; }
当输入超过 4 个数字时,将显示错误消息。问题是当我输入任何不是数字或数字和非数字混合的值时,验证错误消息不会显示。
我肯定错过了一些东西。在这里帮帮我:)
Warren,
尝试使用可为空的 int,因此如果模型中没有任何内容,它将允许 co 发送数据,请参阅下面的代码以实现
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")
}
我带控制器的模型是:
public class HomeController : Controller
{
//
// GET: /Home/
public ActionResult Index()
{
var model = new TestModel();
return View(model);
}
}
public class TestModel
{
[RegularExpression(@"^('d{4})$", ErrorMessage = "Enter a valid 4 digit Year")]
[Display(Name = "Year")]
public int? Year { get; set; }
}
罪魁祸首是使用@HTML。编辑器对于属性 int,它创建元素
<input type="number"/>
当使用数字以外的值输入时,元素将忽略该值,并且不会启动验证。
对此的解决方案是使用非数字类型的字段,例如@HTML。文本框
将int
更改为string
。然后在 C# 中将字符串转换为整数。您无需担心不可转换的字符串,即来自输入的"123", "123a", "aaa"
,因为使用正则表达式进行数据验证将处理它。如果输入值与给定的正则表达式模式不匹配,正则表达式将抛出验证错误。
由于它不是[Required]
字段,因此它也需要一个空字符串。因此,有效的输入将被"", "9999" or "dddd"
谨慎不要使用可为空的 int,int?
使用该整数input
您将倾向于在字段中使用type="number"
属性。在这种情况下,如果用户输入 "123a"
,则值不可转换为数字(以 js 为单位),因此模型绑定将获得null
值,并且不会触发任何验证错误。
当我有int?
时,正则表达式没有按预期工作。