2013-06-21 6 views
5

Korzystanie FluentValidation 4.4, następujące zasady emitują prawidłowe dyskretne dane poprawności atrybutów pól wejściowych:Dyskretne atrybuty danych walidacji klienta nie są świadczone dla zagnieżdżonych zasad własności

RuleFor(e => e.PrimaryContact).NotEmpty(); 

świadczących następujące HTML:

<input class="text-box single-line k-textbox input-validation-error" 
     data-val="true" data-val-required="'Primary Contact' should not be empty." 
     id="PrimaryContact" name="PrimaryContact" type="text" value=""> 

Jednak reguła z zagnieżdżoną właściwością nie wysyła żadnych atrybutów sprawdzania poprawności:

RuleFor(e => e.Company.Name).NotEmpty(); 

renderowania następujący kod HTML:

<input class="text-box single-line k-textbox" id="Company_Name" name="Company.Name" type="text" value=""> 

Czego mi brakuje?

Odpowiedz

4

To może się nieco zaniedbany w przypadku, że trzeba potwierdzić na każdym obiekcie w obiekcie dziecięcej. Polecam robić to, co mają na swoich documentation here.

[Validator(typeof(ParentObjectValidator))] 
public class ParentObject 
{ 
    public string PrimaryContact {get;set;} 
    public Company Company {get;set;} 
} 

[Validator(typeof(CompanyValidator))] // This one is required! 
             // Otherwise no data-val-required will be assigned 
public class Company 
{ 
    public string Name {get;set;} 
} 

Ustaw weryfikator dla obiektu podrzędnego.

public class CompanyValidator : AbstractValidator<Company> { 
    public CompanyValidator() { 
     RuleFor(company => company.Name).NotEmpty(); 
     //etc 
    } 
} 

Następnie w obiekcie nadrzędnym, można ustawić ten walidator do obiektu podrzędnego jak tak.

public class ParentObjectValidator : AbstractValidator<ParentObject> { 
    public ParentObjectValidator() { 
    RuleFor(e => e.PrimaryContact).NotEmpty(); 
    RuleFor(e => e.Company).SetValidator(new CompanyValidator()); 
    } 
} 

To powinno wskazać Ci właściwy kierunek!

+0

Próbowałem tego uniknąć, ponieważ miałem wiele właściwości firmy z różnymi regułami. W końcu stworzyłem dwa osobne modele firmowe z własnymi implementacjami walidatorów. – jrummell

2

już mam ten sam problem jak "jrummel" !!!

Gdybym określić walidator z SetValidator dla mojego ViewModel zagnieżdżonego obiektu, MVC EditorFor Metoda didnt't czynią żadnych danych-Val * atrybutów. I tak nie walidacja po stronie klienta nie działa ...

Ale każda inna własność (co nie jest zagnieżdżona jest zagnieżdżony viewModelType) działa bardzo dobrze. Wejścia mają atrybuty data-val *. -> WTF?

Po tym, jak odnalazłem http://www.paraesthesia.com/archive/2013/04/17/fluentvalidation-and-mvc-from-server-to-client.aspx i zrozumiałem, jak działa mechanizm sprawdzania poprawności, rozpoznałem, że brakuje mi atrybutu [Validator(typeof(MyNestedViewModelType))] Atrybut na MyNestedViewModelType.

Mam nadzieję, że pomoże to komuś zaoszczędzić czas ;-)

+0

Dokładnie taka sama sytuacja, dodanie [Validator (typeof (...)] rozwiązało problem, ale .... Co jeśli childviewmodel jest rodzajem ogólnego modelu widoku i walidacja powinna nastąpić w zależności od kontekstu nadrzędnego. prawdziwy dylemat przychodzi. W każdym razie dzięki za podzielenie się swoimi przemyśleniami pomógł !! –

Powiązane problemy