更改 URL 的单个路由部分

本文关键字:路由部 单个 URL 更改 | 更新日期: 2023-09-27 18:32:22

我有以下路线:

routes.MapRoute(
    "Default", // Route name
    "{language}/{controller}/{action}/{id}",
    new { language = "en", controller = "XY", id = UrlParameter.Optional } 
);

为了更改网站的语言,我想创建链接,这些链接与当前页面的网址完全对应,但具有另一种语言部分。

生成这种链接的最佳方法是什么?

更改 URL 的单个路由部分

最有可能的是,您需要插入{language}值作为每个链接呈现视图的 ViewModel 或 ViewData 的一部分。有几种不同的方法可以实现这一点;例如重载控制器的OnActionExecuted()方法。如果您采用这种方法,我建议使所有控制器都继承自单个基本控制器。

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
    filterContext.Controller.ViewData["Language"] = GetUserLanguage();
    base.OnActionExecuted(filterContext);
}

然后在您看来:

@Url.Action("Index", "Home", new { language = ViewData["Language"] })

或者,您可以考虑使用自动追加此值的逻辑重载 Url.Action()Html.ActionLink()方法。

你可以做这样的事情:

@Html.RouteLink("Switch Language", "Default", new { 
    controller = ViewContext.RouteData.Values["controller"], 
    action = ViewContext.RouteData.Values["action"], 
    id = ViewContext.RouteData.Values["id"], 
    language = "fr" 
})

不过,制作一个扩展方法来处理这个问题可能是有意义的。