asp.net mvc 4中的DataAnnotations验证(正则表达式) - razor视图

时间:2011-11-23 15:17:42

标签: asp.net-mvc regex razor data-annotations

当使用正则表达式中的特殊字符时,DataAnnotations验证器无法在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; }

Razor查看:

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

不显眼的验证在视图中呈现为:

<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中的正则表达式模式未按模型的RegularExpression中的指定呈现,即使输入有效数据(Sam's)也会导致错误。

我该如何处理?

- UPDATE -

我已根据@Rick建议更新了代码

[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="" />

我仍有同样的问题。

9 个答案:

答案 0 :(得分:34)

2012年7月9日更新 - 看起来这已在RTM中修复。

  1. 我们已经暗示^$,因此您无需添加它们。 (包含它们似乎不是问题,但你不需要它们)
  2. 这似乎是ASP.NET MVC 4 / Preview / Beta中的一个错误。我已经开了一个bug
  3. 查看来源显示以下内容:

    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
    

    看起来我们是双重编码。

答案 1 :(得分:10)

尝试转义这些字符:

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

答案 2 :(得分:5)

在表达式开头尝试@符号。所以你不需要输入转义字符只需复制粘贴“”中的正则表达式并放入@符号。像这样:

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

答案 3 :(得分:1)

您使用的浏览器是什么?我输入了您的示例并尝试了IE8和Chrome,当我输入值Sam's

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

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

答案 4 :(得分:1)

过去我们遇到过类似的问题(如TweeZz所述)。 在我们的例子中,我们通过构建MvcHtmlString的自定义htmlHelper扩展方法控制TextBoxFor的输出,我们需要在一步中添加这些不显眼的验证属性,这是通过

完成的。
var attrs = htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata)

调用此方法后,属性是html编码的,所以我们只检查那里是否有正则表达式验证器,如果有,我们html取消对该属性的编码,然后将它们合并到tagBuilder中(用于构建“输入”标签)

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

我们只关心&amp;放大器,这就是为什么这个字面替换

答案 5 :(得分:1)

这对我有用,请尝试

[RegularExpression("^[a-zA-Z &\-@.]*$", ErrorMessage = "--Your Message--")]

答案 6 :(得分:0)

尝试将ASCII代码用于这些值:

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

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

答案 7 :(得分:0)

问题是正则表达式模式是HTML编码两次,一次是在构建正则表达式时,一次是在视图中呈现时。

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

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

答案 8 :(得分:0)

Try this one in model class

    [Required(ErrorMessage = "Enter full name.")]
    [RegularExpression("([A-Za-z])+( [A-Za-z]+)", ErrorMessage = "Enter valid full name.")]

    public string FullName { get; set; }