2017-09-11 4 views
2

Ich habe folgendes Kind Validator mit zwei Konstrukteuren eine ohne Parameter und der anderen vorbei geordnete Objekt als Parameter:FluentValidation Child Validator Nachricht nicht angezeigt

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"); 
    } 
} 

Eltern Validator:

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)); 
    } 
} 

Modelle:

[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 Kinder Teilansicht:

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

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

Die Validierung funktioniert einwandfrei. Während jedoch die Nachricht für den Validierer ohne Parameter angezeigt wird, ist die Nachricht für den Validierer mit Parameter nicht gültig.

+0

nennen Wie Kind zum Vater hat? Eins zu viele? –

+0

@PateeGutee Eins zu viele. Frage aktualisiert – corix010

+0

Wo legen Sie den Collection Validator fest? Ich weiß, dass Sie sagen, dass es einen Validator für das Kind gibt, aber müssen Sie nicht noch im Parent Validator angeben, dass die Kinder einen Sammlungsvalidator verwenden? –

Antwort

1

Das Problem, das verursacht wird, indem Teilansicht für Kinder verwendet wird. Wenn Sie @Html.Partial("PartialViewName", model.Children[i]) anrufen, verlieren Sie Children [i] Teil des Ausdrucks. Mit anderen Worten, ModelState enthält den Schlüssel "Children[0].LastName", wenn Sie die Validierungsnachricht für den Schlüssel "LastName" rendern.

Sehr wahrscheinlich sehen Sie eine Nachricht für parameterlosen Validator, da die clientseitige Validierung hier funktioniert. Aber für Validator mit Parameter verwenden Sie benutzerdefinierte Logik, die durch ModelState funktioniert.

Die Lösung ist Ihr Teilansicht Inhalt zur Hauptansicht oder mit Editor-Vorlage statt Teilansicht verschieben: Teilansicht auf/controller/EditorTemplates/Ordner verschieben und @Html.EditorFor(m => m.Children[i], "PartialViewName")

Verwandte Themen