2

有人可以解释以下功能的作用。我正在学习 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 路由

4

2 回答 2

2

这样做的逻辑在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返回的类型是派生的,ViewResultBaseIViewEngine尝试使用为该视图引擎指定的任何约定在项目中定位相应的视图。例如, 默认情况下WebFormViewEngine会在项目中查找~/Views/{controller}/{action}.ascx~/Views/{controller}/{action}.aspx、 。~/Views/Shared/{action}.ascx~/Views/Shared/{action}.aspx

于 2011-11-13T11:47:56.077 回答
2

nopCommerce 采用松散耦合的基础设施,分别为每个插件注册路由。

因此,如果您需要了解发生了什么,请检查 nopCommerce 源代码并查找每个插件都有的 RouteProvider 类。它们在应用程序启动时动态加载。

如果您需要创建自己的路线,您仍然可以使用传统方式进行 - 但请注意,可能会出现一些冲突。

(免责声明:我只是看了源代码,对它一无所知)。

于 2011-11-13T11:37:26.483 回答