0

設定:

私は、もともと Steve Sanderson のウィザード (Pro ASP.NET MVC 2 Framework) に基づいて、ASP.NET MVC ウィザードを作成しました。私のウィザードは一般的で、夢です。

ウィザードの各ステップはアクションです。

しかし、このウィザードを広範囲に使用するアプリをリリースしました。明らかに、アプリはリリース モードです。

WizardController<> クラスは、すべてのウィザードの基本クラスです。問題の解決策を提供できると思われる OnActionExecuting メソッドがあります。問題は、スタックを正しい順序でトラバースする方法、または問題は何かということです...

問題:

WizardController の奥深くにあるコードでは、次を使用します。

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

このコードを呼び出したアクションの名前を取得します (n は、呼び出し元のアクションであることがわかっているフレームです...つまり、デバッグ モードで)。これにより、現在どのウィザードのステップ/アクションを実行しているかを確認できます。

これはデバッグ モードでは問題なく動作しますが、リリース モードではコンパイラがコードを最適化します。したがって、 n は、スタック内の正しいフレームを表している場合と表していない場合があります。

実際には、リリース モードでは、n が正しいフレームを表していないことがあります。そして、時には十分ではありません。時々私の問題です。防弾ソリューションが欲しい。

質問:

では、スタックトレースを使用する代わりにどのような方法がありますか?? OnActionExecuting メソッドを使用して、必要なアクションの名前を取得できると思います。この名前は、ウィザードのステップを識別するものだからです。

しかし、どのように?

存在するかどうかを忘れてください。どのように?それが問題です。

4

1 に答える 1

0

OK、投稿を書いていると、答えが私を真っ青に見つめていることに気づきました。

OnActionExecuting メソッドの ActionExecutingContext パラメーターは、次のように、アクション名に必要なハンドルを提供します。

私の 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 に答える