3

目前,当我输入/ru/时,它将更改为俄语,但如果我进入/它将显示俄语资源(意味着设置了 cookie/区域设置),但它不会重定向到/ru/. 我真的不能只是重定向它,例如,如果用户打开/en/item/32并且他将语言更改为俄语,他需要重定向到/ru/item/32,而不是/ru.

[Localization]检查 cookie 的数据注释功能

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 变量 - 大约在中途,他们将 ActionLinks 设置为更改文化然后重定向的操作返回上一页。

如果您需要在 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为 aRedirectResult与上述类似的参数。

于 2012-09-28T16:33:54.987 回答