如何使用ASP.NET MVC 3.0切换区域性并保持在同一视图上

如何使用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.

我使用以下方法来处理ASP.NET MVC应用程序的本地化

            routes.MapRoute("Globalization", "{culture}/{controller}/{action}/{id}",
            new
            {
                controller = "Home",
                action = "Index",
                id = UrlParameter.Optional
            });
因此,该计划是可行的

我试图在_Layout.cshtml中创建一些区域性链接,以便切换区域性。但我只需要改变文化,保持相同的观点

当前视图:

=>切换到es

新观点:

我该怎么做呢


谢谢。

实际上这很棘手。您可以简单地使用
@Html.ActionLink(“西班牙语”,null,new{@culture=“es”})
,但是这将只保留路由中定义的参数,并且查询字符串将在本地化版本中丢失。因此,我编写了以下帮助程序:

/// <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) && !without.Contains(k)))
        result[key] = queryString[key];

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

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

    return result;
}

/// <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);
}
//
///返回由参数修改的当前url
/// 
///相关请求上下文
///要添加或覆盖的值
///要删除的值(如果存在)
///网址
当前公共静态RouteValueDictionary(RequestContext上下文,RouteValueDictionary withRouteValues=null,string[]withoutRouteValues=null)
{
var with=withRouteValues??新建RouteValueDictionary();
不带var=不带RouteValue??新字符串[0];
var result=新的RouteValueDictionary();
var queryString=context.HttpContext.Request.queryString;
foreach(queryString.AllKeys.Where(k=>!IgnoreValues.Contains(k)&&!without.Contains(k))中的var键)
结果[键]=查询字符串[键];
var routeValues=context.RouteData.Values;
foreach(routeValues.Where(p=>!IgnoreValues.Contains(p.Key)和&!without.Contains(p.Key))中的var对)
结果[pair.Key]=pair.Value;
foreach(带.Where(p=>!IgnoreValues.Contains(p.Key)和&!不带.Contains(p.Key))的变量对)
结果[pair.Key]=pair.Value;
返回结果;
}
/// 
///返回由参数修改的当前url的锚元素
/// 
///Html助手
///锚元素的内部文本
///要添加或覆盖的值
///要删除的值(如果存在)
///锚定元件
公共静态MvcHtmlString CurrentLink(此HtmlHelper self、字符串linkText、具有RouteValues=null的对象、具有OutRouteValues=null的字符串[])
{
var routeValues=当前(self.ViewContext.RequestContext,withRouteValues,withoutRouteValues);
返回self.ActionLink(linkText,null,routeValue);
}

有了这个
@Html.CurrentLink(“西班牙语”,新的{culture=“es”})
应该可以完全实现您想要的功能。

这实际上相当棘手。您可以简单地使用
@Html.ActionLink(“西班牙语”,null,new{@culture=“es”})
,但是这将只保留路由中定义的参数,并且查询字符串将在本地化版本中丢失。因此,我编写了以下帮助程序:

/// <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) && !without.Contains(k)))
        result[key] = queryString[key];

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

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

    return result;
}

/// <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);
}
//
///返回由参数修改的当前url
/// 
///相关请求上下文
///要添加或覆盖的值
///要删除的值(如果存在)
///网址
当前公共静态RouteValueDictionary(RequestContext上下文,RouteValueDictionary withRouteValues=null,string[]withoutRouteValues=null)
{
var with=withRouteValues??新建RouteValueDictionary();
不带var=不带RouteValue??新字符串[0];
var result=新的RouteValueDictionary();
var queryString=context.HttpContext.Request.queryString;
foreach(queryString.AllKeys.Where(k=>!IgnoreValues.Contains(k)&&!without.Contains(k))中的var键)
结果[键]=查询字符串[键];
var routeValues=context.RouteData.Values;
foreach(routeValues.Where(p=>!IgnoreValues.Contains(p.Key)和&!without.Contains(p.Key))中的var对)
结果[pair.Key]=pair.Value;
foreach(带.Where(p=>!IgnoreValues.Contains(p.Key)和&!不带.Contains(p.Key))的变量对)
结果[pair.Key]=pair.Value;
返回结果;
}
/// 
///返回由参数修改的当前url的锚元素
/// 
///Html助手
///锚元素的内部文本
///要添加或覆盖的值
///要删除的值(如果存在)
///锚定元件
公共静态MvcHtmlString CurrentLink(此HtmlHelper self、字符串linkText、具有RouteValues=null的对象、具有OutRouteValues=null的字符串[])
{
var routeValues=当前(self.ViewContext.RequestContext,withRouteValues,withoutRouteValues);
返回self.ActionLink(linkText,null,routeValue);
}
有了这个
@Html.CurrentLink(“西班牙语”,新的{culture=“es”})
应该可以完全实现您想要的