Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改URL的单路由部分_C#_Asp.net Mvc - Fatal编程技术网

C# 更改URL的单路由部分

C# 更改URL的单路由部分,c#,asp.net-mvc,C#,Asp.net Mvc,我有以下路线: routes.MapRoute( "Default", // Route name "{language}/{controller}/{action}/{id}", new { language = "en", controller = "XY", id = UrlParameter.Optional } ); 为了更改网站的语言,我想创建与当前页面的url完全对应的链接,但有另一个语言部分 生成这样一个链接的最佳方法是什么?最有可能的情况是,您希望将

我有以下路线:

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"] })

P>可选的,您可能会考虑重载<代码> URL。Acthon()/代码>和<代码> HTML.ActualLink()/<代码>方法,其中逻辑自动地追加该值。

< P>您可以这样做:

@Html.RouteLink("Switch Language", "Default", new { 
    controller = ViewContext.RouteData.Values["controller"], 
    action = ViewContext.RouteData.Values["action"], 
    id = ViewContext.RouteData.Values["id"], 
    language = "fr" 
})
不过,创建一个扩展方法来处理这个问题可能是有意义的