【问题标题】:Define Regular Expression Validation for custom DataType in MVC4在 MVC4 中为自定义 DataType 定义正则表达式验证
【发布时间】:2013-05-01 17:55:09
【问题描述】:

我将一个项目从 MVC3 升级到 MVC4,并注意到我的一个验证器不再触发。我将其追踪到 Shared/EditorTemplates 文件夹中的自定义 DataType,该文件夹用于在整个站点中以各种形式捕获社会安全号码。 (我们只在保存后加载页面时显示最后 4 位数字,以解释正则表达式。)

SSN.cshtml

@{
    var ssn = (string)ViewData.TemplateInfo.FormattedModelValue;
    if (!String.IsNullOrWhiteSpace(ssn)){
        ssn = "###-##-" + Model.Substring(Model.Length - 4, 4);
    }
}
@Html.TextBox("", ssn, new { @class = "text-box single-line ssn", pattern = @"^(\d{3}|###)-(\d{2}|##)-\d{4}$", placeholder = "###-##-####", title = "Expected pattern is ###-##-####" })

似乎在 MVC4 中,不显眼的验证想要寻找 data-val-regex-pattern 作为呈现文本框的属性,而不仅仅是 pattern。有没有人遇到过这种情况?

注意:我想保留自定义数据类型的验证,因此我不必总是记得将其添加到每个模型中。

谢谢!

【问题讨论】:

    标签: regex validation asp.net-mvc-4


    【解决方案1】:

    您可以拥有自己的自定义验证器并将其放入模型属性中。这是一个例子

    public class SocialSecurityAttribute : RegularExpressionAttribute
    {
        public SocialSecurityAttribute () : base(@"^(\d{3}|###)-(\d{2}|##)-\d{4}$") { }
    }
    

    然后在全局 asax.cs 中注册应用启动如下

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

    当你使用它时,它就像任何其他内置属性一样

    [SocialSecurity(ErrorMessage ...)]
    public string SocialSecurityNumber{get;set;}
    

    我喜欢这样实现,因为代码可以重复使用。否则,您可以使用 RegularExpressionAttribute 传递正则表达式

    【讨论】:

    • 执行此操作时,客户端不显眼的验证是否仍然有效?
    • 虽然这样可行,但我仍然必须将其添加到使用此数据类型的所有模型中。我希望在渲染时将该数据属性添加到输入中。
    【解决方案2】:

    我发现为了让 MVC4 将正确的数据属性呈现给输入字段,我需要将传递给 TextBox 帮助器的匿名对象中的连字符替换为下划线。这是我最终得到的代码:

    SSN.cshtml

    @{
        var ssn = (string)ViewData.TemplateInfo.FormattedModelValue;
        if (!String.IsNullOrWhiteSpace(ssn) && ssn.Length == 11)
        {
            ssn = "###-##-" + Model.Substring(Model.Length - 4, 4);
        }
        else {
            ssn = "";
        }
    }
    @Html.TextBox("", ssn,
        new
        {
            @class = "text-box single-line ssn",
            data_val = "true",
            data_val_regex_pattern = @"^(\d{3}|###)-(\d{2}|##)-\d{4}$",
            data_val_regex = "Expected pattern is ###-##-####",
            placeholder = "###-##-####"
        }
    )
    

    【讨论】:

      猜你喜欢
      • 2014-02-07
      • 1970-01-01
      • 2023-02-04
      • 1970-01-01
      • 2016-01-22
      • 2013-10-17
      • 2016-04-25
      • 2011-12-02
      相关资源
      最近更新 更多