ASP.NET MVC编程方式获取控制器列表

31
在ASP.NET MVC中,是否有一种通过代码枚举控制器并获取其名称的方法?
例如:
AccountController
HomeController
PersonController

将为我提供这样的列表:

Account, Home, Person

1
ASP.Net MVC已经在做这个(即控制器名称的发现),如果你能利用MVC中的当前实现,可能会节省您一些时间。 - Chuck Conway
1
这是一个非常好的问题 - 我该怎么做? - Roland Tepp
4个回答

44

使用Jon的建议,通过反射程序集,以下是一个可能有用的片段:

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

12

我最终采用了这种方法。我还将该列表进行了缓存,因为它经常会被重复使用到。谢谢。 - Denny Ferrassoli

0
所有使用此帖子的人最好在使用Assembly.GetCallingAssembly()之前阅读此帖子。
问题在于Razor视图充当独立的动态程序集,您无法获得所需的程序集。
Yair

2
我不会从视图中调用它,而是从我的视图模型传递信息,这样做会减轻您的问题。 - David McLean

-1
在每个控制器中创建属性,然后您可以像这样获取名称。

这是一个好主意,如果性能是个问题,那么你的方法可能是最佳途径(假设你不使用反射来发现实现)。否则,使用反射获取实现类名是最简单的。 - Chuck Conway
与其将此粘贴到每个控制器中,您可以创建自己的控制器类,并使所有控制器成为该类的一部分,您放入其中唯一不在基础控制器类中的是此ViewName属性。 - Brian White

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接