有没有办法迭代ASP.NET MVC3站点中的所有控制器/操作?

时间:2011-04-26 21:53:03

标签: asp.net-mvc-3

我正在尝试在ASP.NET MVC 3网站中创建一个动态菜单功能 - 我想知道是否有一种内置方法可以在运行时获取所有控制器和操作?

我意识到我可以使用反射来查找控制器上的所有公共方法,但这并不能确切地告诉我应该放在<a href="...">标记中的相对URL。

此外,我将使用过滤器属性来装饰一些“操作”,这些属性指示当前用户是否可以查看/转到这些页面。因此,如果我也可以访问过滤器以便能够调用IsAccessGranted()方法,那将是最好的。

我有什么选择?什么是最好的选择?

3 个答案:

答案 0 :(得分:3)

我实际上两周前就是这么做的。

var q = from type in Assembly.GetExecutingAssembly().GetTypes()
        where type.IsClass && type.Namespace != null && type.Namespace.Contains("Controller")
        select type;
        q.ToList().ForEach(type => doWhatYouNeedToDo(type)));

如果您使用的是T4MVC,则此脚本将返回双重条目。要避免这种情况,请使用

&& !type.Name.Contains("T4MVC")

在方法doWhatYouNeedToDo()中,您可以将Type对象转换为适合您需求的DTO,并进一步添加工作。

就动态菜单而言,您可以使用MvcSiteMapProvider并使用它实现自己的动态sitemapprovider,因此您不再绑定到静态站点地图xml文件。

但是.NET中的反射非常慢,因此您可能希望将控制器和方法的表示存储在数据库中。

答案 1 :(得分:1)

MVC中没有内置机制来枚举所有控制器和操作。您必须使用反射来检查所有已加载的类型,并查看它们的方法和相关属性。当然,这是假设您使用默认的基于反射的操作调度机制。由于MVC的管道可以在很多地方被替换,因此很容易注入一个系统来调用不基于CLR类和方法的动作方法。但是,如果你完全控制你的应用程序,那么生活会更容易。

答案 2 :(得分:0)

试试TVMVC。你仍然需要使用反射,但t4模板将生成一个更容易迭代的类。