如何通过名称获取控制器类型

时间:2009-05-01 13:47:35

标签: asp.net-mvc

  

可能重复:
  How can I get controller type and action info from a url or from route data?

我有一个控制器名称及其操作名称列表。我需要做的是从这些操作的自定义属性中读取值。 问题是,似乎没有简单的方法来获取控制器类型(其余的很容易。) ASP.NET MVC框架在DefaultControllerFactory中具有此功能,但它不能在框架本身之外访问。 重新发明轮子并自己实现它似乎不是一个好主意,特别是因为MVC框架具有控制器类型的缓存,我需要复制它。 有没有更好的解决方案?


UPD。 Accessing the list of Controllers/Actions in an ASP.NET MVC application描述了一个类似但不同的问题。我不需要确定可以执行哪些控制器/操作,我需要获得单个控制器的类型。

2 个答案:

答案 0 :(得分:0)

我不清楚你需要做什么。如果您需要在MVC应用程序中执行此操作,那么您可以实现自己的控制器工厂并将代码放在那里,使用键控在控制器类型上的缓存存储结果 - 例如:

public class CustomControllerFactory : DefaultControllerFactory
{
  protected override IController GetControllerInstance(Type controllerType)
  {
    // do something with controller attributes on controllerType here the
    // first time a controller is seen and store the results in a
    // static cache keyed on the controller type

    return base.GetControllerInstance(controllerType);
  }
}

然后在应用程序启动时注册ControllerFactory(例如在global.asax中):

ControllerBuilder.Current.SetControllerFactory(new CustomControllerFactory());

或者,你可以简单地使用反射来查找程序集中以“Controller”结尾的所有类并在那里运行你的代码 - 再次,我不清楚你需要在哪里发生这种情况。

答案 1 :(得分:0)

由于你已经有了一个类型名列表,使用反射来翻阅程序集,检索类型并迭代这些动作,检查是否存在有趣的属性,这可能是最直接的方法。我没有在ASP.Net MVC中做足够的爬行来知道是否有办法从MVC中的控制器缓存中提取类型信息......

或者,如果您可以询问缓存中每个控制器类型的对象(以及ASP.Net MVC控制器,或者更具体地说是您的控制器,是否足够便宜构建,或构建和缓存,对我来说是未知的),检索系统中的每个控制器并检索它们的类型可能更直接。