0

言語選択機能を備えたMVC3(かみそり)アプリケーションを開発しようとしています。

_SelectCultureの部分ビューとして次のビューを使用する_Layout.cshtml

<text>
   @Html.ActionLink("English", "SetCulture", new { controller = "Culture", culture = "en-GB" })  
   | 
   @Html.ActionLink("Welsh", "SetCulture", new { controller = "Culture", culture = "cy-GB" })
</text>
<div>
    @System.Threading.Thread.CurrentThread.CurrentUICulture.ToString()
</div>

CultureController

public ActionResult SetCulture(string culture)
        {
        System.Globalization.CultureInfo ci = new     System.Globalization.CultureInfo(culture);

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

            return RedirectToAction("Index", "Home");
        }

しかし、それでも言語は変わりません。

助けてください。

ありがとう

4

1 に答える 1

8

さて、あなたは現在のスレッドの言語を変更しています。現在のスレッドは、コントローラーアクションの実行後少し遅れた現在のリクエストで終了します。次に、他のコントローラーアクションにリダイレクトします。次に、ASP.NETは、カルチャが設定されていないこの要求を処理するための新しいスレッドを生成します。

したがって、この変更をどこかに永続化する必要があります。基本的に3つの異なるアプローチがあります:

  1. ルート変数
  2. クッキー
  3. セッション

私はそれらを優先順に並べています。{culture}最初のアプローチは、すべてのルートにトークンを統合することです。私見これはSEOの観点からも最良のアプローチです。/fr/home/indexしたがって、たとえば、サイトをフランス語で取得したい場合は、にリダイレクトします。次に、各アクションの前に実行されるカスタムアクションフィルター属性を使用して、カルチャルートパラメーターを検査し、現在のスレッドカルチャを設定できます(今回は現在のアクション)。

Cookieとセッションには、リクエスト間で現在の言語を永続化することも含まれます。最初の例では、これはクライアントで実行されますが、2番目の例ではサーバーで実行されます。ここでも、カスタムアクションフィルターを使用して、各アクションの前に言語の値を読み取り、現在のスレッドカルチャを反映することができます。

現在の言語を永続化するためにSessionを使用する次のガイドをご覧ください。

于 2012-05-09T14:36:13.697 に答える