2010-12-06 35 views
2

おはよう!デフォルトを変更する「{0}フィールドは必須です」(究極の解決策?)

私は、ログインフォームに使用する次のViewModelクラスました:Global.asax

using System.ComponentModel.DataAnnotations; 

... 

public class UserLogin : IDataErrorInfo 
{   
    [Required] 
    [DisplayName("Login")] 
    public string Login { get; set; } 

    [Required] 
    [DisplayName("Password")] 
    public string Password { get; set; } 

    [DisplayName("Remember Me")] 
    public bool RememberMe { get; set; } 

    #region IDataErrorInfo Members 

    // This will be a Model-level error 
    public string Error 
    { 
     get 
     { 
      if (!WebUser.CanLogin(Login, Password)) 
      { 
       return Resources.ValidationErrors.InvalidLoginPassword; 
      } 
      else 
      { 
       return String.Empty; 
      } 
     } 
    } 

    // All is handled by DataAnnotation attributes, just a stub for interface 
    public string this[string columnName] 
    { 
     get 
     { 
      return string.Empty; 
     } 
    } 
    #endregion 

} 

そして、この:

DefaultModelBinder.ResourceClassKey = "BinderMessages"; 
ValidationExtensions.ResourceClassKey = "BinderMessages"; 

リソースファイルBinderMessages.resxは内側に(それは二つの鍵InvalidPropertyValueがありApp_GlobalResourcesされます)と私にはデフォルトのメッセージを与えるPropertyValueRequiredが動作します。

質問:このメッセージを変更することはできますか、それともDataAnnotationsに関連付けられていますか?

私はこれについて多くの記事を見つけましたが、解決策はありません。今の私はこれにフォールバック:

[Required(ErrorMessageResourceType = typeof(Resources.ValidationErrors), ErrorMessageResourceName = "Required")] 
+0

問題を、あなたがログインとパスワードを空白のままにした場合は何ですか?プログラムは、オブジェクトが設定されていない状態で中止されます。 – Fandango68

+0

どうしてそう思うのですか?モデルバインダーは、とにかく 'UserLogin'オブジェクトインスタンスをインスタンス化します。 – artvolk

+0

ほぼ5年で、まだ適用されないようです。 'global.asax'で定義されたリソースファイルで使用できるキーは4つしかありません – mcy

答えて

6

あなたはRequiredAttributeを拡張し、そこに値を設定するカスタムValidationAttributeを作成することができます。次のようなもの:

public class MyRequiredAttribute : RequiredAttribute 
{ 
    public MyRequiredAttribute() 
    { 
     ErrorMessageResourceType = typeof(Resources.ValidationErrors); 
     ErrorMessageResourceName = "Required"; 
    } 
} 

次に、カスタム属性でモデルを飾ります。

デフォルトのメッセージは、リソースファイル内のDataAnnotationsアセンブリにSystem.ComponentModel.DataAnnotations.Resources.DataAnnotationsResources.resourcesでコンパイルされ、RequiredAttribute_ValidationError=The {0} field is required.です。あなたの質問に答えるために、はい、そのメッセージはDataAnnotationsの一部です。

編集:PropertyValueRequiredは、NULL値の型がnullでない場合のエラーに使用されます。以下に述べるように、型変換エラーにはPropertyValueInvalidが使用されます。

+0

これは私よりもはるかに優れた解決方法です(本当に' ActionFilterAttribute'とデータアノテーションattriubeを意味しますか?) 。なぜそれが働かないのか知ることは可能ですか? – artvolk

+0

おっと、そうです。申し訳ありません。私はValidationAttributeを意味しました。編集されました。 – bmancini

+0

小文字: 'InvalidPropertyValue'は、オブジェクトフィールド(変換エラー)に値をバインドできないときに呼び出されます。たとえば、文字列値をintモデルフィールドにバインドできないとき、それは検証の前に起こります。 – artvolk

1

シングルトンクラスを使用して翻訳を提供するアプローチを行ってきました。 @bmanciniの示唆どおり、すべての属性を引き出す必要があります。私のアプローチでは、他のロジックを変更することなく、複数の文字列テーブル(または翻訳ソースの切り替え)を使用できるという利点があります。

私のブログのエントリがかなり大きいので、私はただのリンクを提供します:しかし左 http://blog.gauffin.org/2010/11/simplified-localization-for-dataannotations/

関連する問題