鉴于我只能访问ControllerContext
而不是Action____Contexts
,获取当前正在执行的ActionDescriptor的最佳方式是什么?
到目前为止,我发现的唯一方法是:
new ReflectedControllerDescriptor(context.Controller.GetType())
.FindAction(context, context.RouteData.GetRequiredString("action"));
这是最佳方法吗?
类被命名为ReflectedControllerDescriptor
的事实让我想知道这个操作是否会付出沉重的代价,因为它会在每个页面请求上执行?与此相关的是此类内部缓存还是应该实际缓存ReflectedControllerDescriptors
?
答案 0 :(得分:9)
进行一些深入研究MVC源代码,这几乎是最优化的方式,而无需复制执行您已经完成的操作所需的所有方法。但是,我不明白为什么你不能缓存找到的动作,以便后续调用更有效。
内部ReflectedControllerDescriptor
也会缓存结果,但由于每次都检查所有属性,因此似乎有一些开销。它看起来像HttpPostAttribute
之类的东西,而不是。{/ p>
我的建议是坚持使用你正在使用的东西而不是自己缓存它。如果出于某种原因,基础方法的工作方式发生了变化,那么您已经更新了,并且不必担心更改存储缓存项目的方式。