3

ModelState オブジェクトのカルチャを制御できるかどうかは誰にもわかりませんが、サイトにアクセスしたサブドメインに基づいて言語が設定されている多言語アプリケーションで問題に直面しています。例:

italia.domain.com - 「カルチャをイタリア語に変更します」

german.domain.com - 「カルチャをドイツ語に変更します」

問題は、フォームを送信するときの ModelState オブジェクトの言語が、現在のスレッド カルチャではなく、クライアント ブラウザによって制御されているように見えることです。

そのため、この動作を変更またはオーバーライドして、イタリア語のサブドメインの言語が常にクライアント ブラウザーの言語ではなくイタリア語になるようにするソリューションを探しています。

編集

サブドメインに基づいて言語を変更する部分をすでに作成しました。

var HttpHost = HttpContext.Request.ServerVariables["HTTP_HOST"];
var _hostname = (HttpHost.Split(':').Length > 1) ? HttpHost.Substring(0, HttpHost.IndexOf(':')) : HttpHost;

var allowedHostnames = "italiansubdomain.domain.com|it,frenchsubdomain.domain.com|fr,germansubdomain.domain.com|de,englishsubdomain.domain.com|en".Split(',');
foreach (var hostname in allowedHostnames)
{
    if (hostname.StartsWith(_hostname.ToLower()))
    {
        var lang = hostname.Split('|').Last();
        if (lang == "en") lang = "uk";
        // Updates the cultures for the dynamic language
        var ci = new CultureInfo(lang);
        System.Threading.Thread.CurrentThread.CurrentCulture = ci;
        System.Threading.Thread.CurrentThread.CurrentUICulture = ci;
    }
}

したがって、私の問題は、次のように Modelstate 検証を使用する場合です。

public class Email {
    [Required(ErrorMessageResourceName = "validation_required", ErrorMessageResourceType = typeof(Resources.Master)), StringLength(50, MinimumLength = 2, ErrorMessageResourceName = "validation_string_length_2_50", ErrorMessageResourceType = typeof(Resources.Master))]
    public string SenderName { get; set; }
    [Required(ErrorMessageResourceName = "validation_required", ErrorMessageResourceType = typeof(Resources.Master)), Email(ErrorMessageResourceName = "validation_email_invalid", ErrorMessageResourceType = typeof(Resources.Master))]
    public string SenderEmail { get; set; }
    [Required(ErrorMessageResourceName = "validation_required", ErrorMessageResourceType = typeof(Resources.Master)), StringLength(50, MinimumLength = 2, ErrorMessageResourceName = "validation_string_length_2_50", ErrorMessageResourceType = typeof(Resources.Master))]
    public string ReceiverName { get; set; }
    [Required(ErrorMessageResourceName = "validation_required", ErrorMessageResourceType = typeof(Resources.Master)), Email(ErrorMessageResourceName = "validation_email_invalid", ErrorMessageResourceType = typeof(Resources.Master))]
    public string ReceiverEmail { get; set; }
    public string Comment { get; set; }
}

そして、モデル状態の検証部分のチェック:

if (!ModelState.IsValid) {
  var keys = ModelState.Keys.ToList();
  var values = ModelState.Values.ToList();

  for (var i = 0; i < keys.Count; i++)
  {
      var value = values[i];
      if (value.Errors.Count > 0)
      { 
          response.AddError(keys[i], value.Errors[0].ErrorMessage);
      }
  }
}

次に、Ajax Response の結果を介してエラーにアクセスするか、ブラウザの言語設定に基づいてエラー メッセージを受け取ってデバッグするだけで、現在アクティブな言語に変更したいところです。

編集

前もって感謝します、bsthomsen

4

4 に答える 4

3

カルチャが変更されているコードをController.OnActionExecutingからController.ExecuteCoreに移動することで、これを解決しました。

于 2012-08-08T07:16:58.170 に答える
0

私は、まったく同じではないが似たような状況に取り組んできました。現在のスレッドの UICulture を特定の言語に設定できるはずであり、期待どおりに動作するはずです。したがって、リクエストの送信先のサブドメインを特定し、それに応じてカルチャを設定します。詳細: http://msdn.microsoft.com/en-us/library/system.threading.thread.currentuiculture.aspx

于 2012-08-07T17:38:17.553 に答える
0

各リクエストのカルチャを簡単にオーバーライドできますGlobal.asax.cs

あなたの場合、着信 URL を確認し、それに応じてカルチャを設定できます。

protected void Application_AcquireRequestState(object sender, EventArgs e)
{
     //Create culture info object 
     CultureInfo ci = new CultureInfo("en");

     if(Request.Url.Host.Equals("italia.domain.com",
                                    StringComparison.InvariantCultureIgnoreCase))
     {
          ci = new CultureInfo("it");
     }

     System.Threading.Thread.CurrentThread.CurrentUICulture = ci;
     System.Threading.Thread.CurrentThread.CurrentCulture =
                                      CultureInfo.CreateSpecificCulture(ci.Name);
}
于 2012-08-07T17:43:36.467 に答える
0

この libk は、方法: ASP.NET Web ページのグローバリゼーションのカルチャと UI カルチャを設定するのに役立ちます。

グローバリゼーション セクションを Web.config ファイルに追加する

<globalization uiCulture="es" culture="es-MX" />

InitializeCultureまたはプログラムで、ページ (Web フォーム)のメソッドをオーバーライドします。

protected override void InitializeCulture()
{

        UICulture = selectedLanguage ;
        Culture = selectedLanguage ;

        Thread.CurrentThread.CurrentCulture = 
            CultureInfo.CreateSpecificCulture(selectedLanguage);
        Thread.CurrentThread.CurrentUICulture = new 
            CultureInfo(selectedLanguage);

    base.InitializeCulture();
}

または、この質問を見てASP.Net MVC アプリでカルチャーを設定する

于 2012-08-07T17:34:51.500 に答える