2009-06-01 16 views
5

I asked a question今日、ASP.Net MVCでは約ActionFiltersです。私の問題は本当に私のActionFilterが実行されていないことが判明しました。とりわけ、私はthis articleを読んでいます。私は彼がしていないことは何も見つけられません。なぜ私のActionFiltersは動作しませんか?

// The ActionFilter itself 
public class TestingIfItWorksAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.Controller.TempData["filter"] = "it worked!"; 
     base.OnActionExecuting(filterContext); 
    } 
} 

// The Controller Action with the filter applied 
[TestingIfItWorks] 
public ActionResult Test() 
{ 
    var didit = TempData["filter"]; 
    return View(); 
} 

私はデバッグするときにヒットされることはありませんフィルタ方式でのブレークポイント、およびTempData["filter"]は、ビューがレンダリングされるnull値を保持します。

は、これは私のコードです。

なぜこれが機能しないのですか?

答えて

4

ユニットテストを経てテストする場合は別の答え

へのご意見に基づいて、フィルタが呼び出されません。フィルタを呼び出す場合は、ControllerActionInvokerを模倣する必要があります。フィルタ自体を単独でテストし、リフレクションを使用してフィルタが正しい属性でアクションに適用されていることを確認する方が良いでしょう。私はフィルターとアクションを組み合わせてテストする上でこのメカニズムを好む。

オリジナル

きっとあなたはそうでない場合は、あなたが実際には、基本クラスのメソッドを交換しない、あなたの方法上のoverrideが必要です。コンパイラがnewまたはoverrideのいずれかを必要としていると不平を言うことが予想されます。 overrideキーワードを指定しないと、newを使用した場合と同じように動作します。フレームワークはそれをActionFilterAttributeとして呼び出すため、メソッドが呼び出されることはありません。 MSDNから引用

派生クラスのメソッドが 新しいが先行または キーワードをオーバーライドしていない場合、コンパイラは 警告を発行し、この方法は、新しいキーワードの場合 のように動作します出席していた。

+0

うん...そこには入っていないのが奇妙。私は(私は再コンパイルするまで)警告が表示されませんでしたが、オーバーライドを含む状況を変更していない:コードはまだ実行されません。 –

+0

ソリューションを再構築しましたか?おそらく図書館は時代遅れです。私はあなたが上書きを使用している場合、これがうまくいかないと想像することはできません。 – tvanfosson

+0

しました。 No luck ... =( –

0

tvanofossonに加えて、アクションメソッドは実際にはビューに何も描画していません。あなたの意見に<%=TempData["Filter"].ToString()%>の声明などがありますか?場合

+0

いいえ、私は実際にビューを持っていません。 。私はコントローラのActionResultメソッドにブレークポイントを持ち、フィルタのOnActionExecutingメソッドのブレークポイントとそのアクションを呼び出すUnitTestを持っています。私は "デバッグテスト"を押して、コントローラアクションで停止しますが、フィルタアクションでは停止しません。さらに、単体テストでは、TempData ["filter"] == "それはうまくいった!"というアサートを試み、失敗します。 –

+0

Aha - 属性はユニットテストから呼び出されません。アクションエグゼキュータによってメソッドが呼び出されたときにMVCフレームワークによって呼び出されます。 – tvanfosson

4

それはMVC 4/5を使用して誰にも便利です:あなたはActionFilterAttributeIActionFilter間違ったの名前空間を取得する場合

ActionFiltersは実行されません。https://stackoverflow.com/a/13710468/188926

使用System.Web.Http.FiltersのWeb APIのために、標準MVCアクションの場合はSystem.Web.Mvcです。

質問と同様に、フィルタ属性は間違っていると単純に無視され(エラーなし)、診断が難しくなります。

関連する問題