我编写了一个ASP.NET MVC向导,最初基于Steve Sanderson的向导(Pro ASP.NET MVC 2 Framework)。我的巫师是通用的,是一个梦想。
每个向导步骤都是一个动作。
但是,我现在已经发布了一个广泛使用该向导的应用程序。显然,应用程序处于发布模式。
WizardController<> class是我所有向导的基类。它有一个OnActionExecuting方法,我怀疑可以为我的问题提供解决方案。问题是如何或者更确切地说,以正确的顺序遍历堆栈,问题是什么......
WizardController深处的代码使用:
var stackTrace = new StackTrace();
string actionName = stackTrace.GetFrame(n).GetMethod().Name
获取调用此代码的操作的名称(其中n是我知道的框架是调用模式中的调用操作...)。这允许我确定我所在的向导步骤/动作。
这在调试模式下工作正常,但在发布模式下,编译器会优化我的代码。因此,n可能或可能不代表我的堆栈中的正确帧。
现实情况是,在发布模式下,有时n不代表正确的框架。有时候还不够好。有时是我的问题。我想要一个防弹解决方案。
那么使用stacktrace有什么替代方案?我怀疑我可以使用我的OnActionExecuting方法来获取操作的名称,这就是我需要的,因为这个名称标识了我向导中的步骤。
但是怎么样?忘记成为或不成为。怎么样?这是个问题。
答案 0 :(得分: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可能在调试模式下已知,但在发布模式下肯定不知道。
呼!
希望这能帮助像Narcissus一样陷入反思陷阱的其他人。