2013-06-04 47 views
2

有沒有辦法使用格式化字符串,而不是直接固定到一組數據註解的消息,的String.format在數據註釋驗證屬性

我需要設置必填字段的ErrorMessage像下面的代碼,但它給了我一個錯誤。

[Required(ErrorMessage = string.Format(SystemMessages.Required, "First Name"))] 
public string FirstName { get; set; } 

SystemMessages是一個常數文件,它下面的代碼,

public const string Required = "{0} is required."; 

有什麼辦法來設置這樣的屬性?

回答

2

string.Format結果不是編譯時間常量,不能由編譯器進行評估。屬性值僅限於

常量表達式,typeof表達式或屬性參數類型的數組創建表達式。

更正式地,您可以在msdn找到限制的說明。格式化字符串不符合其中任何一個,它們是:

  • 簡單類型(布爾,字節,焦炭,短,整型,長整型,浮點,以及雙)
  • 的System.Type
  • 枚舉
  • 對象(的參數類型的對象的屬性參數必須是上述類型的酮的恆定值。)上述任何類型的
  • 一維陣列

在最好的情況,你可以嘗試類似的東西:

[Required(ErrorMessage = "First Name" + Required)] 
public string FirstName { get; set; } 


public const string Required = " is required."; 
2

只需使用DisplayAttribute,如果你想輸出的顯示名稱,而不是屬性名稱:

[Required] 
[Display(Name = "First Name")] 
public string FirstName { get; set; } 
2

請執行IValidatableObject其使用Validate方法。它看起來像:

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     var memberNames = new List<string>(); 
     if (string.IsNullOrEmpty(this.FirstName) 
     { 
      memberNames.Add("FirstName"); 
      yield return new ValidationResult(string.Format(Resources.Required, "First Name"), memberNames); 
     } 
    } 

如果不清楚,請只閱讀有關IValidatableObject。祝你好運!

+0

好的解決方案,但我認爲沒有辦法做'IValidatableObject'遠程驗證 –

+0

我很高興這是有幫助的。 '遠程'驗證是什麼意思? –

+0

您可以通過ajax請求放置'Remote'數據註釋來驗證字段。但在這種情況下似乎是不能做 –