0

我有一个具有多个验证规则的模型:

[Required(ErrorMessage = "Number must be enter")]
    [RegularExpression("^[0-9]{1,10}$", ErrorMessage = "Your must be enter only integer number between 0-10 simvols")]
    public int Number
    {
        get { return number; }
        set { number = value; }
    }

所以我的验证不起作用。我检查了我的代码,但找不到我做错的地方。这是我的视图模板的一部分:

<% using (Html.BeginForm())
   {%>
<%: Html.ValidationSummary(true) %>
<div class="editor-label">
    <p class="number">
        Enter number</p>
    <%: Html.TextBoxFor(model => model.Number, new {@class = "txtNumber"})%>
    <%: Html.ValidationMessageFor(model => model.Number) %>
</div>
<p>
    <input type="submit" value="Calculate" class="button" />
</p>
<% } %>
4

2 回答 2

2

你的正则表达式应该是这样的:

"^([0-9]|10)$"

编辑:

然而,你真正的问题是你没有正确地做事。您在模型中使用 int 类型。但是随后您在 Post 操作中使用了 FormCollection。FormCollection 绕过模型绑定器,并为您提供输入的任何内容。

相反,您应该对您的值进行模型绑定,并且应该在模型中将其设为可为空的 int。原因是 int 是值类型,不能为空。因此,它必须始终包含一个值,在您输入文本的情况下,这意味着该值将为 0,并且由于 0 通过您的验证,因此ModelState.IsValid将返回 true。

相反,请执行以下操作:

[Required(ErrorMessage = "Number must be enter")]
[Range"^[0-9]{1,10}$", 
    ErrorMessage = "Your must be enter only integer number between 0-10 simvols")]
public int? Number {get;set;}

然后在您的操作方法中:

public ActionResult Index(MyModel model) {
    if (ModelState.IsValid) {
       // model.Number is now an integer already, and IsValid will be false for no number
    }
}
于 2013-02-04T06:24:36.213 回答
1

确保您的元素包含在 html.beginform 标记内。仅当您的控件位于 <form> 元素内时,验证才有效。

于 2013-02-02T07:15:19.170 回答