我正在尝试在ASP.NET MVC 3网站中创建一个动态菜单功能 - 我想知道是否有一种内置方法可以在运行时获取所有控制器和操作?
我意识到我可以使用反射来查找控制器上的所有公共方法,但这并不能确切地告诉我应该放在<a href="...">
标记中的相对URL。
此外,我将使用过滤器属性来装饰一些“操作”,这些属性指示当前用户是否可以查看/转到这些页面。因此,如果我也可以访问过滤器以便能够调用IsAccessGranted()
方法,那将是最好的。
我有什么选择?什么是最好的选择?
答案 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模板将生成一个更容易迭代的类。