2014-03-31 37 views
2

我试图实现一个接受4位数的字段或将其保留为空。数据注释MVC 4位数

[RegularExpression(@"^(\d{4})$", ErrorMessage = "Enter a valid 4 digit Year")] 
[Display(Name = "Year")] 
public int Year { get; set; } 

当输入超过4个数字时,显示错误信息。问题是,当我输入任何不是数字或混合数字和非数字的值时,验证错误消息不会显示出来。

我肯定错过了一些东西。帮我在这里:)

回答

4

沃伦,

尝试使用可空整型,所以它将使共同通过如果没有在模型发送数据,请参见下面的代码执行

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; } 
    } 
+0

不幸的是,这也不能解决我在寻求帮助之前尝试过的问题。我找到了罪魁祸首,并将更新细节的线程。 – Warren

+0

@Warren你能发表你的观点代码吗? – cpoDesign

+0

我们与样本具有相同的视图代码。解决这个问题我不得不将@ Html.EditorFor(model => model.Year)更改为@ Html.txtBoxFor(model => model.Year)。 – Warren

1

罪魁祸首是使用@ HTML.EditorFor财产INT,当比数将忽略值其他输入值,也不会火起来它创建的元素

<input type="number"/> 

的元素验证。

一种用于此的解决方案是使用非数字类型的字段如@ HTML.TextBoxFor

0

变化intstring。然后将字符串转换为C#中的整数。您不必担心不可转换的字符串,即"123", "123a", "aaa"来自输入,因为使用正则表达式进行的数据验证将负责处理它。如果输入值与给定的正则表达式模式不匹配,则正则表达式将抛出验证错误。

由于它不是[Required]字段,它也会占用一个空字符串。因此,有效的投入将是"", "9999" or "dddd"

注意 使用,你将倾斜input领域使用type="number"属性不要使用可空INT,int?。在这种情况下,如果用户输入"123a",则值不能转换为数字(以js为单位),因此模型绑定将获得null值,并且不会触发任何验证错误。

当我有int?,正则表达式没有按预期工作。