web-dev-qa-db-fra.com

Comment ignorer l'exécution d'une action à partir d'un ActionFilter?

Est-il possible d'ignorer l'exécution complète de la méthode d'action et de renvoyer un ActionResult spécifique lorsqu'une certaine condition est remplie dans OnActionExecuting?

37
user49126

Vous pouvez utiliser filterContext.Result pour cela. Ça devrait ressembler à ça:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    //Check your condition here
    if (true)
    {
        //Create your result
        filterContext.Result = new EmptyResult();
    }
    else
        base.OnActionExecuting(filterContext);
}
22
tpeczek

Voir mon exemple de téléchargement et l'article MSDN Filtrage dans ASP.NET MVC .

Vous pouvez annuler l'exécution du filtre dans les méthodes OnActionExecuting et OnResultExecuting en définissant la propriété Result sur une valeur non nulle.

Aucun filtre OnActionExecuted et OnActionExecuting en attente ne sera invoqué et l'appelant n'appellera pas la méthode OnActionExecuted pour le filtre annulé ou pour les filtres en attente.

Le filtre OnActionExecuted pour les filtres précédemment exécutés s'exécutera. Tous les filtres OnResultExecutingandOnResultExecuted s'exécuteront.

Le code suivant de l'exemple montre comment renvoyer un ActionResult spécifique lorsqu'une certaine condition est remplie dans OnActionExecuting:

if (filterContext.RouteData.Values.ContainsValue("Cancel")) 
{
    filterContext.Result = new RedirectResult("~/Home/Index");
    Trace.WriteLine(" Redirecting from Simple filter to /Home/Index");
}
34
RickAndMSFT

Vous pouvez utiliser le code suivant ici.

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

RedirectToAction vous redirigera l'action spécifique en fonction de la condition.

2
Mehul Vaghela

Si quelqu'un étend ActionFilterAttribute dans l'API MVC 5, vous devez alors obtenir HttpActionContext au lieu de ActionExecutingContext comme type de paramètre. Dans ce cas, définissez simplement httpActionContext.Response à nouveau HttpResponseMessage et vous êtes prêt à partir.

Je faisais un filtre de validation et voici à quoi ça ressemble:

    /// <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
            };
        }
    }
1
Anup Sharma