3

我的 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 调用输出 /fb/controller/action 路径,如果我正常访问网站(没有 'fb' 前缀子路径),那么Url.Action 调用输出 /controller/action

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

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

4

1 回答 1

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
);
于 2012-04-15T07:53:47.987 回答