Можно ли пропустить выполнение всего действия и вернуть конкретный ActionResult
, когда определенное условие выполнено в OnActionExecuting
?
Как пропустить выполнение действия из ActionFilter?
Ответ 1
Для этого вы можете использовать filterContext.Result. Он должен выглядеть следующим образом:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//Check your condition here
if (true)
{
//Create your result
filterContext.Result = new EmptyResult();
}
else
base.OnActionExecuting(filterContext);
}
Ответ 2
См. мой пример загрузки и статью MSDN Фильтрация в ASP.NET MVC.
Вы можете отменить выполнение фильтра в методах OnActionExecuting
и OnResultExecuting
, установив для свойства Result
значение, отличное от нуля.
Любые незавершенные фильтры OnActionExecuted
и OnActionExecuting
не будут вызываться, и invoker не будет вызывать метод OnActionExecuted
для отмененного фильтра или для отложенных фильтров.
Будет запущен фильтр OnActionExecuted
для ранее запущенных фильтров. Все фильтры OnResultExecutingand
OnResultExecuted
будут работать.
Следующий код из примера показывает, как вернуть конкретный ActionResult
, когда определенное условие встречается в OnActionExecuting
:
if (filterContext.RouteData.Values.ContainsValue("Cancel"))
{
filterContext.Result = new RedirectResult("~/Home/Index");
Trace.WriteLine(" Redirecting from Simple filter to /Home/Index");
}
Ответ 3
Здесь вы можете использовать следующий код.
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
...
if (needToRedirect) //your condition here
{
...
filterContext.Result = new RedirectToAction(string action, string controller)
return;
}
...
}
RedirectToAction перенаправляет вам конкретное действие на основе условия.