2009-05-19 18 views
6

OnActionExecuting'yi OnActionExecuting'yi geçersiz kılarak ViewData koleksiyonuna bazı veriler ekledim.BaseController's OnActionExecuting önce FilterAttribute'ın OnActionExecuting çağrılıyor

Artık ChildController'te bu görüntüleme verilerine ihtiyaç duymayan bir Eylemim var.

Bu amaçla BaseController'da xdax16'nın viewdata doldurmasını engelleyen bir boole ayarlayan bir DontPopulateViewData ActionFilterAttribute yarattım.

Sorun: ActionFilters OnActionExecuting yöntemi, BaseController'deki birinden sonra ve daha önce değil.

ActionFilters her zaman temel denetleyicilerinde OnActionExecuting geçersiz kılmadan önce çağrılacak ve bunun üstesinden gelmenin bir yolu var mı?

cevap

15

Marwan Aouida'nın yayınladığı ve önerdiği (temel sınıfta bir ActionFilter kullanarak) ek olarak, temelde OnActionExecuting() yüklemesinden önce çalıştırılan bir ActionFilter oluşturabileceğinizi düşünmüyorum. sınıf. Aşağıdaki kodu:

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

Teşekkür:

[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>"); } } 

bu çıktıyı üretir. Ve evet, mantığı temel sınıftaki bir ActionFilter'e yerleştirmek sorunu çözecek ve hatta daha temiz bir tasarıma neden olacaktır. –

0

ActionFilterAttribute sınıfının, Eylem Filtrelerinin yürütüldüğü sırayı ayarlamak için kullanabileceğiniz "Sipariş" adlı bir özelliği vardır. Senin durumunda
1 olarak DerivedController içinde 2'ye BaseController Filtre Özelliği ve Filtre Özelliği sırasını ayarlamak zorunda: http://msdn.microsoft.com/en-us/library/dd381609.aspx

Not:

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

    public ActionResult MyAction() { 

    } 

} 

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

    public ActionResult AnotherAction() { 

    } 

} 

daha Infos için bunu okuyun: Bunu test etmedim.

İlgili konular