Asp.net mvc 3 从下拉列表中选择语言-MVC3

Asp.net mvc 3 从下拉列表中选择语言-MVC3,asp.net-mvc-3,razor,localization,Asp.net Mvc 3,Razor,Localization,几天来,我一直在努力实现一个组合框,让用户选择语言。我使用的是MVC 3,从开始,它将语言嵌入到URL中。我喜欢这种方法,但我不想为每种语言提供链接,而是想让用户从下拉列表中选择一种语言。我还不知道当用户选择一种语言时,如何将URL重定向到当前位置+新语言。我天真地试过: in_Layout.cshtml <li>     @using (Html.BeginForm("SelectLanguage", "Home", new { url = @Request.RawUrl })) 

几天来,我一直在努力实现一个组合框,让用户选择语言。我使用的是MVC 3,从开始,它将语言嵌入到URL中。我喜欢这种方法,但我不想为每种语言提供链接,而是想让用户从下拉列表中选择一种语言。我还不知道当用户选择一种语言时,如何将URL重定向到当前位置+新语言。我天真地试过:

in_Layout.cshtml

<li>
    @using (Html.BeginForm("SelectLanguage", "Home", new { url = @Request.RawUrl })) 
    { 
    <select name="lang" id="lang" size="1" onchange="changeLanguage(this)">
        <option value="en">English </option>
        <option value="it">Italian (Italian)</option>
        <option value="es">Español (Spanish)</option>
    </select>
    }
</li>
但是,愚蠢的我,
SelectLanguage
中的
RouteData
包含
HomeController
SelectLanguage
,而不是我选择新语言时所在位置的路线数据。因此,
SelectLanguage
是无限递归的。我想做的是,每当用户选择另一种语言时,将当前的
RouteData
传递给
SelectLanguage
操作,但我还不知道如何传递。将
route=ViewContext.RouteData
传递到
BeginForm
不起作用,因为它只是一个字符串。(在
route=System.Web.Routing.RouteData
中为表单呈现的html是无用的。)我刚刚发现它显示了如何将路由数据导入JavaScript,我认为我可以(以某种方式)将其注入表单,但这是必要的吗?对于路由数据来说,这感觉像是一次不必要的往返。对于这种方法,我是否缺少了一些简单的东西,或者更简单的解决方案

编辑——只是注意到超链接丢失了,这使得任何人都很难知道我在说什么。添加,因此希望人们开始提供意见:)

static void AddOtherValues(RouteData routeData, RouteValueDictionary destinationRoute)
{
    foreach (var routeInformation in routeData.Values)
    {
        if (routeInformation.Key == GlobalizedRoute.CultureKey)
            continue; //Do not re-add, it will throw, this is the old value anyway.
        destinationRoute.Add(routeInformation.Key, routeInformation.Value);
    }
}

public ActionResult SelectLanguage(string url, string language, RouteData route)
{
    RouteValueDictionary globalizedRouteData = new RouteValueDictionary();
    globalizedRouteData.Add(GlobalizedRoute.CultureKey, language);
    AddOtherValues(RouteData, globalizedRouteData);

    return RedirectToRoute(globalizedRouteData);

}