从下拉列表中选择语言 - MVC3

时间:2012-09-24 22:06:59

标签: asp.net-mvc-3 razor localization

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

_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>

在HomeController.cs

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);

}

但是,愚蠢的我,RouteData中的SelectLanguage包含HomeControllerSelectLanguage,而不是我选择新语言时的路线数据。所以SelectLanguage是无限递归的。我想做的是,只要用户选择其他语言,我就会将当前RouteData传递给SelectLanguage操作,但我还没弄清楚如何操作。将route = ViewContext.RouteData传递给BeginForm不起作用,因为它只是一个字符串。 (route=System.Web.Routing.RouteData中表单的渲染html没用。)我刚刚发现this article,它显示了如何将路径数据导入JavaScript,我认为我可以将它注入到我的表单中(不知何故) ,那是必要的吗?感觉就像路线数据的不必要的往返一样。我是否遗漏了这种方法的简单方法,甚至是更简单的解决方案?

编辑 - 只是注意到超链接丢失了,这让任何人都很难知道我在说什么。添加,所以希望人们会开始提供输入:)

0 个答案:

没有答案