【问题标题】:How to get controller type by its name [duplicate]如何通过名称获取控制器类型[重复]
【发布时间】:2009-05-01 13:47:34
【问题描述】:

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

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


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

【问题讨论】:

标签: asp.net-mvc


【解决方案1】:

我不太清楚您需要在哪里执行此操作。如果您需要在 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”结尾的所有类并在那里运行您的代码 - 再说一次,我不清楚您需要在哪里发生这种情况。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 2013-07-31
      • 2014-03-29
      • 2013-11-01
      相关资源
      最近更新 更多