Как переключить язык и оставаться в том же представлении с ASP.NET MVC 3.0

#.net #asp.net-mvc-3 #razor

#.net #asp.net-mvc-3 #razor

Вопрос:

Я использую следующий маршрут для обработки локализации на моем ASP.NET Приложение MVC

             routes.MapRoute("Globalization", "{culture}/{controller}/{action}/{id}",
            new
            {
                controller = "Home",
                action = "Index",
                id = UrlParameter.Optional
            });
  

Итак, схема такова http://mysite.com/en-US/Contact или http://mysite.com/es-ES/Contact

Я пытаюсь создать некоторые ссылки на язык интерфейса в _Layout.cshtml, чтобы переключить язык интерфейса. Но мне нужно только переключить культуру и остаться в том же представлении.

Текущее представление:http://mysite.com/en-US/Contact

=> Переключиться на es-ES

Новое представление:http://mysite.com/es-ES/Contact

Как я могу это выполнить?

Спасибо.

Ответ №1:

На самом деле это довольно сложно. Вы могли бы просто использовать @Html.ActionLink("Spanish", null, new { @culture = "es-ES" }) , однако это сохранит только параметры, определенные в route, а строка запроса будет потеряна в локализованной версии. Из-за этого я написал следующий помощник:

 /// <summary>
/// Returns current url modified by parameters
/// </summary>
/// <param name="context">Relevant request context</param>
/// <param name="withRouteValues">Values to add or override</param>
/// <param name="withoutRouteValues">Values to remove if present</param>
/// <returns>Url</returns>
public static RouteValueDictionary Current(RequestContext context, RouteValueDictionary withRouteValues = null, string[] withoutRouteValues = null)
{
    var with = withRouteValues ?? new RouteValueDictionary();
    var without = withoutRouteValues ?? new string[0];

    var result = new RouteValueDictionary();

    var queryString = context.HttpContext.Request.QueryString;
    foreach (var key in queryString.AllKeys.Where(k => !IgnoreValues.Contains(k) amp;amp; !without.Contains(k)))
        result[key] = queryString[key];

    var routeValues = context.RouteData.Values;
    foreach (var pair in routeValues.Where(p => !IgnoreValues.Contains(p.Key) amp;amp; !without.Contains(p.Key)))
        result[pair.Key] = pair.Value;

    foreach (var pair in with.Where(p => !IgnoreValues.Contains(p.Key) amp;amp; !without.Contains(p.Key)))
        result[pair.Key] = pair.Value;

    return resu<
}

/// <summary>
/// Returns anchor element with current url modified by parameters
/// </summary>
/// <param name="self">Html helper</param>
/// <param name="linkText">The inner text of anchor element</param>
/// <param name="withRouteValues">Values to add or override</param>
/// <param name="withoutRouteValues">Values to remove if present</param>
/// <returns>Anchor element</returns>
public static MvcHtmlString CurrentLink(this HtmlHelper self, string linkText, object withRouteValues = null, string[] withoutRouteValues = null)
{
    var routeValues = Current(self.ViewContext.RequestContext, withRouteValues, withoutRouteValues);

    return self.ActionLink(linkText, null, routeValues);
}
  

С этим @Html.CurrentLink("Spanish", new { culture = "es-ES" }) должно получиться именно то, что вы хотите.