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