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

时间:2009-05-29 13:51:39

标签: asp.net-mvc model-view-controller routing unity-container asp.net-mvc-routing

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

例如,在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来确定控制器是否存在?

谢谢!

2 个答案:

答案 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;