1

私は mvc4 でアプリケーションを開発しています。アプリケーションを英語とロシア語で動作させたいです。ロシア語のタイトルを取得しましたが、エラー メッセージは英語のままです。

私のモデルには以下が含まれます:-

 [Required(ErrorMessageResourceType = typeof(ValidationStrings),
              ErrorMessageResourceName = "CountryNameReq")]            
    public string CountryName { get; set; }

(ModelState.IsValid) が false になると、GetErrorMessage() に移動します

public string GetErrorMessage()
    {  
       CultureInfo ci = new CultureInfo(Session["uiCulture"].ToString());

        System.Threading.Thread.CurrentThread.CurrentUICulture = ci;

        System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ci.Name);          
    string errorMsg = string.Empty;
    int cnt = 1;
    var errorList = (from item in ModelState
                   where item.Value.Errors.Any()
                   select item.Value.Errors[0].ErrorMessage).ToList();                                                 

        foreach (var item in errorList)
        {
            errorMsg += cnt.ToString() + ". " + item + "</br>";
            cnt++;
        }
        return errorMsg;
    }

しかし、常に英語でエラー メッセージが表示されます。コードをカスタマイズして現在のカルチャを取得するにはどうすればよいですか。

4

1 に答える 1

3

その理由は、文化の設定が遅すぎるためです。コントローラー アクション内で設定していますが、コントローラー アクションが実行を開始するよりもずっと前に、検証メッセージがモデル バインダーによって追加されました。そしてその段階では、現在のスレッド カルチャはまだ既定のものでした。

これを実現するには、実行パイプラインのかなり早い段階でカルチャを設定する必要があります。たとえば、あなたのApplication_BeginRequestメソッド内でそれを行うことができますGlobal.asax

そのように:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    CultureInfo ci = new CultureInfo(Session["uiCulture"].ToString());
    System.Threading.Thread.CurrentThread.CurrentUICulture = ci;
    System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ci.Name);
}
于 2013-02-27T15:07:06.417 に答える