可能重复:
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描述了一个类似但不同的问题。我不需要确定可以执行哪些控制器/操作,我需要获得单个控制器的类型。
答案 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控制器,或者更具体地说是您的控制器,是否足够便宜构建,或构建和缓存,对我来说是未知的),检索系统中的每个控制器并检索它们的类型可能更直接。