DataAnnotationsvalidation(正则expression式)在asp.net mvc 4 – 剃刀视图

在正则expression式中使用特殊字符时,DataAnnotationsvalidation器不能在asp.net mvc 4 razor视图中工作。

模型:

[StringLength(100)] [Display(Description = "First Name")] [RegularExpression("^([a-zA-Z0-9 .&'-]+)$", ErrorMessage = "Invalid First Name")] public string FirstName { get; set; } 

剃刀视图:

 @Html.TextBoxFor(model => Model.FirstName, new { }) @Html.ValidationMessageFor(model => Model.FirstName) 

不显眼的validation呈现为:

 <input type="text" value="" tabindex="1" style="height:auto;" name="FirstName" maxlength="100" id="FirstName" data-val-regex-pattern="^([a-zA-Z0-9 .&amp;amp;&amp;#39;-]+)$" data-val-regex="Invalid First Name" data-val-length-max="100" data-val-length="The field FirstName must be a string with a maximum length of 100." data-val="true" class="textfield ui-input-text ui-body-d ui-corner-all ui-shadow-inset valid"> 

上述html中的正则expression式模式不是按照Model的RegularExpression指定的,即使input有效数据( Sam's )也会导致错误。

我该如何处理?

–UPDATE–

我根据@Rick的build议更新了代码

 [StringLength(100)] [Display(Description = "First Name")] [RegularExpression("([a-zA-Z0-9 .&'-]+)", ErrorMessage = "Enter only alphabets and numbers of First Name")] public string FirstName { get; set; } 

查看源显示以下内容:

 <input data-val="true" data-val-length="The field FirstName must be a string with a maximum length of 100." data-val-length-max="100" data-val-regex="Enter only alphabets and numbers of First Name" data-val-regex-pattern="([a-zA-Z0-9 .&amp;amp;&amp;#39;-]+)" id="FirstName" maxlength="100" name="FirstName" type="text" value="" /> 

我仍然有同样的问题。

更新2012年7月9日 – 看起来这是固定的RTM。

  1. 我们已经暗示^$所以你不需要添加它们。 (包括它们似乎并不是一个问题,但是你不需要它们)
  2. 这似乎是ASP.NET MVC 4 / Preview / Beta中的一个错误。 我已经打开了一个错误

查看源代码显示如下:

 data-val-regex-pattern="([a-zA-Z0-9 .&amp;&#39;-]+)" <-- MVC 3 data-val-regex-pattern="([a-zA-Z0-9&#32;.&amp;amp;&amp;#39;-]+)" <-- MVC 4/Beta 

看起来我们是双重编码。

尝试转义这些字符:

 [RegularExpression(@"^([a-zA-Z0-9 \.\&\'\-]+)$", ErrorMessage = "Invalid First Name")] 

在expression式开始时尝试@符号。 所以你不需要键入转义字符只是复制粘贴“”中的正则expression式,并把@标志。 像这样:

 [RegularExpression(@"([a-zA-Z\d]+[\w\d]*|)[a-zA-Z]+[\w\d.]*", ErrorMessage = "Invalid username")] public string Username { get; set; } 

你使用的是什么浏览器? 我input你的例子,并在IE8和Chrome中都尝试过,当我键入Sam's值时,它被validation正确

  public class IndexViewModel { [Required(ErrorMessage="Required")] [RegularExpression("^([a-zA-Z0-9 .&'-]+)$", ErrorMessage = "Invalid First Name")] public string Name { get; set; } } 

当我使用IE Developer工具栏和Chrome Developer模式检查DOM时,它不显示任何特殊字符。

过去也有类似的问题(正如TweeZz所提到的)。 在我们的例子中,我们通过构buildMvcHtmlString的自定义htmlHelper扩展方法来控制TextBoxFor的输出,在这一步中我们需要添加这些不显眼的validation属性,

 var attrs = htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata) 

在调用这个方法之后,属性是html编码的,所以我们简单地检查一下是否有正则expression式validation器,如果是的话,我们将html解码这个属性,然后将它们合并到tagBuilder中(用于构build“input”标签)

 if(attrs.ContainsKey("data-val-regex")) attrs["data-val-regex"] = ((string)attrs["data-val-regex"]).Replace("&amp;","&"); tagBuilder.MergeAttributes(attrs); 

我们只关心&amp;这就是为什么这个字面replace

尝试使用这些值的ASCII码:

 ^([a-zA-Z0-9 .\x26\x27-]+)$ 
  • \x26 =
  • \x27 = '

格式是\xnn ,其中nn是两位hex字符代码。 您还可以使用\unnnn为Unicode字符指定一个四位hex字符代码。

问题是,正则expression式模式被HTML编码了两次 ,一次是正则expression式正在构build,一次在您的视图中呈现。

现在,尝试在Html.Raw中包装Html.Raw ,如下所示:

 @Html.Raw(Html.TextBoxFor(model => Model.FirstName, new { }))