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