数据注释 MVC 4 位数字



我正在尝试实现一个接受 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?时,正则表达式没有按预期工作。

最新更新