MVC, Динамическая маршрутизация, Unity, Определить, существует ли текущий контроллер в global.asax - PullRequest
2 голосов
/ 29 мая 2009

То, что я пытаюсь сделать, - это динамическая маршрутизация для моего приложения.

Например, в Application_BeginRequest () я хочу получить текущий контроллер и определить, существует ли он. Если нет, я хочу добавить набор маршрутов, которые переопределяют маршрутизацию по умолчанию, чтобы мой URL выглядел следующим образом

mysite.com / термин из базы данных

Но, если «термин из базы данных» является допустимым контроллером, я хочу, чтобы он использовал маршрутизацию по умолчанию

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'.

Есть ли способ использовать единство из глобального, чтобы определить, существует ли контроллер?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 29 мая 2009

Почему бы вам не создать вспомогательный класс утилиты, который регистрирует маршруты из вашей базы данных, а затем применить маршруты вашего контроллера в вашем 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 = "" }
        );

        ...
0 голосов
/ 08 августа 2013

здесь является решением. Используя это, вы можете определить альтернативные маршруты для каждого маршрута следующим образом

   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;
...