1

私は現在、2 つの言語をサポートする必要があるMVC4アプリケーションに取り組んでいます。次の形式のリソースでDataAnnotationsを使用しています。

public class SignupModel
{
    [Required(ErrorMessageResourceName = "Registration_ValidEmailRequired", ErrorMessageResourceType = typeof(Validation))]
    [Email(ErrorMessageResourceName = "Registration_ValidEmailRequired", ErrorMessageResourceType = typeof(Validation))]
    public string Email { get; set; }

    [Required(ErrorMessageResourceName = "Registration_PasswordRequired", ErrorMessageResourceType = typeof(Validation))]
    [StringLength(100, MinimumLength = 8, ErrorMessageResourceName = "Registration_PasswordInvalidLength", ErrorMessageResourceType = typeof(Validation))]
    [DataType(DataType.Password)]
    public string Password { get; set; }
}

存在する場合は言語 Cookie を読み取り、それに応じて現在のカルチャuicultureを設定するグローバル アクション フィルターを作成しました。Cookie が存在しない場合は、現在のカルチャで Cookie を作成します。これは、フィルターでOnActionExecutingがどのように見えるかです。

public void OnActionExecuting(ActionExecutingContext filterContext)
{
    var langCookie = GetOrSetLanguageCookie(filterContext.HttpContext);
    var culture = new CultureInfo(langCookie.Value);

    Thread.CurrentThread.CurrentCulture = culture;
    Thread.CurrentThread.CurrentUICulture = culture;
}

これが発生する場合を除いて、すべてが期待どおりに機能します。

  1. HTML フォーム (たとえば、クライアント側の検証がないホームの凝ったサインアップ フォームとしましょう。その凝ったレイアウトは壊れていません) から Home コントローラーの Signup アクションに投稿します。
  2. 投稿されたデータにエラーがある場合は、現在のカルチャに一致する言語で表示されます。(素晴らしく、期待されています)。
  3. 実際にサーバーにポストバックするクライアントで有効にしたドロップダウンを使用して、言語を変更します。(ここではまだPRGパターンを実装していないため、同じデータが再投稿されているという警告が表示されます)。
  4. ビューは選択した言語でレンダリングされますが、検証メッセージは最初と同じ言語のままです。

言語切り替えを処理するアクション フィルターをデバッグすると、ModelState が元の言語でエラーを保持していることがわかるので、検証はサーバーで 1 回だけ行われると思います。ModelState を消去して検証を強制する必要があると思いますが、これがハックなのか、この問題に対処するためのより良い方法があるのか​​ 疑問に思っていました。

ありがとう!R.

4

1 に答える 1

1

Shaun Xu の投稿を読む: http://geekswithblogs.net/shaunxu/archive/2010/05/06/localization-in-asp.net-mvc-ndash-3-days-investigation-1-day.aspx

ModelBinder (検証メッセージの取得を担当) は、アクションの前およびアクションフィルターの前に実行されます。そのため、カルチャの変更は、検証メッセージのテキストが決定される前に発生し、影響を受けません。

このコードを、コントローラーの Execute や ControllerFactory の CreateController メソッドなど、以前の拡張ポイントに移動することを試みることができます。

提案された解決策についての私の質問をここで見ることができます: モデル検証エラーが表示される言語を制御する方法

于 2013-07-16T09:18:28.533 に答える