2017-08-18 25 views
0

couramment Bonjour Je suis en train d'obtenir une réponse de validation personnalisée pour mon WebAPI à l'aide de base .NET.Utilisez les réponses de validation personnalisées avec validation

Ici, je veux avoir le modèle de réponse comme

[{ 
    ErrorCode: 
    ErrorField: 
    ErrorMsg: 
}] 

J'ai une classe de validateur et actuellement, nous vérifions juste ModalState.IsValid pour la validation d'erreur et de transmettre l'objet ModelState comme BadRequest.

Mais la nouvelle exigence veut que nous ayons ErrorCodes pour chaque échec de validation.

Mon échantillon Validator classe

public class TestModelValidator : AbstractValidator<TestModel>{ 

public TestModelValidator { 
    RuleFor(x=> x.Name).NotEmpty().WithErrorCode("1001"); 
    RuleFor(x=> x.Age).NotEmpty().WithErrorCode("1002"); 
    } 
} 

Je peux utiliser quelque chose de similaire dans mes actions pour obtenir le résultat de la validation

Opt1:

var validator = new TestModelValidator(); 
    var result = validator.Validate(inputObj); 
    var errorList = result.Error; 

et manipuler ValidationResult à mon objet de réponse customn. ou
Opt2:

I can use [CustomizeValidator] attribute and maybe an Interceptors. 

mais pour Opt2 Je ne sais pas comment récupérer ValidationResult de intercepteur à l'action du contrôleur.

Tout ce que je veux est d'écrire une méthode commune pour que j'éviter d'appeler Opt1 dans toutes les méthodes d'action du contrôleur pour la validation.

Demande de me pointer vers corriger ressources.

Répondre

0

Référez ce lien pour la réponse: https://github.com/JeremySkinner/FluentValidation/issues/548

Solution:

Ce que je fait est créé une classe BaseValidator qui a hérité à la fois IValidatorInterceptor et AbstractValidator. Dans la méthode afterMvcvalidation, si la validation échoue, j'ai mappé l'erreur de validationResult à mon objet de réponse personnalisé et lancé l'exception personnalisée.

que j'attrape dans mon middleware de gestion des exceptions et la réponse retour.

Le problème de sérialisation où le contrôleur obtient objet nul:

Je vois ModelState.IsValid sera réglé sur false lorsque Json désérialisation échoue lors de modèle de liaison et les détails d'erreur seront stockés dans ModelState. [Ce qui est ce qui m'arrive]

Également en raison de cette défaillance La désérialisation s'arrête pour continuer plus loin et obtenir l'objet nul dans la méthode du contrôleur.

Actuellement, j'ai donné piratage en définissant la serialization errorcontext.Handled = true manuellement et en permettant à ma validation courante d'attraper l'entrée invalide.

https://www.newtonsoft.com/json/help/html/SerializationErrorHandling.htm [défini OnErrorAttribute dans mon modèle de demande].

Je suis à la recherche d'une meilleure solution mais pour l'instant ce hack fait le travail ..