Orchardcms 如何在Orchard CMS中注册/调用默认项目控制器?

Orchardcms 如何在Orchard CMS中注册/调用默认项目控制器?,orchardcms,Orchardcms,我试图弄清楚Orchard CMS中的多租户和路由是如何工作的 据我所知,当Orchard启动一个新的shell(租户)时,该租户的所有活动模块都会被加载,任何实现IRouteProvider的模块都会“发布”它们的路由。然后为每个路由添加一个ShellRoute,该路由将仅与向该租户的主机名/后缀发出的请求相匹配 然后,MVC以正常方式处理请求(在RouteTable.Routes中查找匹配项) 我不明白的是默认的ItemController是如何调用的,因为我在源代码中找不到默认的路由。我还

我试图弄清楚Orchard CMS中的多租户和路由是如何工作的

据我所知,当Orchard启动一个新的shell(租户)时,该租户的所有活动模块都会被加载,任何实现
IRouteProvider
的模块都会“发布”它们的路由。然后为每个路由添加一个
ShellRoute
,该路由将仅与向该租户的主机名/后缀发出的请求相匹配

然后,MVC以正常方式处理请求(在
RouteTable.Routes
中查找匹配项)


我不明白的是默认的
ItemController
是如何调用的,因为我在源代码中找不到默认的路由。我还注意到,在浏览主页时,
id
route参数填充了主页内容项的参数,因此我假设在点击控制器之前会进行某种预处理?

有一个默认的
IRouteProvider
-
Orchard.Mvc.Routes.StandardExtensionRouteProvider
。它负责以
{module}/{controller}/{action}/{id}
的形式注册到控制器的默认路由

是的,你是对的,正在进行一些预处理。简要说明:

  • 每个项目permalink(我们称之为别名)都映射到一个路由 它指向负责显示它的操作。默认情况下-
    Contents/Item/Display/{id}
    。这些映射保存在数据库中(
    AliasRecord
    ActionRecord
  • 有一个特殊的
    路由
    实现-
    别名路由
    。然后为每个模块注册一次此路由,并处理与现有别名匹配的请求。这一切都发生在
    Orchard.Alias
    模块中
  • 如果传入请求与任何别名匹配,则对
    AliasRoute.GetRouteData的调用将返回基础映射。这样ASP.NET MVC框架就知道要调用哪个操作

取决于项目是否具有自动路由部分。如果是(例如,博客内容类型)?如果是,则首先匹配slug,然后将其转换为常规路由值。