2017-09-11 23 views
2

je le validateur enfant qui suit avec deux constructeurs un sans paramètre et l'autre objet parent qui passe comme paramètre:FluentValidation enfant Validator message Non Affichage

public class ChildValidator : AbstractValidator<Child> 
{ 
    public ChildValidator() 
    { 
     RuleFor(x => x.LastName) 
      .NotEmpty() 
      .WithMessage("Last Name is required"); 
    } 

    public ChildValidator(Parent parent) 
    { 
     RuleFor(x => x.LastName) 
      .Equal(x => parent.LastName) 
      .WithMessage("Parent and child Last Name must be equal"); 
    } 
} 

Parent validateur:

public class ParentValidator : AbstractValidator<Parent> 
{ 
    public ParentValidator() 
    { 
     RuleFor(x => x.LastName) 
      .NotEmpty() 
      .WithMessage("Last Name is required"); 

     RuleFor(x => x.Children) 
      .SetCollectionValidator(parent => new ChildValidator(parent)); 
    } 
} 

Modèles:

[FluentValidation.Attributes.Validator(typeof(ParentValidator))] 
public class Parent 
{ 
    public string LastName { get; set; } 

    public virtual ICollection<Child> Children { get; set; } 
} 

[FluentValidation.Attributes.Validator(typeof(ChildValidator))] 
public class Child 
{ 
    public string LastName { get; set; } 

    public int ParentId { get; set; } 
    public virtual Parent Parent { get; set; } 
} 

In Enfant vue partielle:

@using (Html.BeginCollectionItem("Children")) 
{ 
    @Html.HiddenFor(model => model.Id) 
    @Html.HiddenFor(model => model.ParentId) 

    @Html.EditorFor(model => model.LastName) 
    @Html.ValidationMessageFor(model => model.LastName) 

La validation fonctionne correctement. Cependant, alors que le message pour le validateur sans paramètre est affiché, le message pour validateur avec paramètre ne l'est pas.

+0

Comment l'enfant lié à la mère? Un-à-plusieurs? –

+0

@PateeGutee One-to-Many. Question mise à jour – corix010

+0

Où définissez-vous le validateur de collection? Je sais que vous dites qu'il existe un validateur pour l'enfant, mais ne devez-vous pas encore spécifier dans le validateur parent que les enfants utilisent un validateur de collection? –

Répondre

1

Problème causé par l'utilisation d'une vue partielle pour les enfants. Lorsque vous appelez @Html.Partial("PartialViewName", model.Children[i]), vous perdez les enfants [i] une partie de l'expression. En d'autres termes, ModelState contient la clé "Children[0].LastName", lorsque vous affichez le message de validation pour la clé "LastName". Vous verrez très probablement un message pour un validateur sans paramètre, car la validation côté client fonctionne ici. Mais pour le validateur avec le paramètre que vous utilisez la logique personnalisée, cela fonctionne à travers ModelState.

La solution est de déplacer le contenu de votre vue partielle à la vue principale, ou en utilisant le modèle d'éditeur au lieu de vue partielle: déplacer vue partielle/ControllerName/EditorTemplates/dossier et appelez @Html.EditorFor(m => m.Children[i], "PartialViewName")