2009-07-20 78 views
31

在ASP.NET MVC中是否有一种通过代码枚举控制器并获取其名称的方法?ASP.NET MVC以编程方式获取控制器列表

例如:

AccountController 
HomeController 
PersonController 

会给我一个清单,例如:

Account, Home, Person 
+1

ASP.Net MVC已经在这样做,(即它的控制器名称是如何被发现),如果你能充分利用其在MVC当前实现它可能会为您节省一些时间。 – 2009-07-20 06:00:03

+1

这是一个很好的问题 - 我该怎么做? – 2011-02-25 16:27:45

回答

-1

在每个控制器创建属性,然后你的名字是这样的。

+0

这是一个好主意,如果性能是一个问题,那么你的方式可能是最好的方法(假设你不使用反射来发现实现)。否则,使用反射来获取实现的类名是最简单的。 – 2009-07-20 06:03:12

+0

这是正确的感谢分享知识。 – KuldipMCA 2009-07-20 06:24:43

+0

而不是粘贴到每一个控制器,你可以创建自己的控制器类,并让所有的控制器成为这个类中的一个,并且你放入它的唯一不在基类控制器类中的是这个ViewName属性 – 2014-08-26 16:39:42

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; 
    } 
} 
0

谁使用这个岗位更好地阅读之前这个帖子:using Assembly.GetCallingAssembly() not returns the calling assembly

问题是剃须刀视图作为独立的动态程序集,并且您没有获得所需的程序集。

亚伊尔

+2

我不会从视图中调用它,我会传递来自我的视图模型的信息,这样做可以缓解您的问题。 – 2012-08-21 09:30:01

相关问题