如何自动将当前路由中的特定值添加到所有生成的链接?

时间:2011-02-20 21:56:03

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

我在这样的网址中有网站文化:

routes.MapRoute(
    "Default", 
    "{language}/{controller}/{action}/{id}", 
    languageDefaults, 
    languageConstraints)

它就像一个魅力,在自定义MvcHttpHandler的帮助下,根据路由值在每个请求上设置当前线程的UI文化。我的问题是如何自动将当前请求的语言路由值添加到所有传出链接?例如。当请求page / EN / Foo / Bar时,我想要这个

<%=Html.ActionLink(
    "example link", 
    MVC.Home.Index()) %>

自动生成与此相同的结果:

<%=Html.ActionLink(
    "example link", 
    MVC.Home.Index()
        .AddRouteValue(
            "language", 
            this.ViewContext.RouteData.Values["language"]) %>

当然,对于像BeginForm()等所有其他帮助程序也一样。在我目前的代码库中已经有了&gt;使用这些助手的1000次,并且每次都需要.AddRouteValue是非常脆弱的,因为一些开发人员会忘记100%确定地使用它。

我希望唯一的解决方案不是为所有内容创建自定义Html助手吗?

1 个答案:

答案 0 :(得分:3)

它应该保留路由中定义的所有值并自动显示在RouteData中,除非您将其设置为其他值。尝试创建没有T4MVC的链接或检查您的路由定义。这样的事情对我很有用:

routes.MapRoute("Default with language", "{lang}/{controller}/{action}/{id}", new
{
    controller = "Home",
    action = "Index",
    id = UrlParameter.Optional,
}, new { lang = "de|fr" });
routes.MapRoute("Default", "{controller}/{action}/{id}", new
{
    controller = "Home",
    action = "Index",
    id = UrlParameter.Optional,
    lang = "en",
});

+

protected void Application_AcquireRequestState(object sender, EventArgs e)
{
    MvcHandler handler = Context.Handler as MvcHandler;
    if (handler == null)
        return;

    string lang = (string)handler.RequestContext.RouteData.Values["lang"];

    CultureInfo culture = CultureInfo.GetCultureInfo(lang);

    Thread.CurrentThread.CurrentUICulture = culture;
    Thread.CurrentThread.CurrentCulture = culture;
}

+

<%: Html.ActionLink("About us", "Detail", "Articles", new { @type = ArticleType.About }, null) %>