3

現在、入力/ru/するとロシア語に変わりますが、そこに行くと/ロシア語のリソースが表示されます (Cookie/ロケールが設定されていることを意味します) /ru/。たとえば、ユーザーがオンになっていて、/en/item/32言語をロシア語に変更した場合、にリダイレクトする必要があるため/ru/item/32、リダイレクトすることはできません/ru

Cookie[Localization]をチェックするデータ注釈関数

public class Localization : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.RouteData.Values["lang"] != null && !string.IsNullOrWhiteSpace(filterContext.RouteData.Values["lang"].ToString()))
        {
            // Set from route data
            var lang = filterContext.RouteData.Values["lang"].ToString();
            Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(lang);
        }
        else
        {
            // Set from cookie
            var cookie = filterContext.HttpContext.Request.Cookies["lang"];
            var langHeader = string.Empty;
            if (cookie != null)
            {
                langHeader = cookie.Value;
                Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(langHeader);
            }
            else
            {
                // Cookie does not exist, set default
                Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
            }

            filterContext.RouteData.Values["lang"] = langHeader;
        }

        // Update cookie
        HttpCookie _cookie = new HttpCookie("lang", Thread.CurrentThread.CurrentUICulture.Name);
        _cookie.Expires = DateTime.Now.AddYears(1);
        filterContext.HttpContext.Response.SetCookie(_cookie);
        base.OnActionExecuting(filterContext);
    }
}

そして、私のルートはそのように構成されています

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Localization",
            url: "{lang}/{controller}/{action}/{id}",
            defaults: new { lang = "en", controller = "Home", action = "Index", id = UrlParameter.Optional },
            namespaces: new string[] { "ORMebeles.Controllers" }
        );

        /*
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            namespaces: new string[] { "ORMebeles.Controllers" }
        );
        */
    }
}

{lang}では、どうすれば属性をルートに挿入してそこに固定させることができるでしょうか?

4

1 に答える 1

0

ここでの問題はOnActionExecuting、着信リクエストがルートに対して評価された後に実行されることです。したがってfilterContext.RouteData.Values["lang"] = langHeader;、このシナリオでは設定は効果がありません。

多言語サイトをセットアップする方法の良い (MVC 2) 例がここにありますが、この例では URL で lang 変数を使用していません。前のページに戻ります。

URL に lang 変数を保持する必要がある場合は、現在のページを指すようにリンクを設定できますが、次のように HtmlHelper を使用して lang パラメータを変更できます。

public static MvcHtmlString ChangeLanguageLink(this HtmlHelper html, string text, string lang)
{
    var currentController = html.ViewContext.RouteData.GetRequiredString("controller");
    var currentAction = html.ViewContext.RouteData.GetRequiredString("action");

    return html.ActionLink(text, currentAction, currentController, new { lang }, null);
}

これはルートを使用して、ユーザーを同じアクションに送るリンクを生成する必要がありますが、言語は異なります。Localizationフィルターはそれに応じて現在のカルチャを設定できます。

URL に指定がなくlang、リダイレクトする必要がある場合は、上記と同様filterContxt.Resultのパラメータで を に設定できます。RedirectResult

于 2012-09-28T16:33:54.987 に答える