2011-04-26 40 views
4

我想在ASP.NET MVC 3网站上做一个动态菜单功能 - 我想知道是否有一种内置的方式来获得所有的控制器和操作在运行时?有没有办法在ASP.NET MVC3站点中迭代所有控制器/动作?

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

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

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

回答

1

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

0

尝试TVMVC。您仍然必须使用反射,但t4模板将生成一个更容易迭代的类。

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(),你可以转换类型对象到适合您需求的DTO,并进一步将其添加工作。

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

但是.NET中的反射速度很慢,因此您可能需要将控制器和方法的表示存储在数据库中。

相关问题