2017-05-02 1 views
0

Je suis en train de valider la liste des entrées objet dans mon WebAPI 2.Courant de validation ne fonctionne pas pour objet de liste

mais ce n'est pas valider. Modelstate est toujours défini sur true.

Exemple de code:

public class A 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class ClassAValidator : AbstractValidator<A> 
{ 
    public classAValidator() 
    { 
     RuleSet("ClassA",()=>{ 
      RuleFor(x => x.Id).NotEmpty().WithMessage("The Idcan't be Empty or Zero"); 
      RuleFor(x => x.Name).NotEmpty().Length(10).WithMessage("Name Should be Six Char length"); 
     }); 
    } 
} 

Note: Le champ de chaîne, nous devons être exactement 6 caractères.

Api:

[HttpPut] 
public async Task<IHttpActionResult> Put([FromBody] List<A> alist) 
{ 
    if(!ModelState.IsValid) throw new InvalidDataException(ModelState,"Data Validation Failed for Upload Class A"); 
    // Model State is Always true 
} 

Quelqu'un peut-il indiquer ce que j'ai manqué?

Mise à jour: J'ai essayé comme indiqué dans Should i create a new Type for Collection in FluentValidation?

mais ayant la même question.

Résolu Mise à jour:

problème est l'utilisation de Ruleset a provoqué la validation ne se Déclenché. En enlevant "RuleSet" cela a fonctionné même sans avoir la définition de la classe List [A] Validator. Message de Jeremy Skinner: Le premier problème est que vos règles sont enveloppées dans un jeu de règles, elles ne seront donc jamais exécutées. Les ensembles de règles sont opt-in, et l'intégration automatique n'appelle que des règles ne figurant pas dans un ensemble de règles.

Répondre

0

problème est l'utilisation de la validation Ruleset CAUSÉS Non ge Déclenché. En enlevant "RuleSet" cela a fonctionné même sans avoir la définition de la classe List [A] Validator. Message de Jeremy Skinner: Le premier problème est que vos règles sont enveloppées dans un jeu de règles, elles ne seront donc jamais exécutées. Les ensembles de règles sont opt-in, et l'intégration automatique n'appelle que des règles ne figurant pas dans un ensemble de règles.

-1

Il semble que vous ayez besoin du RuleSet enveloppé dans un constructeur, au moins selon cet exemple.

https://www.exceptionnotfound.net/custom-validation-in-asp-net-web-api-with-fluentvalidation/

public class ClassAValidator : AbstractValidator<A> 
{ 
    Public ClassAValidator() 
    { 
     RuleSet("ClassA",()=>{ 
     RuleFor(x => x.Id).NotEmpty().WithMessage("The Id can't be Empty or Zero"); 
     RuleFor(x => x.Name).NotEmpty().Length(10).WithMessage("Name Should be Six Char length"); 
     }); 
    } 

} 
+0

désolé oublié d'ajouter constructeur .. Oui, j'ai effectivement – RajGan

2

D'abord, ModelState.IsValid est une construction ASP.NET MVC vérification (par défaut) ce modèle de liaison a été fait correctement. Sauf si vous l'avez configuré dans votre configuration MVC, cela n'a rien à voir avec FluentValidation.

Vous devez vous assurer que les validateurs sont en cours d'appel. Pour valider une liste des A et des éléments de, vous avez besoin de deux valideurs: l'un pour le type A, et un pour une liste/Collection/IEnumerable de A:

public class ClassAValidator : AbstractValidator<A> 
{ 
    public ClassAValidator() 
    { 
     RuleFor(x => x.Id).NotEmpty().WithMessage("Id can't be empty"); 
     RuleFor(x => x.Name).NotEmpty().Length(10).WithMessage("Name should have length 10"); 
    } 
} 

public class ClassACollectionValidator : AbstractValidator<IEnumerable<A>> 
{ 
    public ClassACollectionValidator() 
    { 
     RuleFor(x =>x).SetCollectionValidator(new ClassAValidator()); 
    } 
} 

Vous pouvez ensuite valider votre liste comme suit

[HttpPut] 
public async Task<IHttpActionResult> Put([FromBody] List<A> alist) 
{ 
    if(!ModelState.IsValid) throw new InvalidDataException(ModelState,"Data Validation Failed for Upload Class A"); 

    var validator = new ClassACollectionValidator(); 
    var result = validator.Validate(alist); 
} 

Sinon, vous pouvez combiner les deux validateurs comme suit:

public class ClassACollectionValidator : AbstractValidator<IEnumerable<A>> 
{ 
    public ClassACollectionValidator() 
    { 
     RuleForEach(x => x.Id).NotEmpty().WithMessage("Id can't be empty"); 
     RuleForEach(x => x.Name).NotEmpty().Length(10).WithMessage("Name should have length 10"); 
    } 
} 
+0

Merci pour votre réponse Utilisation de Ruleset causé le problème .. – RajGan