来自ControllerContext的ActionDescriptor

Chr*_*sic 14 c# controller controllercontext asp.net-mvc-3

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

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

new ReflectedControllerDescriptor(context.Controller.GetType())
    .FindAction(context, context.RouteData.GetRequiredString("action"));
Run Code Online (Sandbox Code Playgroud)

这是最佳方法吗?

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

Bui*_*ted 9

做一些深入研究MVC源代码,这几乎是最优化的方法,而不需要复制你所做的事情所需的所有方法.但是,我不明白为什么你不能缓存找到的动作,以便后续调用更高效.

内部ReflectedControllerDescriptor也缓存结果,尽管似乎有一些开销,因为它每次都检查所有属性.它看起来像是HttpPostAttribute什么样的东西.

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