【发布时间】:2012-05-30 20:12:42
【问题描述】:
鉴于我只能访问 ControllerContext 而不能访问 Action____Contexts,获取当前正在执行的 ActionDescriptor 的最佳方法是什么?
目前我发现的唯一方法是:
new ReflectedControllerDescriptor(context.Controller.GetType())
.FindAction(context, context.RouteData.GetRequiredString("action"));
这是最佳方法吗?
类被命名为ReflectedControllerDescriptor 的事实让我想知道这个操作是否有很大的成本,因为它将在每个页面请求上执行?与此相关的是这个类是在内部缓存还是我应该明确地缓存ReflectedControllerDescriptors?
【问题讨论】:
-
对 MVC 源代码进行一些挖掘,这几乎是最佳方式,无需复制完成您已经在做的事情所需的所有方法。但是,我不明白为什么您不能缓存找到的操作,以便后续操作更高效。
-
此外,ReflectedControllerDescriptor 确实使用反射来获取操作,因为它不仅查看方法,还查看附加到方法的属性。 (ReflectedControllerDescriptor 也会缓存结果)
-
@BuildStarted 所以
ReflectedControllerDescriptor内部的反射使用确实被缓存了,但可以说我可以缓存我对 FindAction 的调用? -
是的,你可以。 ReflectedControllerDescriptor 中仍有一些对属性的额外处理(即使使用缓存的操作),但它似乎不是任何过程密集型的。
标签: c# asp.net-mvc-3 controller controllercontext