【问题标题】:Asp.net MVC routing functionAsp.net MVC 路由功能
【发布时间】:2011-12-28 00:14:48
【问题描述】:

谁能解释一下以下函数的作用。我正在学习 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 路由

【问题讨论】:

  • 看起来大部分有趣的路由都是由“路由发布者”添加的,没有显示。不知道我们如何回答这个问题..
  • @MarcGravell,我在哪里可以找到你说的这个路线发布者??在不知道这一点的情况下,我无法理解为哪个 URL 调用哪个控制器
  • 查看 routePublisher.RegisterRoutes - 除此之外...如果这是产品,请参阅文档!

标签: c# asp.net-mvc-3 nopcommerce


【解决方案1】:

此逻辑在System.Web.Mvc.MvcHandler 类、System.Web.Mvc.DefaultControllerFactory 类和System.Web.Mvc.ControllerActionInvoker 类中。 .NET Reflector 是你的朋友。

基本上,MVC 框架:

  1. 使用反射获取应用程序项目中的所有控制器。

  2. 然后它会执行类似IEnumerable&lt;string&gt; controllerNames = controllerTypes.Select(controllerType =&gt; 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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-04
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多