2012-04-25 9 views
8

モデルオブジェクトのプロパティをRequired属性で修飾し、ErrorMessageまたはResourceType/Nameを指定しないと、補完された形式の「{0}フィールドは必須です」というメッセージが表示されます。パラメータ0は、そのプロパティの属性はDisplayNameです。MVC3:汎用[必須]検証メッセージテキストを変更するには?

デフォルトの文字列を別のものに変更したいのですが、モデルオブジェクトのすべてのプロパティに対してErrorMessageまたはResourceType/Nameを指定したくありません。デフォルトの文字列はどこに保存されていますか?どのように変更できますか?

答えて

6

は、公正オプションであり、おそらく始めるために最低のオーバーヘッドがありますが、戻って[Required]の既存のすべての用途を変更する必要があります。あなた(そしてあなたのチームの他の人)も、今後の正しい使用方法を覚えておく必要があります。

代わりに、ModelMetadataProvidersModelValidatorProvidersをリソースファイルの文字列を返すように置き換えることができます。これは上記の欠点を回避する。また、メッセージを他の属性(例えば、MaxLengthAttribute)に置き換え、追加の言語をサポートするための基礎を築いています。ここ

protected void Application_Start() 
{ 
    var stringProvider = new ResourceStringProvider(Resources.LocalizedStrings.ResourceManager); 
    ModelMetadataProviders.Current = new LocalizedModelMetadataProvider(stringProvider); 
    ModelValidatorProviders.Providers.Clear(); 
    ModelValidatorProviders.Providers.Add(new LocalizedModelValidatorProvider(stringProvider)); 
} 

は、完全sourcedocumentation、および使用方法を説明するblog post

6

RequiredAttributeの派生クラスを作成し、FormatErrorMessageメソッドをオーバーライドしようとしましたか?これは動作するはずです:自分の属性を導出

public class MyRequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute 
{ 
    public override string FormatErrorMessage(string name) 
    { 
     return base.FormatErrorMessage(string.Format("This is my error for {0}", name)); 
    } 
} 
+0

はい、DisplayNameが既に定義されているので、明示的に渡すのではなく、 'MyRequiredAttribute'コンストラクタの' DisplayName'メタデータプロパティを読んでください。 –

+1

以下のリンクに従って、 'name'パラメータは、フォーマットされたメッセージに含まれる名前です.hms://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.validationattribute.formaterrormessage。 aspx – Joshua

関連する問題