カスタム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の内側しかし
、ErrorMessage
、ErrorMessageResourceType
とErrorMessageResourceName
はすべてnullです。だからその説明は、私にはnullでなければならないErrorMessageString
のように聞こえるようになります。これは、これらすべてのプロパティとコンストラクタの間の使い方や相互作用について私に非常に混乱させます。
;' –
いいえ、私はワシントン州_descriptionを表示するにはntを押します。私は 'name'をデフォルトのメッセージのどこかに置くべきです。しかし、それは 'ErrorMessage'がnullです。 – xr280xr
それはまさにそれがすることです!試してみてください –