私は現在、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;
}
これが発生する場合を除いて、すべてが期待どおりに機能します。
- HTML フォーム (たとえば、クライアント側の検証がないホームの凝ったサインアップ フォームとしましょう。その凝ったレイアウトは壊れていません) から Home コントローラーの Signup アクションに投稿します。
- 投稿されたデータにエラーがある場合は、現在のカルチャに一致する言語で表示されます。(素晴らしく、期待されています)。
- 実際にサーバーにポストバックするクライアントで有効にしたドロップダウンを使用して、言語を変更します。(ここではまだPRGパターンを実装していないため、同じデータが再投稿されているという警告が表示されます)。
- ビューは選択した言語でレンダリングされますが、検証メッセージは最初と同じ言語のままです。
言語切り替えを処理するアクション フィルターをデバッグすると、ModelState が元の言語でエラーを保持していることがわかるので、検証はサーバーで 1 回だけ行われると思います。ModelState を消去して検証を強制する必要があると思いますが、これがハックなのか、この問題に対処するためのより良い方法があるのか 疑問に思っていました。
ありがとう!R.