2014-09-24 2 views
2

У меня есть локализация в моем проекте. Я хочу, чтобы каждый раз, когда пользователь менял культуру, он перенаправлял его на ту же страницу, на которой он был. Но теперь с новой культурой.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

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

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, но с другой культурой:?

/ен/Главная/Действие парам = 1 становится/де/Главная/Действие 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(); 
     } 
+0

Я немного проверю этот подход. Вы знаете, есть ли способ перенаправить на ту же страницу и сохранить сообщения проверки. Например, если пользователь попытался зарегистрироваться, но некоторые сообщения об ошибках показали. И тогда вы изменили культуру, и она перенаправит сохранение сообщений о проверке. – Lokuzt

+0

Сообщения о проверке @Lokuzt показаны в результате для запросов POST. Если вы измените маршрут, вы создадите новый запрос GET, поэтому сообщения о проверке исчезнут. Вы должны повторно отправить форму, чтобы снова отобразить эти сообщения. –

+0

Я пытаюсь повторно отправить форму с помощью tempdata. Но я не добился успеха, но все же думаю, что это неправильный путь. Есть ли у вас какие-либо подсказки, к какому подходу я должен взять? – Lokuzt

2

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

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

    return urlHelper.RouteUrl(newRouteData); 
} 
Смежные вопросы