Вызов OnActionExecuting FilterAttribute перед OnActionExecuting BaseController в

голоса
6

У меня , BaseControllerв котором я ставлю в некоторых данных в ViewDataколлекции с помощью переопределения OnActionExecuting.

Теперь у меня есть действие в ChildControllerтом , что не нужно , что просмотр данных.

Для этой цели я создал DontPopulateViewDataActionFilterAttribute , который устанавливает логическое значение на BaseControllerчто предотвращает BaseControllerот заполнения ViewData.

Проблема: ActionFilters OnActionExecutingметод вызывается после того, как один в BaseControllerи не раньше.

Будет ActionFilters всегда вызываться перед переопределен OnActionExecutingв базовых контроллеров и есть способ обойти это?

Задан 19/05/2009 в 12:53
источник пользователем
На других языках...                            


2 ответов

голоса
0

Класс ActionFilterAttribute имеет свойство «Order» , который вы можете использовать , чтобы установить порядок , в котором выполняются эти действия фильтров.
В вашем случае вы должны установить порядок фильтра атрибута в BaseController до 2 и фильтр атрибута в DerivedController до 1:

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

  public ActionResult MyAction() {

  }

}

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

  public ActionResult AnotherAction() {

  }

}

Прочитайте это для более подробной информации: http://msdn.microsoft.com/en-us/library/dd381609.aspx

Примечание: Я не проверял это.

Ответил 19/05/2009 в 15:32
источник пользователем

голоса
15

В дополнение к тому, что писал и предложил (с помощью ActionFilter на базовый класс) Марван Aouida, я не думаю, что вы собираетесь быть в состоянии создать ActionFilter, который выполняется до перегрузки OnActionExecuting () на базовом классе. Следующий код:

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

производит этот выход:

MyBaseController::Execute()
MyBaseController::OnActionExecuting()
MyActionFilter_Derived::OnActionExecuting()
MyActionFilter_Base::OnActionExecuting()
MyTestController::Index()
MyActionFilter_Base::OnActionExecuted()
MyActionFilter_Derived::OnActionExecuted()
MyBaseController::OnActionExecuted()
Ответил 19/05/2009 в 19:42
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more