【问题标题】:ASP.NET MVC generate url with different culture parameter by ActionLinkASP.NET MVC 通过 ActionLink 生成具有不同文化参数的 url
【发布时间】:2018-11-05 14:59:49
【问题描述】:

我在 Route 中有几个 url 模式如下:

{lang}/package/{packageID}
{lang}/package/{packageID}/Edit/{partNumber}
...

layout.cshtml 中有一个页脚,页脚提供了不同的文化链接供用户更改网站的语言。当用户点击链接时,我希望它可以改变语言并停留在当前页面,所以我用 Razor 将链接渲染成这样:

@Html.ActionLink("English", ViewContext.RouteData.Values["Action"], ViewContext.RouteData.Values["Controller"], new { lang = "en-us"}, null)
@Html.ActionLink("Traditional Chinese", ViewContext.RouteData.Values["Action"], ViewContext.RouteData.Values["Controller"], new { lang = "zh-tw"}, null)
@Html.ActionLink("Japanese", ViewContext.RouteData.Values["Action"], ViewContext.RouteData.Values["Controller"], new { lang = "ja-jp"}, null)
...

但是有一个问题是我需要将上面提到的其他参数传递给页面,以保持用户停留在当前页面。

在这种情况下我该如何实现?

谢谢!

【问题讨论】:

  • ASP.NET MVC 将 automatically reuse 从当前请求路由段,如果它们发生在您明确提供值的段之前。如果您可以将您的 {lang} 分段设置为路线中的最后一个分段,那么您想要的就会自动发生。
  • @GSerg Thnaks 供您发表评论,但这似乎不是一个好方法,它实际上可以在这种情况下工作。然而,这将是对 url 模式的限制,每个模式都需要将 {lang} 放在末尾,并且还要对用户发出请求的顺序做出假设。但这是一个提示,如果我仍然找不到其他解决方案,我会尝试一下。谢谢!

标签: c# asp.net-mvc routes


【解决方案1】:

您可以创建一个扩展方法作为创建语言相关链接的助手:

public static class LanguageExtensions
{
    public static RouteValueDictionary ForLang(this RouteValueDictionary dict, string lang)
    {
        var cloned = new RouteValueDictionary(dict);
        cloned["lang"] = lang;
        return cloned;
    }
}

现在你可以这样使用它了:

@Html.ActionLink("English", ViewContext.RouteData.Values["Action"], ViewContext.RouteData.Values["Controller"], ViewContext.RouteData.ForLang("en-us"), null)

【讨论】:

  • 谢谢,这种方式简单明了,很符合我的需求。
【解决方案2】:

您可以使用return Redirect(HttpContext.Request.UrlReferrer.ToString()); 返回以将用户带回到他们所在的页面,而不必担心再次传递参数。

流程是:

  1. 用户点击@Html.ActionLink("English", ViewContext.RouteData.Values["Action"], ViewContext.RouteData.Values["Controller"], new { lang = "en-us"}, null)之类的链接

  2. 您在控制器的操作方法中更改语言

  3. 通过从同一操作方法调用 return Redirect(HttpContext.Request.UrlReferrer.ToString()); 将用户带回到他们所在的页面

【讨论】:

  • 嗨布鲁诺,谢谢你的回答,我在发布这个问题之前已经尝试过这种方式,它有效。但是我想知道是否有比重定向更好的方法,因为它需要花费更多时间来进行另一个导航。
猜你喜欢
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 2011-02-08
  • 2011-02-17
  • 1970-01-01
  • 2011-11-11
相关资源
最近更新 更多