2013-05-01 78 views
2

我將項目從MVC3升級到MVC4,並注意到我的一個驗證器不再觸發。我將它追溯到Shared/EditorTemplates文件夾中的一個自定義數據類型,該文件夾用於在整個網站中以各種形式捕獲社會安全號碼。 (我們只顯示在頁面後保存加載的最後4位數字,解釋正則表達式。)

SSN.cshtml爲MVC4中的自定義數據類型定義正則表達式驗證

@{ 
    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作爲渲染文本框的屬性,而不僅僅是模式。有沒有人遇到過這個?

注:我想保留自定義數據類型的驗證,所以我不必總是記得將它添加到每個模型。

謝謝!

回答

1

我發現爲了讓MVC4呈現正確的數據屬性到輸入字段,我需要用傳遞給匿名對象的下劃線替換連字符文本框助手。下面是我最終的代碼:

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 = "###-##-####" 
    } 
) 
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通過正則表達式

+0

當你做這是否客戶端不顯眼的驗證仍然有效? – 2013-05-01 19:54:47

+0

雖然這將工作,我仍然必須將其添加到所有使用此數據類型的模型。我希望在渲染時將該數據屬性添加到輸入中。 – 2013-05-01 20:00:56