2017-08-25 18 views
0

カスタムASP.NET MVC ValidationAttributeを作成しましたが、インスタンス生成時にベースコンストラクタに文字列を渡すことで独自のデフォルトエラーメッセージを設定しようとしています:カスタムASP.NET MVC ValidationAttributeのデフォルト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)がErrorMessageプロパティを設定していないのですが、この属性のユーザーにそれを上書きする機能を与えたまま、どのように設定する必要がありますか?

編集 - 2、クリーナ例:ErrorMessageがヌルであるため、ここで

[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はnull参照例外をスロー。しかし、ErrorMessageString == "{0}のテストエラー"。だから私の間違いは、base("Test Error on {0}")がErrorMessageプロパティを設定していると考えることにあるようです。私はこれを全く理解していません。基本コンストラクタはそのerrorMessageパラメータの記述方法をここに:

ここで検証コントロールで

を関連付けるエラーメッセージがMSDNがErrorMessageString財産についてこう言われる、

エラーメッセージ文字列は、ErrorMessageプロパティを評価するか、ErrorMessageResourceTypeプロパティとErrorMessageResourceNameプロパティを評価することによって取得されます。この2つのケースは互いに排他的です。 2番目のケースは、ローカライズされたエラーメッセージを表示する場合に使用されます。実行時にFormatErrorMessageの内側しかし

ErrorMessageErrorMessageResourceTypeErrorMessageResourceNameはすべてnullです。だからその説明は、私にはnullでなければならないErrorMessageStringのように聞こえるようになります。これは、これらすべてのプロパティとコンストラクタの間の使い方や相互作用について私に非常に混乱させます。

+0

;' –

+0

いいえ、私はワシントン州_descriptionを表示するにはntを押します。私は 'name'をデフォルトのメッセージのどこかに置くべきです。しかし、それは 'ErrorMessage'がnullです。 – xr280xr

+0

それはまさにそれがすることです!試してみてください –

答えて

0

私はソースコードを見て、なぜそれが混乱しているのか分かります。 ValidationAttributeクラスは、独自のprivate _defaultErrorMessageフィールドを保持します。私がbase(errorMessage)を呼び出すと、ラムダとして文字列をコンストラクタに転送し、Func<string> errorMessageAccessorを受け取り、プライベート_errorMessageResourceAccessorフィールドに設定します。 ErrorMessageStringゲッターは最初、それはErrorMessageプロパティのみErrorMessageプロパティのセッターで設定されているように見える民間_errorMessageフィールドでサポートされてい

を使用するかどうかを判断しSetupResourceAccessorという名前のメソッドを呼び出します。 _errorMessageResourceAccessorがnull(これは私の場合はベースコンストラクタで設定しているためそうではない)の場合、このメソッドは_errorMessageResourceAccessorを既定のエラーメッセージ、ローカライズされたリソースメッセージ、またはErrorMessageプロパティに設定するかどうかを決定します。 ただし、nullでない場合、_errorMessageResourceAccessorは現在の値に設定されます。これは私が打っている場合です。最後に、ErrorMessageプロパティは、ErrorMessageセッターによってのみ設定されるように見える_errorMessageフィールドによってサポートされています。 ErrorMessageが明示的に設定されていない場合、ゲッターはデフォルトのエラーメッセージを返します。 setterが呼び出されると、_errorMessageResourceAccessorがクリアされます。

ErrorMessageを呼び出すと、明示的に設定されたエラーメッセージまたはデフォルトのエラーメッセージが表示されます(実際にはどこに設定されているのか分かりません)。それとErrorMessageResourceTypeであれば他に何も

  • コンストラクタにErrorMessage列にErrorMessageResourceNameから
  • ローカライズされた値に設定されていない場合

    • デフォルトのエラーメッセージ:ErrorMessageStringを呼び出すと、あなたのpresedenceの次の順序になりそうだ何でメッセージを表示しますそれは、String.Formatの(ErrorMessageString、名前を)返す `でなければなりません設定
    • 明示的に設定にErrorMessageは
  • 関連する問題