Подтвердить что ты не робот

Как пропустить выполнение действия из ActionFilter?

Можно ли пропустить выполнение всего действия и вернуть конкретный ActionResult, когда определенное условие выполнено в OnActionExecuting?

4b9b3361

Ответ 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 перенаправляет вам конкретное действие на основе условия.