代码之家  ›  专栏  ›  技术社区  ›  awrigley

替代StackTrace.GetFrame…在调用方法的控制器上查找操作

  •  0
  • awrigley  · 技术社区  · 13 年前

    设置:

    我写了一个ASP.NET MVC向导,最初是基于Steve Sanderson的向导(Pro ASP.NET MVC 2 Framework)。我的巫师是普通的,是一个梦。

    每个向导步骤都是一个操作。

    然而,我现在发布了一个广泛使用向导的应用程序。显然,该应用程序处于发布模式。

    巫师控制器<>类是我所有向导的基类。它有一个OnActionExecuting方法,我怀疑它可以为我的问题提供解决方案。问题是如何,或者更确切地说,以正确的顺序遍历堆栈,问题是什么。。。

    问题:

    该代码位于WizardController的深处,使用:

    var stackTrace = new StackTrace();
    string actionName = stackTrace.GetFrame(n).GetMethod().Name
    

    以获取调用此代码的操作的名称(其中n是我所知道的帧,即调试模式下的调用操作)。这使我能够确定我正在执行的向导步骤/操作。

    这在调试模式下很好,但在发布模式下,编译器会优化我的代码。因此,n可能代表,也可能不代表我堆栈中的正确帧。

    事实是,在发布模式下,有时n不能代表正确的帧。有时还不够好。有时候是我的问题。我想要一个防弹的解决方案。

    问题:

    那么,除了使用stacktrace之外,还有什么其他选择呢??我怀疑我可以使用OnActionExecuting方法来获取操作的名称,这正是我所需要的,因为这个名称标识了向导中的步骤。

    但是怎么做呢?

    忘记存在还是不存在。怎么做到的?这就是问题所在。

    1 回复  |  直到 13 年前
        1
  •  0
  •   awrigley    13 年前

    好吧,写这篇帖子让我意识到答案就在我脸上发青。

    OnActionExecuting方法的ActionExecutingContext参数为我提供了Action名称所需的句柄,如下所示:

    在我的WizardController类中,我添加了以下内容:

    private string ActionName { get; set; } 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
        ActionName = filterContext.ActionDescriptor.ActionName; 
        // All the other stuff...
    }
    

    我现在可以使用ActionName属性,而不是:

    stackTrace.GetFrame(n).GetMethod().Name
    

    其中n在调试模式下可能是已知的,但在发布模式下肯定是未知的。

    呜呜!

    希望这能帮助其他人,比如纳西索斯,陷入反思陷阱。

    推荐文章