Функция маршрутизации Asp.net MVC - PullRequest
2 голосов
/ 13 ноября 2011

Может кто-нибудь объяснить, что делает следующая функция. Я изучаю Asp.net MVC и не могу понять, какой контроллер вызывается, когда и какой вид рендеринга.

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        //register custom routes (plugins, etc)
        var routePublisher = EngineContext.Current.Resolve<IRoutePublisher>();
        routePublisher.RegisterRoutes(routes);

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new[] { "Nop.Web.Controllers" }
        );
    }

Этот код взят из исходного кода nopCommerce. Я не могу понять маршрутизацию URL для этого проекта

Ответы [ 2 ]

2 голосов
/ 13 ноября 2011

Логика для этого в классе System.Web.Mvc.MvcHandler, классе System.Web.Mvc.DefaultControllerFactory и классе System.Web.Mvc.ControllerActionInvoker. .NET Reflector ваш друг.

В основном, структура MVC:

  1. Использует отражение, чтобы получить все контроллеры в проекте приложения.

  2. Тогда он делает что-то вроде IEnumerable<string> controllerNames = controllerTypes.Select(controllerType => controllerType.Name.Replace("Controller",string.Empty));. Затем он пытается сопоставить первый сегмент пути, {controller}, с одним из этих очищенных имен типов контроллеров (без учета регистра).

  3. Затем он просматривает открытые методы этого контроллера, которые имеют тип возвращаемого значения типа ActionResult или некоторую производную. Он сопоставляет имя метода со вторым сегментом пути, {action}, в качестве вызываемого метода действия.

  4. Если выбранный метод имеет параметр с именем id, он сопоставляет третий сегмент пути {id} этому значению и передает его методу. В противном случае необязательный параметр id игнорируется.

  5. Если возвращаемый тип ActionResult является производным от ViewResultBase, тогда IViewEngine пытается найти соответствующее представление в проекте, используя те соглашения, которые были заданы для этого механизма представления. Например, WebFormViewEngine ищет в проекте значения ~/Views/{controller}/{action}.ascx, ~/Views/{controller}/{action}.aspx, ~/Views/Shared/{action}.ascx, ~/Views/Shared/{action}.aspx по умолчанию.

    • Если вы хотите лучше понять, как работает маршрутизация в MVC, я настоятельно рекомендую статью Скотта Гу о MVC Routing .

    • Что касается метода IRoutePublisher, он выглядит как специальный метод nopCommerce, который автоматически регистрирует дополнительные маршруты, специфичные для конфигурации nopCommerce. Если вас интересует, как работают конкретные соглашения о маршрутизации nopCommerce, вы можете загрузить исходный код со страницы кодового комплекса nopCommerce *1057* и выполнить поиск по умолчанию для реализации IRoutePublisher.

2 голосов
/ 13 ноября 2011

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

Итак, если вам нужно понять, что происходит, проверьте исходный код nopCommerce и найдите классы RouteProvider, которые есть в каждом плагине.Они динамически загружаются при запуске приложения.

Если вам нужно создать собственные маршруты, вы все равно можете сделать это традиционным способом - но имейте в виду, что могут быть некоторые конфликты.

(Отказ от ответственности: я только что посмотрел на исходный код, больше ничего о нем не знаю).

...