2012-04-27 75 views
4

的单一路线的一部分,我有以下途径:更改URL

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

为了改变网站的语言,我想创建链接,这正好对应于当前页面的URL,但有另一个语言部分。

什么是最好的方式,生成这样的链接?

回答

1

你可以做这样的事情:

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

这很可能会令意义,使扩展方法来处理这个虽然。

2

很可能,您需要插入{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()方法与自动追加该值逻辑。