2011-06-28 18 views
14

こんにちは私はちょっと簡単なことをしようとしていますが、その方法は文書化されていますが、カスタムASP.NET MVC ActionFilterAttribute - フックが呼び出されることはありません

マイカスタムオーバーライド関数が呼び出されることは決してありません
[CacheControllAttribute] 
public ActionResult SomeAction() 
{ 
    //whatever 
} 

...

:しかし、私がしようとすると、このような行動の結果でこれを使用するとき

public class CacheControllAttribute : ActionFilterAttribute 
{ 
    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     //do something 
     base.OnResultExecuting(filterContext); 
    } 
} 

Basiclly私はこのような何かを書きました

これに関するアイデアですか?これをどうやって実装するのか?

+0

大丈夫です。どのMVCバージョンを使用していますか? – LeftyX

+0

これはMVC 2です。実行時のフィルタなどのフィルタを止める何かがあると思うようになりました。これは実行フロー全体のようにトレース可能なのでしょうか? – aromasca

+0

私はまったく同じ問題を抱えていました。 globalFilterCollectionにフィルタを追加した場合でも、IActionFilterを実装する必要があるというエラーが発生しました。しばらくして、System.Web。** Http.Filters ** .ActionFilterとSystem.Web。** Http.Filters **。正しいSystem.Web。** Mvc *の代わりにActionFilterAttributeを使用していたことがわかりました。 * .ActionFilterとSystem.Web。** Mvc **。ActionFilterAttributeそれは誰かを助けることでしょう。 –

答えて

4

が最後に考え出し、最終的に、私は実際には機能のActionResultされている機能にフィルタをかけてきたという事実だったが、呼び出された別のメソッドによって返されたため、フィルタはエントリポイントのActionで1回だけ実行されます。

0

アイデア:

は、あなたのフィルタが実行されていない正か?あなたはそれにブレークポイントを入れましたか? それは投げていないと例外ですか?あなたが装飾したアクションが実際に呼び出されたゲットですか?

異なる実装:

オーバーライドして、コントローラのOnResultExecuting方法。これは私がアクションフィルタを作成し、それらが呼び出されるとの問題を抱えていない方法です

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    base.OnActionExecuting(filterContext); 
} 

+0

はい、私が実際に行ったことは、私のActionResult関数と私のカスタムフィルタの両方にブレークポイントを持っているだけですが、デバッガはActionResult関数のブレークポイントに到達しますが、 – aromasca

1

はあなたのようなOnActionExecutingを上書きしようとしています。

+0

代わりに実行しているアクションをオーバーライドしようとしましたが、それでも呼び出されていない web.configなどのような追加の設定が必要になることはありますか? – aromasca

+0

@aromasca - web.configエントリは必要ありません。あなたの行動が呼び出されていると確信していますか?フィルタにブレークポイントを設定してヒットしたかどうかを確認しましたか? – amurra

1

あなたのコードは一般的に私によく見えます。これは、あなたの行動方法であなたがやっていること(またはしていないこと)に関連している可能性があります。ビューなどを返さない場合は、 "ResultExecuting"イベントハンドラが呼び出されていない可能性があります。私はサンプルhereをつかんで、何があなたの行動のために記録されるのか見てみましょう。

23

おそらくばかげた提案ですが、global.asaxに追加しましたか?
これは私のアプリケーションの一つの例である:

public class MvcApplication : System.Web.HttpApplication  
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
    filters.Add(new LogonAuthorize()); 
    filters.Add(new HandleErrorAttribute()); 
    } 
} 
+1

私のコンピュータをbashしたい2時間後...これはすべてだった... – Kyle

16

私のエラーは、 "FilterAttributeIActionFilterIResultFilter" クラスを継承したクラス'ActionFilterAttribute'の継承を見た場合、私はSystem.Web.Http.Filters、ないSystem.Web.Mvc

+4

ありがとうございました。私も同じ間違いを犯し、あなたのコメントから学びました。あなたに投票します。 :-) –

+1

resharperが最初に参照されているようです – Hoody

+1

同じ問題がここにあります!先端に感謝します。 Resharperの間違いだった – Korayem

0

を参照するということでした。あなたが探している方法はIResultFilterインターフェイスで利用できます。

したがって、カスタムクラスを属性として使用する場合は、決してメソッドを実行しません。カスタム実装には、常にIActionFilterIResultFilterメソッドをすべてオーバーライドする必要があります。

関連する問題