C# Html.ActionLink和RedirectToAction在嵌入式路由处理程序中不正确
为了允许在多个web项目之间共享公共资源和视图,我组装了一个包含这些布局的DLL,等等。为了实现这一点,我有一个路由处理程序,它可以查找任何以C# Html.ActionLink和RedirectToAction在嵌入式路由处理程序中不正确,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,为了允许在多个web项目之间共享公共资源和视图,我组装了一个包含这些布局的DLL,等等。为了实现这一点,我有一个路由处理程序,它可以查找任何以Embedded/开头的Uri,然后转到自定义处理程序进行处理。这一切都很好地发挥作用,并因此注册: RouteTable.Routes.Insert(0, new Route("Embedded/{*file}", new RouteValueDictionary(new { }),
Embedded/
开头的Uri,然后转到自定义处理程序进行处理。这一切都很好地发挥作用,并因此注册:
RouteTable.Routes.Insert(0,
new Route("Embedded/{*file}",
new RouteValueDictionary(new { }),
new RouteValueDictionary(new { }),
new EmbeddedResourceRouteHandler()));
然而,当我使用ActionLink
或redirectoaction
时,它就会中断。在调试后者时,似乎选择了myEmbedded/
路由作为要使用的路由,因此,我没有得到{controller}/{action}
的uri,而是得到了Embedded?controller={controller}&action={action}
电话是:
ActionResult result = RedirectToAction("Expired", "Operations");
如下图所示,这就是路由表的外观。请注意,我的嵌入式系统是第一个:
结果Uri为:
我已经尝试添加嵌入的路由处理程序作为最后一个路由处理程序,但是它从未被调用。如果您需要更多信息,请告诉我!提前感谢。一个想法可能是将约束应用于其他路由(包括默认路由),并将嵌入的路由放置在路由表的最末端。约束的示例:
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new { controller = "^(?!Embedded).+"}
);
完美的非常感谢-我正要把头发扯下来。@Moo Juice,坦率地说,我不认为这是最好的解决方案,因为它要求每条路线都有约束。应该只有一种方法可以调整嵌入的路由,我想不出一种方法。但是,如果这个解决方案对您有效——太好了。是的——目前,默认路径是唯一的。如果添加了更多的路由,我很可能会将流程混淆为一个自定义的
MapRoute
函数,该函数会自动提供约束,并免除开发人员这样做的责任。