ActionFilter не запускается после установки результата в контроллере.OnActionExecuting

#c# #asp.net-mvc-3 #action-filter

#c# #asp.net-mvc-3 #действие-фильтр

Вопрос:

У меня есть глобальный фильтр действий, который устанавливает главную страницу всех результатов просмотра во время события OnActionExecuting.

В ряде моих контроллеров (где каждый контроллер представляет функцию приложения) Мне нужно проверить, включена ли функция, и если нет, вернуть другое представление.

Вот код:

     protected override void OnActionExecuting(ActionExecutingContext filterContext) {
        if (!settings.Enabled)
        {
            filterContext.Result = View("NotFound");
        }

        base.OnActionExecuting(filterContext);
    }
  

Проблема в том, что при установке такого результата метод OnActionExecuted моего ActionFilter в Actionexecuted не запускается, что означает, что я не получаю правильную MasterPage, примененную.

Я хотел бы понять, почему это происходит. Одно из средств — переместить мою логику ActionFilter в OnResultExecuting (это срабатывает), но я все еще не понимаю, почему OnActionExecuted этого не делает.

Большое спасибо

Ben

Ответ №1:

Если вы присвоите результат filterContext.Result внутри OnActionExecuting , то действие не будет выполнено => OnActionExecuted никогда не будет выполняться. Таким образом, вам может потребоваться применить правильную главную страницу внутри OnActionExecuting события при возврате NotFound представления:

 public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (!settings.Enabled)
    {
        // Because we are assigning a Result here the action will be 
        // short-circuited and will never execute neither the OnActionExecuted
        // method of the filer. The NotFound view will be directly rendered
        filterContext.Result = new ViewResult
        {
            ViewName = "NotFound",
            MasterName = GetMasterName()
        };
    }
}
  

Комментарии:

1. спасибо за разъяснение. На самом деле я просто изменил свой фильтр, чтобы установить главную страницу во время OnResultExecuting, поскольку это всегда срабатывает.

Ответ №2:

В качестве альтернативы, как насчет назначения главной страницы (макета) в _viewstart.cshtml и не беспокоиться о фильтре?

Комментарии:

1. главная страница может быть изменена во время выполнения, и я не думаю, что _viewstart — подходящее место для этой логики, следовательно, почему мы используем ActionFilter.