ASP.NET MVC 5 - Перенаправление на ту же страницу с культурой

У меня есть локализация на моем проекте. Я хочу, чтобы каждый раз, когда пользователь изменял культуру, он перенаправлял его на ту же страницу, на которой он находился. Но теперь с новой культурой.

Например, если пользователь находится на странице регистрации, вот ссылка, которая появляется:

http://localhost:49445/pt/Account/Register

с pt быть культурой.

Я начал осматриваться и придумал этот метод изменения культуры:

public ActionResult ChangeCulture(string lang)
{
    var langCookie = new HttpCookie("lang", lang) { HttpOnly = true };
    Response.AppendCookie(langCookie);
    string url = this.Request.UrlReferrer.AbsoluteUri;

    return Redirect(url);
}

Но очевидно, что это не сработает, потому что это просто перенаправит меня снова

http://localhost:49445/pt/Account/Register

вместо

http://localhost:49445/en/Account/Register

Я искал вокруг, ничего не находя. Может ли кто-нибудь указать мне правильное направление? Или дать хороший ответ?

2 ответа

Чтобы изменить только 1 параметр, такой как культура, используйте следующий помощник:

public static string ActionWithNewCulture(this UrlHelper urlHelper, string culture)
{
    var newRouteData = new RouteValueDictionary(urlHelper.RequestContext.RouteData.Values);
    newRouteData["culture"] = culture;

    return urlHelper.RouteUrl(newRouteData);
}

Текущая культура должна быть частью ваших маршрутов:

Global.asax

const string defaultCulture = "sk";

routes.MapRoute(
        "DefaultLocalized",
        "{culture}/{controller}/{action}",
        new { controller = "Home", action = "Index", culture = defaultCulture },
        new { culture = "sk|cz" }
);  

установить текущую культуру для каждого запроса:

    protected void Application_BeginRequest()
    {           
        SetCurrentCulture();
    }

    private void SetCurrentCulture()
    {
        var queryItems = Request.RawUrl.Split(new char [] {'/', '?'}, StringSplitOptions.RemoveEmptyEntries);

        var currentCulture = new CultureInfo("sk-SK");

        HashSet<string> suportedLanguages = new HashSet<string>() { "sk", "cz" };

        var currentLang = string.Empty;

        if (queryItems.Length > 0)
            currentLang = queryItems[0].ToLowerInvariant();            

        if (suportedLanguages.Contains(currentLang))
        {
            if (currentLang == "cz")
            {
                currentCulture = new CultureInfo("cs-CZ");
            }                
        }            

        Thread.CurrentThread.CurrentCulture = currentCulture;
        Thread.CurrentThread.CurrentUICulture = currentCulture;
    }

ссылка для переключения культур:

           <a href="@Url.ActionWithCurrentQuery(new { culture = "sk" })" title="Slovensky" class="m-xs right">
                <img src="@Url.Content("~/Content/Images/slovak-flag.GIF")" alt="Slovensky" title="Slovensky"  />
            </a>

действие с текущим запросом генерирует HTML на основе текущего URL, но с другой культурой:

/ en / Home / Action? param = 1 становится /de/Home/Action?param=1

public static string ActionWithCurrentQuery(this UrlHelper urlHelper, string actionName, string controllerName, object routeValues)
        {
            var request = urlHelper.RequestContext.HttpContext.Request;
            var url = urlHelper.Action(actionName, controllerName, routeValues, "http");
            var uriBuilder = new UriBuilder(url);
            var query = HttpUtility.ParseQueryString(string.Empty);
            foreach (string key in request.QueryString.Keys)
            {
                query[key] = request[key];
            }
            var routeQuery = HttpUtility.ParseQueryString(uriBuilder.Query);
            foreach (string key in routeQuery)
            {
                query[key] = routeQuery[key];
            }
            uriBuilder.Query = query.ToString();

            return uriBuilder.ToString();
        }
Другие вопросы по тегам