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
?
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);
}
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 OnResultExecutingand
OnResultExecuted
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");
}
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.
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
};
}
}