3

几天来,我一直在努力实现一个组合框来让用户选择语言。我正在使用 MVC 3 并从这篇文章开始,它在 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);

}

但是,愚蠢的我,RouteDataSelectLanguagecontainsHomeControllerSelectLanguage中,而不是我选择新语言时的路线数据。所以SelectLanguage是无限递归的。我想做的是每当用户选择另一种语言时将电流传递RouteDataSelectLanguage动作,但我还没有弄清楚如何。传入route = ViewContext.RouteDatatoBeginForm不起作用,因为它只是一个字符串。(表单的渲染 htmlroute=System.Web.Routing.RouteData是无用的。)我刚刚发现这篇文章展示了如何将路由数据导入 JavaScript,我认为我可以(以某种方式)将它注入到我的表单中,但这有必要吗?感觉就像路线数据不必要的往返。对于这种方法,我是否缺少一些简单的东西,甚至是更简单的解决方案?

编辑——刚刚注意到缺少超链接,这使得任何人都很难知道我在说什么。添加了,所以希望人们会开始提供输入:)

4

0 回答 0