2009-05-19 8 views
6

BaseController私はOnActionExecutingをオーバーライドしてViewDataコレクションにいくつかのデータを入れました。BaseControllerのOnActionExecutingの前にFilterAttributeのOnActionExecutingを呼び出す

私はChildControllerにそのビューデータを必要としないアクションがあります。

この目的のために、BaseControllerがビューデータにデータを入力できないように、BaseControllerにboolを設定する、DontPopulateViewData ActionFilterAttributeを作成しました。

問題:BaseControllerの後のActionFilters OnActionExecutingメソッドが呼び出されてからではありません。

ベースコントローラでは、OnActionExecutingをオーバーライドする前にActionFiltersを呼び出す必要があります。これを回避する方法はありますか?

答えて

15

Marwan Aouidaが投稿し、提案した(基本クラスのActionFilterを使用している)ことに加えて、OnActionExecuting()オーバーロードの前に実行するActionFilterをベースで作成することはできませんクラス。次のコード:

MyBaseController::Execute() 
MyBaseController::OnActionExecuting() 
MyActionFilter_Derived::OnActionExecuting() 
MyActionFilter_Base::OnActionExecuting() 
MyTestController::Index() 
MyActionFilter_Base::OnActionExecuted() 
MyActionFilter_Derived::OnActionExecuted() 
MyBaseController::OnActionExecuted() 
+0

ありがとう:

[MyActionFilter(Name = "Base", Order = 2)] public class MyBaseController : Controller { protected override void OnActionExecuting(ActionExecutingContext filterContext) { Response.Write("MyBaseController::OnActionExecuting()<br>"); base.OnActionExecuting(filterContext); } protected override void Execute(System.Web.Routing.RequestContext requestContext) { requestContext.HttpContext.Response.Write("MyBaseController::Execute()<br>"); base.Execute(requestContext); } protected override void OnActionExecuted(ActionExecutedContext filterContext) { Response.Write("MyBaseController::OnActionExecuted()<br>"); base.OnActionExecuted(filterContext); } } public class MyActionFilter : ActionFilterAttribute { public string Name; public override void OnActionExecuted(ActionExecutedContext filterContext) { filterContext.HttpContext.Response.Write("MyActionFilter_" + Name + "::OnActionExecuted()<br>"); base.OnActionExecuted(filterContext); } public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.HttpContext.Response.Write("MyActionFilter_" + Name + "::OnActionExecuting()<br>"); base.OnActionExecuting(filterContext); } } public class MyTestController : MyBaseController { [MyActionFilter(Name = "Derived", Order = 1)] public void Index() { Response.Write("MyTestController::Index()<br>"); } } 

は、この出力を生成します。また、ロジックを基本クラスのActionFilterに入れることで問題が解決され、よりクリーンなデザインにもなります。 –

0

ActionFilterAttributeクラスには、アクションフィルタの実行順序を設定するために使用できる「Order」というプロパティがあります。あなたのケースでは
あなたは1にDerivedControllerで2 BaseControllerのフィルタ属性およびフィルター属性の順序を設定する必要があります。http://msdn.microsoft.com/en-us/library/dd381609.aspx

注:

[MyFilter(Order=2)] 
public class BaseController:Controller 
{ 

    public ActionResult MyAction() { 

    } 

} 

[MySecondFilter(Order=1)] 
public class DerivedController:BaseController 
{ 

    public ActionResult AnotherAction() { 

    } 

} 

はもっとに関する情報のためにこれを読んで:私はこれをテストしなかった。

関連する問題