【问题标题】:DataAnnotations validation (Regular Expression) in asp.net mvc 4 - razor viewasp.net mvc 4中的DataAnnotations验证(正则表达式)-剃刀视图
【发布时间】:2012-01-04 21:15:25
【问题描述】:

当在正则表达式中使用特殊字符时,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; }

剃刀视图:

@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中的regex模式没有按照Model的RegularExpression中指定的方式渲染,即使输入有效数据(Sam's)也会导致错误。

我该如何处理?

--更新--

我已经按照@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="" />

我还是有同样的问题。

【问题讨论】:

  • 我们刚刚遇到了一个类似的问题,我们想要一个“ ”在 ErrorMessage 中被吐出..
  • 嗨,我是 TweeZz 的同事;] 是的,我们最终修复了它,但修复得相当粗糙。当吐出不显眼的验证属性时,我们 htmlDecoded 正则表达式验证器的所有验证消息,您可以为您的案例做同样的事情。
  • 我已经确认 MVC 3 工具更新和 MVC 4 Beta 之间存在差异。我已经打开了一个错误,我们正在调查。
  • 因为这个原因,我们现在正在将我们的主要产品回滚到 MVC3(我们进行了大量本地化,所以 á 等是双重编码的客户端对我们来说是一个很大的阻碍)。希望获得连接文章的链接,以便我们可以监控...
  • 嗨teahupoo,我们将它作为我们项目中的一个已知问题,就像微软现在正在做的那样。仍在寻找修复。让我们希望 Microsoft 尽快提供修复程序。

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


【解决方案1】:

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

看起来我们是双重编码。

【讨论】:

  • Rick,删除 ^ 和 $ 后是否修复?即使删除它们,我仍然面临同样的问题。我已经用那个实现更新了我的问题。
  • 不,它不会改变任何东西。你能把它标记为正确答案吗?
  • 瑞克,在解决这个问题之前,我不确定将其标记为答案:)
  • 我只是想向其他人指出我的答案,因为我在 Microsoft 的 MVC 团队工作并且我已经验证/注册了该错误。
  • 有类似的问题。支持,因此它在搜索中显示得更多。请告知是否有任何临时修复可用。
【解决方案2】:

尝试转义这些字符:

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

【讨论】:

  • 还是一样的结果:
  • 如果你在正则表达式中加入双 \\ 会怎样?
  • 双 \\ 或开头前面的 @ 就像 Darin 在他的示例中那样。
  • @Darin,它转换我在正则表达式中添加的任何特殊字符,就像我的问题一样。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    这个对我有用,试试这个

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

    【讨论】:

    • 如果可能,请努力提供额外的解释,而不仅仅是代码。此类答案往往更有用,因为它们可以帮助社区成员,尤其是新开发人员更好地理解解决方案的推理,并有助于避免需要解决后续问题。
    【解决方案5】:

    你用的是什么浏览器?我输入了您的示例并在 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 开发工具栏和 Chrome 开发者模式检查 DOM 时,它没有显示任何特殊字符。

    【讨论】:

    • 我在 Firefox、IE 和 chrome 中尝试过。我的应用程序是使用 asp.net mvc 4(C#) 开发的。 asp.net/mvc/mvc4
    • 如果排除不显眼的 jquery 脚本,您的验证是否正常工作?
    • 当我排除“jquery.validate.unobtrusive.min.js”时,客户端验证不起作用。
    • 在客户端不工作不会触发?还是 Sam 的验证仍然不正确?
    • 由于客户端无法正常工作,因此无法正确验证 Sam
    【解决方案6】:

    我们过去也遇到过类似的问题(如 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);
    

    我们只关心 & amps,这就是为什么这个字面替换

    【讨论】:

    • 一般来说,我们需要对某些属性 (stackoverflow.com/questions/6016500/…) 的呈现进行更多控制,因此我们决定复制粘贴(并修改)某些辅助方法的 MVC 源代码。好像没有别的办法了..
    【解决方案7】:

    尝试对这些值使用 ASCII 码:

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

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

    【讨论】:

    • 即使这样我也没有得到它:
    【解决方案8】:

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

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

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

    【讨论】:

    • 虽然我使用了@Html.Raw,但正则表达式仍以编码形式呈现。它适用于我的 ASP.NET MVC 3 应用程序,问题仅在于 MVC4 应用程序。
    • 使用@Html.Raw,正则表达式是否仍然是双重编码的?在 MVC3 中,我使用 AntiXSS 作为默认编码器。我的正则表达式被编码一次,并且没有任何问题。
    • 即使我使用@Html.Raw,它的编码也是如此。我正在使用 ASP.NET MVC 4 asp.net/mvc/tutorials/aspnet-mvc-4-mobile-features
    【解决方案9】:

    在模型类中试试这个

        [Required(ErrorMessage = "Enter full name.")]
        [RegularExpression("([A-Za-z])+( [A-Za-z]+)", ErrorMessage = "Enter valid full name.")]
    
        public string FullName { get; set; }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多