ActionFilter не срабатывает после установки результата в controller.OnActionExecuting - PullRequest
3 голосов
/ 11 июня 2011

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

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

Вот код:

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

        base.OnActionExecuting(filterContext);
    }

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

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

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

Ben

Ответы [ 2 ]

6 голосов
/ 11 июня 2011

Если вы присваиваете результат 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()
        };
    }
}
0 голосов
/ 11 июня 2011

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

...