1

MVC.NET3に頭を悩ませようとしています。

私は_Layout.cshtmlベース(構造、ナビゲーション)としてを使用します。レイアウトの一部として、言語/ローカリゼーションの変更に使用される2つのリンクを表示したいと思います。

これらは、どのページが表示されていても表示およびクリック可能である必要があります。ローカリゼーションを変更した後、アクションを呼び出したビューを再ロードしたいと思います。そのため、顧客が見ているページが再ロードされ、新しいローカリゼーションが設定されます。

1つの方法は、各サイトコントローラーでローカリゼーション変更アクションをコピーして貼り付けることですが、より簡単でエレガントな方法はありませんか?

ローカリゼーションの変更を処理する特定のコントローラーを作成しようとしましたが、ビューアーを前のコントローラーに戻す方法がわかりません。

おそらくこれはjqueryで簡単に達成できますか?

これは、言語変更ボタンが付いたファイルDIVからのものです。_Layout現在のコントローラーでアクションを呼び出します。つまり、サイトの各コントローラーでアクションを定義する必要があります。(良いことは、返されるビューが常に正しいことです。)

<div id="top>
    @using (Html.BeginForm())
    {
        <button id="sv_flag" name="localization" title="@Resources.Global.Sv_Flag_Hover" value="sv-SE" />
        <button id="en_flag" name="localization" title="@Resources.Global.En_Flag_Hover" value="en-GB" />
    }
</div>

これにも特定のコントローラーを使用してみましたが、後で現在のビューに戻る方法がわかりません。そのようです:

@using (Html.BeginForm("LocalizationAction", "LocalizationController"))
...

ダリンからの提案を使用して今すぐ編集controllerし、レイアウトページからとaction値を送信します。

@using (Html.BeginForm("SetLocalization", "Localization",
            new {   returnController = @ViewContext.Controller.ValueProvider.GetValue("controller").RawValue,
                    returnAction = @ViewContext.Controller.ValueProvider.GetValue("action").RawValue }))
...

しかし、ローカリゼーションの変更を機能させることができません。コントローラーのアクションは次のようになります。

    public ActionResult SetLocalization(string localization, string returnController, string returnAction)
    {
        Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(localization);
        return RedirectToAction(returnAction, returnController);
    }
4

3 に答える 3

3

returnUrlを渡すことができます:

@using (Html.BeginForm("LocalizationAction", "LocalizationController", new { returnUrl = Request.Url.AbsoluteUri }))
{
    ...    
}

そして、LocalizationActionこのURLへのリダイレクト内:

public ActionResult LocalizationAction(string returnUrl)
{
    ... do your localization stuff and once you are done get back:

    return Redirect(returnUrl);
}

明らかに、やみくもにリダイレクトする前に少しチェックすることができます。returnUrlパラメータが空でないかどうか、ドメインに属しているかどうかなどです。AccountControllerデフォルトがユーザーを認証すると、それがどのように行われるかを確認できます。

于 2012-07-07T17:29:53.970 に答える
2

Redirect(Request.UrlReferrer.ToString());を返します。

    public ActionResult Change(String LanguageAbbrevation)
    {
        if (LanguageAbbrevation != null)
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguageAbbrevation);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanguageAbbrevation);
        }

        HttpCookie cookie = new HttpCookie("Language");
        cookie.Value = LanguageAbbrevation;
        Response.Cookies.Add(cookie);

        return Redirect(Request.UrlReferrer.ToString());
    }
于 2016-05-23T13:24:15.567 に答える
1

私は自分の問題に対して完全に異なる(そしてはるかに簡単でエレガントな)解決策を見つけました。

BaseControllerローカリゼーションを変更するためのアクションを保持するを作成しただけです。

次に、サイトに追加するすべてのコントローラーはこれを継承しますBaseController。これにより、コードの場所が1つになり、戻りパラメーターなどを送信する必要がなくなります。

BaseController

public class BaseController : Controller
{
    [HttpPost]
    public ActionResult Index(string localization)
    {
        Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(localization);
        return View();
    }
}

各サイトは、Controllersそれを継承するだけでよく、独自のアクションを気にする必要があります。

public class ApplicationsController : BaseController
{
    //
    // GET: /Applications/

    public ActionResult Index()
    {
        return View();
    }
}
...
于 2012-07-07T19:07:48.330 に答える