Url.Action不使用所需的输出路径

时间:2012-04-14 16:36:08

标签: asp.net asp.net-mvc-3 url-routing

我在MVC3网站上有以下路线定义:

routes.MapRoute(
                "FB", // Route name
                "fb/{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            ).RouteHandler = new RH();

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );

我的自定义“RH”处理程序的代码是

public class RH : MvcRouteHandler
    {
        protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            //here I store somewhere that 'fb' prefix is used, so logic is different in some places
            return base.GetHttpHandler(requestContext);
        }
    }

我想要实现的目标是,当使用'fb'子路径前缀访问我的网站时,我的网站逻辑执行方式有点不同。

问题是,当我正常访问我的网站时(例如http://localhost),那么当我执行时

Url.Action('action' 'controller')

,然后输出为“http:// localhost / fb / controller / action”。

我想实现,当我的网站使用'fb'前缀子路径访问时,我的Url.Action调用output / fb / controller / action路径,如果我正常访问网站(没有'fb'前缀子路径),然后Url.Action调用输出/控制器​​/动作

主要的是,/ fb / controller / actions必须路由到与通过/ controller / action格式访问站点时相同的控制器/操作。

当我使用'fb'前缀时,只需要'fb'路线来存储一些临时信息。

1 个答案:

答案 0 :(得分:3)

似乎我找到了一个基于此链接(MVC 3 Routing and Action Links not following expected contextual Route)的解决方案,引入了新的路径占位符并添加了约束。

也许它不够好,或者你知道的比这更好,但似乎对我有用:

routes.MapRoute(
        "FB", // Route name
        "{path}/{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
        new { path = "fb" }
).RouteHandler = new RH();

routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);