我将一个项目从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 作为渲染文本框的属性,而不仅仅是模式。有没有人遇到过这个?
注意:我希望对自定义数据类型进行验证,因此我不必总是记得将其添加到每个模型中。
谢谢!
答案 0 :(得分:2)
您可以拥有自己的自定义验证器并将其放入模型属性中。这是一个例子
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传递正则表达式
答案 1 :(得分: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 = "###-##-####"
}
)