【问题标题】:ActionDescriptor from ControllerContext来自 ControllerContext 的 ActionDescriptor
【发布时间】: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


【解决方案1】:

对 MVC 源代码进行一些挖掘,这几乎是最佳方式,而无需复制完成您已经在做的事情所需的所有方法。但是,我不明白为什么您不能缓存找到的操作,以便后续调用更高效。

在内部ReflectedControllerDescriptor 也会缓存结果,但似乎有一点开销,因为它每次都会检查所有属性。它看起来像是 HttpPostAttribute 之类的东西。

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

【讨论】:

    猜你喜欢
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 2022-10-25
    相关资源
    最近更新 更多