0

J'utilise ASP.NET Core et FluentValidation.Échec de la validation du traitement dans le filtre d'exception et affichage du ré-affichage

Lorsqu'une action POST reçoit une entrée non valide, il est de coutume de réengendrer la forme d'entrée vue, avec des erreurs de validation:

if (!ModelState.IsValid) 
    return View("nameOfViewRenderedByGetAction", model); 

Mais ma validation est effectivement réalisée dans un service, par FluentValidation, qui jette ValidationException . Je veux le gérer dans un filtre d'exception:

public class ValidationFilterAttribute : ActionFilterAttribute, IExceptionFilter 
{ 

    public void OnException(ExceptionContext context) 
    { 
     // only handle ValidationException 
     var ex = context.Exception as ValidationException; 
     if (ex == null) return; 

     // re-render get action's view, or redirect to get action 
     // ?? 
    } 

} 

Je suis bloqué au "??" partie, parce que Core a changé les signatures de nombreux types, et ExceptionContext ne fait pas surface les données dont j'ai besoin pour faire ce travail.

Comment faire?

Répondre

1

A partir d'un filtre d'exception, vous pouvez afficher une vue personnalisée en définissant le résultat du contexte.

public class ValidationFilterAttribute : ActionFilterAttribute, IExceptionFilter 
{ 

    public void OnException(ExceptionContext context) 
    { 
     // only handle ValidationException 
     var ex = context.Exception as ValidationException; 
     if (ex == null) return; 

     // re-render get action's view, or redirect to get action 
     var result = new ViewResult { ViewName = "GetView" } 
     context.HttpContext.Response.Clear(); 
     context.Result = result; 
    } 

} 

GetView doit être le nom du point de vue de votre action Get. Exemple de filtre d'exception qui utilise une vue d'erreur de développeur personnalisée pour afficher des détails sur les exceptions.

public class CustomExceptionFilterAttribute : ExceptionFilterAttribute 
{ 
    private readonly IHostingEnvironment _hostingEnvironment; 
    private readonly IModelMetadataProvider _modelMetadataProvider; 

    public CustomExceptionFilterAttribute(
     IHostingEnvironment hostingEnvironment, 
     IModelMetadataProvider modelMetadataProvider) 
    { 
     _hostingEnvironment = hostingEnvironment; 
     _modelMetadataProvider = modelMetadataProvider; 
    } 

    public override void OnException(ExceptionContext context) 
    { 
     if (!_hostingEnvironment.IsDevelopment()) 
     { 
      // do nothing 
      return; 
     } 
     var result = new ViewResult {ViewName = "CustomError"}; 
     result.ViewData = new ViewDataDictionary(_modelMetadataProvider,context.ModelState); 
     result.ViewData.Add("Exception", context.Exception); 
     // TODO: Pass additional detailed data via ViewData 
     context.Result = result; 
    } 
} 

Notez que le code ci-dessus envoie le contexte, l'état du modèle et l'exception à la vue.

Dans le cas où vous avez besoin est de se référer ASP.NET Core Error Handling page d'erreur personnalisée

En général, vous ne devriez pas utiliser un filtre d'exception pour transformer une erreur en succès. Pensez à utiliser un filtre d'action si vous avez une telle exigence. Cela dit, pour une raison si vous avez encore besoin de rediriger à partir d'un filtre d'exception, voici comment il peut être fait

public class CustomExceptionFilterAttribute : ExceptionFilterAttribute 
    { 
     private readonly IHostingEnvironment _hostingEnvironment; 

     public CustomExceptionFilterAttribute(
      IHostingEnvironment hostingEnvironment, 
      IModelMetadataProvider modelMetadataProvider) 
     { 
      _hostingEnvironment = hostingEnvironment; 
     } 

     public override void OnException(ExceptionContext context) 
     { 
      if (!_hostingEnvironment.IsDevelopment()) 
      { 
       // do nothing 
       return; 
      } 

      var result = new RedirectToRouteResult(
new RouteValueDictionary(new { controller = "Home", action = "Error" })); 
      context.Result = result; 
     } 
    } 
+0

Il rend ce point de vue spécifique, et non redirect. Et il rend sans erreurs de validation, de sorte que l'information est perdue. – grokky

+0

Vous ne pouvez pas utiliser un filtre d'exception pour transformer une exception en succès. Cependant, vous pouvez transmettre les données dont vous avez besoin. J'ai édité la réponse. –