【问题标题】:RegularExpression validator encoding regex < & > symbols as &lt; &gt;, causing jQuery validation to fail正则表达式验证器将正则表达式<&>符号编码为<>,导致jQuery验证失败
【发布时间】:2012-05-25 07:06:09
【问题描述】:

当 MVC 将代码写入客户端时,我从 MVC 的 [RegularExpression] 验证器中获取了一个 HTML 编码值。这不是错误消息的问题(因为它应该被编码以供以后显示),但它确实搞砸了正则表达式:) 在字符串字段上,我的正则表达式如下所示:

[RegularExpression(@"^[^\<\>]*$", ErrorMessage = "May not contain <,>")]

当它被 mvc3 写出时,它看起来像这样:

<input ... data-val-regex-pattern="^[^\&amp;lt;\&amp;gt;]*$" 
           data-val-regex="May not contain &amp;lt;,&amp;gt;" .../>

编辑:

  • 由于编码的原因,它也捕捉到了&lt;&gt;,但也被以下词语绊倒:
  • t 喜欢蒂姆
  • g像山羊
  • 可能是;,但我没有测试过

这个正则表达式的目的是过滤掉 ,而不是禁用页面上的所有验证并在服务器端执行它。该字段接受多种 unicode 语言,并且只有 12 个字符长。

我的选择如下:

  1. 在一页上禁用 asp.net 输入完整性检查并仅在操作中进行检查
  2. 找到一个复杂的正则表达式来匹配 3+ 个 unicode 范围 +/- 破折号和数字 - .net + js compat。
  3. 编写一个没有客户端验证的自定义正则表达式验证器
  4. 使用[Remote] 验证器在服务器端进行验证,就像我们对其他字段所做的那样

我现在倾向于#3,但我真的很想找到一种方法来保持内置功能。有什么办法可以禁用此输出转义?

【问题讨论】:

  • 你也可以使用远程验证来做到这一点
  • 是的,当然。虽然对于正则表达式来说似乎有点过分,但它应该在可能的解决方案列表中。

标签: jquery asp.net-mvc-3 jquery-validate


【解决方案1】:

我花了一些时间,但我发现了现在看起来很明显的东西:使用 unicode literals 而不是实际的字符 &lt;&gt;

我的正则表达式最终是这样的,并且可以在 .Net 和 JS 中使用

// \u003c = <,  \u003e = >
[RegularExpression(@"^[^\u003C\u003E]*$", ErrorMessage = "...")]

我最终得到了一个自定义验证属性,以防止该代码无处不在。更好的是这个正则表达式的自定义“默认”对象适配器和自定义 jquery 验证,从而允许附加格式的第二个正则表达式。再工作一天。这是自定义类和验证:

正则表达式属性的自定义子类:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class RegexUnsafeChars : RegularExpressionAttribute
{
    public RegexUnsafeChars() : base(@"^[^\u003C\u003E]*$")
    {
        base.ErrorMessage = "May not contain <,>";
    }
}

因为这是一个自定义属性,并且提供者只检查精确匹配,我们需要手动声明适配器。值得庆幸的是,我们可以重用内置的正则表达式。将此代码添加到Application_Start()Global.asax.cs

DataAnnotationsModelValidatorProvider.RegisterAdapter(
            typeof(RegexUnsafeChars), 
            typeof(RegularExpressionAttributeAdapter));

【讨论】:

    【解决方案2】:

    jQuery 验证应该可以正常工作,并且在我测试时确实可以正常工作。这些值已正确编码。

    型号:

    public class MyViewModel
    {
        [DataType(DataType.MultilineText)]
        [RegularExpression(@"^[^\<\>]*$", ErrorMessage = "May not contain <,>")]
        public string Text { get; set; }
    }
    

    控制器:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            var model = new MyViewModel();
            model.Text = "<Hello";
            return View(model);
        }
    
        [HttpPost]
        public ActionResult Index(MyViewModel model)
        {
            return View(model);
        }
    }
    

    查看:

    @model MyViewModel
    
    <script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
    
    @using (Html.BeginForm())
    {
        @Html.EditorFor(x => x.Text)
        @Html.ValidationMessageFor(x => x.Text)
        <button type="submit">OK</button>
    }
    

    结果:

    不显眼的客户端验证工作正常。

    【讨论】:

    • 什么是 jquery.validate.unobtrusive.js
    • 这是一个 Microsoft 脚本,用于解释输入字段中包含的 HTML5 data-* 属性(请参阅 OP 的标记)并将它们转换为 jquery.validate 规则。基本上,数据注释属性在相应的输入字段上发出 data-* 属性,并且在客户端上执行不显眼的客户端验证。它是 ASP.NET MVC 3 中的默认模型。
    • 你能告诉我你那个标签的 HTML 吗?它还针对 进行了正确验证,但由于编码的原因,我在 lgt 上失败(加上 ;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多