MVC noob - 在链接中更改URL的一部分

时间:2010-04-08 21:02:40

标签: asp.net-mvc asp.net-mvc-2

我有一个支持本地化的网站。我希望能够在英语和法语之间切换。

假设用户当前在网址: http://www.mysite.com/ EN /家庭

我想重定向到: http://www.mysite.com/ FR /家庭

如果用户点击“法语”链接如何将URL部分更改为“fr”但尚未更改URL的“Home”部分(基本上我想保留用户的当前位置)

希望我的问题有道理!我可能遗漏了一些非常基本的东西?

编辑:找到了一种解决方案。

<%= Html.ActionLink("Français", ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), new { culture = "fr" }, null)%>
<%= Html.ActionLink("English", ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), new { culture = "en" }, null)%>

这维护当前URL的动作/控制器。也许有一个更清洁的解决方案?

3 个答案:

答案 0 :(得分:2)

在您的Global.asax

 routes.MapRoute(
   name: "LocalizedRoute",
   url: "{language}/{controller}/{action}/{id}",
   defaults:
     new
     {
       language= "fr",
       controller = "Home",
       action = "Index",
       id = UrlParameter.Optional 
     },
   constraints: new { language= @"[a-z]{2}" });

您可以在控制器中使用变量语言访问该语言

生成链接:

<%= Html.ActionLink("French", ViewContext.RouteData.Values["action"], new { language = "fr" }) %>

您可以使用此属性创建基类控制器

public string Language { get { return this.Routedata["language"]; } }

答案 1 :(得分:1)

我为RouteValueDictionary做了一个扩展来解决这个问题:

public static RouteValueDictionary SetValue(this RouteValueDictionary dictionary, string key, object value)
{
    RouteValueDictionary rvd = new RouteValueDictionary(dictionary);
    rvd[key] = value;
    return rvd;
}

现在您可以在html模板中使用以下内容:

<div id="head">
    @Html.RouteLink("DE", ViewContext.RouteData.Values.SetValue("language", "de")) |
    @Html.RouteLink("FR", ViewContext.RouteData.Values.SetValue("language", "fr")) |
    @Html.RouteLink("IT", ViewContext.RouteData.Values.SetValue("language", "it")) |
    @Html.RouteLink("EN", ViewContext.RouteData.Values.SetValue("language", "en"))
</div>

扩展名不会修改RoutData.Values集合,它会复制并且您可以覆盖所需的值。

答案 2 :(得分:0)

我建议以这种格式制作网址:

http://www.mysite.com/Home/en

然后你可以像这样简单地采取行动:

<%= Html.ActionLink("Francais", "Home", "MyController", new { id = "fr" }), null %>
<%= Html.ActionLink("English", "Home", "MyController", new { id = "en" }), null %>

然后在你的控制器中有一个动作:

public ActionResult Home(string id)
{
    if(id == "en"){ // do something } 
    else if(id == "fr") { // do something else }
    return View();
}

Global.asax路线

routes.MapRoute(
   "HomeLanguageRoute", // Route name
   "MyController/Home/{id}", // URL with parameters
   new { controller = "MyController", action = "Home", id = "" }    // Parameter defaults
);