来自ControllerContext的ActionDescriptor

时间:2012-05-30 20:12:43

标签: c# asp.net-mvc-3 controller controllercontext

鉴于我只能访问ControllerContext而不是Action____Contexts,获取当前正在执行的ActionDescriptor的最佳方式是什么?

到目前为止,我发现的唯一方法是:

new ReflectedControllerDescriptor(context.Controller.GetType())
    .FindAction(context, context.RouteData.GetRequiredString("action"));

这是最佳方法吗?

类被命名为ReflectedControllerDescriptor的事实让我想知道这个操作是否会付出沉重的代价,因为它会在每个页面请求上执行?与此相关的是此类内部缓存还是应该实际缓存ReflectedControllerDescriptors

1 个答案:

答案 0 :(得分:9)

进行一些深入研究MVC源代码,这几乎是最优化的方式,而无需复制执行您已经完成的操作所需的所有方法。但是,我不明白为什么你不能缓存找到的动作,以便后续调用更有效。

内部ReflectedControllerDescriptor也会缓存结果,但由于每次都检查所有属性,因此似乎有一些开销。它看起来像HttpPostAttribute之类的东西,而不是。{/ p>

我的建议是坚持使用你正在使用的东西而不是自己缓存它。如果出于某种原因,基础方法的工作方式发生了变化,那么您已经更新了,并且不必担心更改存储缓存项目的方式。