在ASP.NET MVC中是否有一种通过代码枚举控制器并获取其名称的方法?ASP.NET MVC以编程方式获取控制器列表
例如:
AccountController
HomeController
PersonController
会给我一个清单,例如:
Account, Home, Person
在ASP.NET MVC中是否有一种通过代码枚举控制器并获取其名称的方法?ASP.NET MVC以编程方式获取控制器列表
例如:
AccountController
HomeController
PersonController
会给我一个清单,例如:
Account, Home, Person
您可以通过您的程序集反映并查找从类型System.Web.MVC.Controller继承的所有类。下面是展示了如何做到这一点的一些示例代码:
http://mvcsitemap.codeplex.com/WorkItem/View.aspx?WorkItemId=1567
我结束了使用这种方法。我也缓存了这个列表,因为它会经常被重用。谢谢 – DennyFerra 2009-07-20 21:19:57
在每个控制器创建属性,然后你的名字是这样的。
这是一个好主意,如果性能是一个问题,那么你的方式可能是最好的方法(假设你不使用反射来发现实现)。否则,使用反射来获取实现的类名是最简单的。 – 2009-07-20 06:03:12
这是正确的感谢分享知识。 – KuldipMCA 2009-07-20 06:24:43
而不是粘贴到每一个控制器,你可以创建自己的控制器类,并让所有的控制器成为这个类中的一个,并且你放入它的唯一不在基类控制器类中的是这个ViewName属性 – 2014-08-26 16:39:42
使用Jon's suggestion of reflecting through the assembly,这里是你可能会觉得有用的代码段:所有
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web.Mvc;
public class MvcHelper
{
private static List<Type> GetSubClasses<T>()
{
return Assembly.GetCallingAssembly().GetTypes().Where(
type => type.IsSubclassOf(typeof(T))).ToList();
}
public List<string> GetControllerNames()
{
List<string> controllerNames = new List<string>();
GetSubClasses<Controller>().ForEach(
type => controllerNames.Add(type.Name));
return controllerNames;
}
}
谁使用这个岗位更好地阅读之前这个帖子:using Assembly.GetCallingAssembly() not returns the calling assembly
问题是剃须刀视图作为独立的动态程序集,并且您没有获得所需的程序集。
亚伊尔
我不会从视图中调用它,我会传递来自我的视图模型的信息,这样做可以缓解您的问题。 – 2012-08-21 09:30:01
ASP.Net MVC已经在这样做,(即它的控制器名称是如何被发现),如果你能充分利用其在MVC当前实现它可能会为您节省一些时间。 – 2009-07-20 06:00:03
这是一个很好的问题 - 我该怎么做? – 2011-02-25 16:27:45