3

[RegularExpression]在将代码写入客户端时,我从 MVC 的验证器中获取了一个 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;" .../>

编辑:

  • 由于编码的原因,它也很吸引人<>,但也被以下词语绊倒:
  • t像蒂姆
  • g像山羊
  • 可能;但我没有测试它

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

我的选择如下:

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

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

4

2 回答 2

4

我花了一段时间,但我发现了现在看起来很明显的东西:使用unicode literals而不是实际 characters <>

我的正则表达式最终是这样的,并且可以在 .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 <,>";
    }
}

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

DataAnnotationsModelValidatorProvider.RegisterAdapter(
            typeof(RegexUnsafeChars), 
            typeof(RegularExpressionAttributeAdapter));
于 2012-06-05T03:24:22.923 回答
0

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>
}

结果:

在此处输入图像描述

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

于 2012-05-25T07:17:48.060 回答