2

シナリオ:-MVC 4アプリケーションを開発しています。ウェブサイトは複数の言語で実行され、Azureでホストされます。ローカライズについては、リソースバンドルアプローチではなくデータベースに依存しています。

問題:-実行時にエラーメッセージをカスタマイズしたいのですが、データベースを介してメッセージをローカライズしたいのです。

リフレクションを使用して属性値を変更しようとしましたが、機能しませんでした。

コード:-

     //Model
      public class Home
      {
          [Required(ErrorMessage = "Hard coded error msg")]
           public string LogoutLabel { get; set; }
      } 

     //On controller
      public ActionResult Index()
    {
        Home homeData = new Home();
        foreach (PropertyInfo prop in homeData.GetType().GetProperties())
        {
            foreach (Attribute attribute in prop.GetCustomAttributes(false))
            {

               RequiredAttribute rerd = attribute as RequiredAttribute;

                if (rerd != null)
                {
                    rerd.ErrorMessage = "dynamic message";
                }
            }


        }

        return View(homeData);
    }  

クライアント側では、検証が行われると、古いメッセージ「ハードコードされたエラーメッセージ」が表示されます。リソースバンドルアプローチを使用したくない場合は、これをどのようにカスタマイズできるかを提案してください

4

2 に答える 2

1

このネストされたループを実装して、すべてのエンティティの検証メッセージをローカライズするつもりですか? いいえ、より良い解決策はValidator属性を使用していると思います。

あなたのクラスのために:

 [Validator(typeof(HomeValidator))]
 public class Home
      {              
           public string LogoutLabel { get; set; }
      }

HomeValidator を実装できます:

public class HomeValidator : AbstractValidator<Home>
    {
        public HomeValidator()
        {
            RuleFor(x => x.LogoutLabel ).NotEmpty().WithMessage("your localized message");
        }
    }
于 2012-12-20T07:45:47.073 に答える
1

エラーメッセージをオーバーライドできる独自のDataAnnotationsModelMetadataProviderを作成して登録することをお勧めします。詳細については、MVC 検証エラー メッセージが属性にハードコードされていない、同様の質問への回答を参照してください。

于 2012-12-20T10:19:58.313 に答える