代码之家  ›  专栏  ›  技术社区  ›  Josh

MVC,动态路由,Unity,确定global.asax中是否存在电流控制器

  •  2
  • Josh  · 技术社区  · 15 年前

    我要做的是为我的应用程序动态路由。

    例如,在应用程序_BeginRequest()中,我想获取当前控制器并确定它是否存在。如果没有,我想添加一组替代默认路由的路由,这样我的URL看起来像这样

    数据库中的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来确定控制器是否存在?

    谢谢!

    2 回复  |  直到 11 年前
        1
  •  3
  •   David    15 年前

    为什么不创建一个实用工具帮助器类来注册来自数据库的路由,然后在global.asax中应用控制器路由?

    因为您的DB路由是先注册的,所以如果它找到一个有效的路由,那么它将首先使用那个路由。或者你可以设置它,反之亦然。作为一个额外的注意事项,我会确保您从数据库发送的路由有一个关联的路由名,以避免冲突。

    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 = "" }
            );
    
            ...
    
        2
  •  0
  •   Siyamand    11 年前

    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;