Как пропустить выполнение действия из ActionFilter? - PullRequest
37 голосов
/ 23 марта 2012

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

Ответы [ 4 ]

34 голосов
/ 23 марта 2012

См. Мой пример загрузки и статью MSDN Фильтрация в ASP.NET MVC .

Вы можете отменить выполнение фильтра в методах OnActionExecuting и OnResultExecuting, установив для свойства Result ненулевое значение.

Любые ожидающие фильтры OnActionExecuted и OnActionExecuting не будут вызваны, и вызывающий не вызовет метод 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");
}
22 голосов
/ 23 марта 2012

Вы можете использовать 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 голосов
/ 13 мая 2014

Вы можете использовать следующий код здесь.

public override void OnActionExecuting(ActionExecutingContext filterContext)
 {
    ...
    if (needToRedirect) //your condition here
    {
       ...
       filterContext.Result = new RedirectToAction(string action, string controller)
       return;
    }
    ...
 }

RedirectToAction перенаправит вам конкретное действие в зависимости от условия.

1 голос
/ 23 ноября 2018

Если кто-то расширяет ActionFilterAttribute в MVC 5 API, то вы должны получить HttpActionContext вместо ActionExecutingContext в качестве типа параметра. В этом случае просто установите httpActionContext.Response на новый HttpResponseMessage, и все готово.

Я делал фильтр проверки, и вот как это выглядит:

    /// <summary>
    /// Occurs before the action method is invoked.
    /// This will validate the request
    /// </summary>
    /// <param name="actionContext">The http action context.</param>
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        ApiController ctrl = (actionContext.ControllerContext.Controller as ApiController);
        if (!ctrl.ModelState.IsValid)
        {
            var s = ctrl.ModelState.Select(t => new { Field = t.Key, Errors = t.Value.Errors.Select(e => e.ErrorMessage) });
            actionContext.Response = new System.Net.Http.HttpResponseMessage()
            {
                Content = new StringContent(JsonConvert.SerializeObject(s)),
                ReasonPhrase = "Validation error",
                StatusCode = (System.Net.HttpStatusCode)422
            };
        }
    }
...