我要做的是为我的应用程序动态路由。
例如,在Application_BeginRequest()中,我想获取当前控制器并确定它是否存在。如果没有,我想添加一组覆盖默认路由的路由,以便我的网址看起来像这样
来自数据库的mysite.com/term
但是,如果“来自数据库的术语”是一个有效的控制器,我希望它使用默认路由
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
我已经按照我想要的方式拥有自己的路线。现在我只需要获取当前控制器并确定它是否存在。如果我不添加自定义路由,我会收到此错误:
IControllerFactory'MySite.Web.UnityControllerFactory'没有为名为'term from database'的控制器返回控制器。
有没有办法从全局使用unity来确定控制器是否存在?
谢谢!
答案 0 :(得分:3)
为什么不创建一个实用程序助手类来注册数据库中的路由,然后在global.asax中应用控制器路由?
首先注册数据库路由,如果找到有效路由,则首先使用该路由。或者你可以设置反之亦然。另外,我会确保您的数据库中的路由具有关联的RouteName以避免冲突。
public class Global : HttpApplication { public static void RegisterRoutes(RouteCollection routes) { //call utility to register routes from db RouteHelper.RegisterRoutesFromDB(routes); //now define my standard routes routes.MapRoute( "Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = "" } ); ...
答案 1 :(得分:0)
here是一个解决方案。使用它,您可以为每条路线定义替代路线,如下所示
var defaultRoute = routes.MapReplaceableRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id =
UrlParameter.Optional }
);
var route = routes.MapRoute(
name: "Dynamic",
url: "{name}",
defaults: new { controller = "Dynamic", action = "Index" });
defaultRoute.AlternativeRoute = route;