#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.