我在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'路线来存储一些临时信息。
答案 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
);