0

设置:

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

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

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

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

问题:

位于 WizardController 深处的代码使用:

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

获取调用此代码的操作的名称(其中 n 是我知道调用操作的框架......在调试模式下)。这使我可以确定我在哪个向导步骤/操作上。

这在调试模式下工作正常,但在发布模式下,编译器会优化我的代码。所以 n 可能代表我的堆栈中的正确帧,也可能不代表。

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

问题:

那么使用堆栈跟踪的替代方法是什么?我怀疑我可以使用我的 OnActionExecuting 方法来获取操作的名称,这是我需要的,因为这个名称是我向导中的步骤的标识。

但是怎么做?

忘记存在或不存在。如何?就是那个问题。

4

1 回答 1

0

好吧,写这篇文章让我意识到答案正盯着我的脸发青。

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 在调试模式下可能是已知的,但在发布模式下肯定是不确定的。

呸!

希望这可以帮助像水仙一样陷入反思陷阱的其他人。

于 2013-02-21T18:49:20.417 回答