2

我将一个项目从 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。有没有人遇到过这个?

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

谢谢!

4

2 回答 2

2

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

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

然后在全局 asax.cs 中注册 Application start 如下

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

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

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

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

于 2013-05-01T18:06:48.297 回答
1

我发现为了让 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 = "###-##-####"
    }
)
于 2013-05-02T14:55:06.463 回答