首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AttributeRouting -在程序集中获取路由的方法

AttributeRouting -在程序集中获取路由的方法
EN

Stack Overflow用户
提问于 2013-03-20 13:12:58
回答 1查看 635关注 0票数 2

我想将AttributeRouting与Orchard CMS一起使用。为此,我需要使用一个返回Orchard RouteDescriptor列表的方法实现一个IRouteProvider

我需要一种方法来获得路由列表,这样我就可以这样做:

代码语言:javascript
复制
   public IEnumerable<RouteDescriptor> GetRoutes()
    {
        return _routes ?? (_routes = MvcRouting.GetRoutes(GetType().Assembly).Select(route => new RouteDescriptor
        {
            ...
        }).ToArray());
    }

此方法来自MvcRouting,但我想使用功能更丰富的AttributeRouting,但找不到一种方法来扫描当前程序集的路由属性。我需要一种方法让AttributeRouting返回路由列表,我可以将其投影到RouteDescriptor列表中,但实际上并没有注册它们,将其留给Orchard。

代码语言:javascript
复制
 public class RouteDescriptor {
    public string Name { get; set; }
    public int Priority { get; set; }
    public System.Web.Routing.RouteBase Route { get; set; }
    public System.Web.SessionState.SessionStateBehavior SessionState { get; set; }
}

如果我想直接注册路由(在非果园项目中),我将使用以下AttributeRouting扩展方法:

代码语言:javascript
复制
  routesCollection.MapAttributeRoutes(config =>
        {
            config.AddRoutesFromAssembly(Assembly.GetExecutingAssembly());
        }

但这并不适合其他Orchard模块。所以需要采用上面的方法。

你能想到什么办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-21 21:06:33

正如Bertrand已经指出的,您需要的是对当前可用的Controller类型进行简单的反射。

  1. 按照您已经执行的操作实现IRouteProvider
  2. 抓取由当前启用的模块导出的所有Controller类型

IExtensionManager _extensions;ShellBlueprint _shell;...var types = .LoadFeatures(_extensions.EnabledFeatures(_shell.Descriptor)) typeof(Controller).IsAssignableFrom(t)));

  • Loop _extensions .SelectMany(feature => feature .ExportedTypes .Where(t => var types over上述每种类型的方法,并选择定义了给定属性的方法)。对于所选择的每个方法,获取其名称(操作名称)、包含其声明类型(区域名称)的程序集名称以及属性数据(路由模式等)。

  • 有了上面的集合,您可以简单地循环遍历它并为每个方法返回new RouteDescriptor{ ... }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15515863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档