2017-08-25 141 views
0

我已經創建了一個自定義的ASP.NET MVC ValidationAttribute,並且試圖通過將一個字符串傳遞給基礎構造函數來在實例化時爲其設置自己的默認錯誤消息:爲自定義ASP.NET MVC驗證屬性設置默認的ErrorMessage

public class BusinessLogicRegex : ValidationAttribute, IClientValidatable 
{ 
    private const string _defaultErrorMessage = "Invalid Password. {0}"; 
    private string _description; 
    //Other private members 
    ... 

    public BusinessLogicRegex(string getMember, Type getMemberType, string descriptionMember, Type descriptionMemberType) 
     : base(_defaultErrorMessage) 
    { 
     //Omitted the guts of initializing validation for brevity 
     ... 
    } 

    public override string FormatErrorMessage(string name) 
    { 
     return String.Format(ErrorMessage, _description); 
    } 
} 

但是,當調用FormatErrorMessage時,ErrorMessage爲null。爲什麼base(_defaultErrorMessage)這個base(_defaultErrorMessage)沒有設置ErrorMessage屬性,我應該如何設置它,同時仍然給這個屬性的用戶覆蓋它的能力?

編輯 - 2,清潔例子:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] 
public class TestValidator : ValidationAttribute 
{ 
    public TestValidator() 
     : base("Test Error on {0}") 
    { 
    } 

    public override string FormatErrorMessage(string name) 
    { 
     return String.Format(ErrorMessage, name); 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     return new ValidationResult(FormatErrorMessage(validationContext.DisplayName)); 
    } 
} 

在這裏,FormatErrorMessage拋出一個空引用異常,因爲ErrorMessage爲空。但是ErrorMessageString ==「在{0}上測試錯誤」。所以我的錯誤似乎認爲調用base("Test Error on {0}")設置ErrorMessage屬性。我根本不明白這一點。在此基礎構造如何描述其errorMessage參數:

錯誤信息與驗證控件

這裏關聯是什麼MSDN說對ErrorMessageString屬性:

錯誤信息字符串是通過評估ErrorMessage屬性或通過評估ErrorMessageResourceType和ErrorMessageResourceName屬性獲得的。這兩種情況是相互排斥的。如果要顯示本地化的錯誤消息,則使用第二種情況。

然而FormatErrorMessage內運行時,ErrorMessageErrorMessageResourceTypeErrorMessageResourceName均爲空。所以這個描述聽起來像ErrorMessageString也應該爲null。這讓我對所有這些屬性和構造函數之間的使用和交互感到困惑。

+0

它應該是'返回的String.Format(ErrorMessageString,名);' –

+0

不,我娃nt在那裏顯示_description。我應該把'name'放在默認的消息中。但它是'ErrorMessage',它是null。 – xr280xr

+0

這正是將要做的事!試試吧 –

回答

0

所以我看着源代碼,我明白了爲什麼它很混亂。 ValidationAttribute類維護一個私有的_defaultErrorMessage字段。當我調用base(errorMessage)時,它會將我的字符串作爲lambda轉發給構造函數,該構造函數接受Func<string> errorMessageAccessor並將其設置爲專用的_errorMessageResourceAccessor字段。該ErrorMessageString吸氣首先調用名爲SetupResourceAccessor方法,其中它確定是否使用

ErrorMessage屬性由似乎只能由ErrorMessage屬性setter設置一個私人_errorMessage領域的支持。如果_errorMessageResourceAccessor爲空(它不在我的情況中,因爲我將其設置在基礎構造函數中),則此方法將決定是否將_errorMessageResourceAccessor設置爲默認錯誤消息,本地化資源消息或ErrorMessage屬性。 但是,如果它不爲空,則會將_errorMessageResourceAccessor設置爲其當前值。這就是我遇到的情況。最後,ErrorMessage屬性由似乎只由ErrorMessage setter設置的_errorMessage字段支持。如果沒有明確設置ErrorMessage,則獲取方將返回默認錯誤消息。一旦調用者被調用,它將清除_errorMessageResourceAccessor

所以試圖總結一下,調用ErrorMessage會給你明確設置的錯誤信息或默認的錯誤信息(我實際上不知道它在哪裏設置,也許是通過繼承類?)。調用ErrorMessageString會給你在什麼看起來是presedence順序如下消息:如果沒有其他設置

  • 默認的錯誤消息
  • 構造的errorMessage字符串
  • 從ErrorMessageResourceName
  • 本地化的值,如果它和ErrorMessageResourceType是設置
  • 將明確設置的ErrorMessage