FluentValidation.Net erzeugt keine clientseitige unauffällige Validierung bei Verwendung von .SetValidator ()

8

Ich versuche, die clientseitige Validierung für eine Seite zu aktivieren, die Editor-Vorlagen verwendet.

Ein vereinfachtes Beispiel für mein Ansichtsmodell ist z.B.:

%Vor%

Das Kindmodell ist z.B.:

%Vor%

Mein Validator ist z.B.:

%Vor%

Und der Kindmodell-Validierer ist z.B.:

%Vor%

Ich habe FluentValidation.Net mit MVC3 registriert, indem ich Application_Start () folgendes hinzugefügt habe:

%Vor%

Dies erzeugt eine unauffällige clientseitige Validierung perfekt für die beiden Eigenschaften Name und Alter, aber nichts für die Eigenschaften im ChildModel.

Irgendwelche Ideen, was ich hier falsch mache?

Update: Es scheint in Ordnung zu sein, wenn ich das ChildModel nur mit dem Validator-Attribut annotiere, aber ich möchte die Validierung bedingt anwenden, daher die Verwendung von SetValidator ().

    
magritte 31.01.2012, 11:12
quelle

3 Antworten

1

Ich habe versucht, die Dokumentation Ссылка zu analysieren. Es besagt, dass die MVC-Integration standardmäßig auf den Attributen basiert, da die Validator Factory das Attribut verwendet, um den entsprechenden Validator zu instanziieren. Anscheinend validiert es das ChildModel, auf das die Eigenschaft im Hauptmodell verweist, aber vielleicht ist dies nur eine automatische rekursive Traversierung der Modellstruktur, um den clientseitigen Validierungscode zu generieren. Es könnte also denselben Mechanismus verwenden, um den geeigneten Validator für den ChildModel-Typ zu finden. Können Sie testen, was passiert, wenn Sie die SetValidator-Regel entfernen (aber das Attribut für ChildModel belassen), ob die Validatoren immer noch basierend auf dem Attribut generiert werden?

Es gibt eine explizite Liste von Validatoren, die auf der Clientseite unterstützt werden, aber leider wird SetValidator dort nicht erwähnt (oder erklärt), was ein schlechtes Zeichen ist.

Das Dokument gibt außerdem an, dass Regeln, die eine Bedingung verwenden, auf der Clientseite nicht unterstützt werden, daher können Sie mit der Verwendung von SetValidator wahrscheinlich nicht umgehen (wie Sie in Ihrem Update angegeben haben).

Siehe auch diese Diskussion über clientseitige bedingte Regeln: Ссылка . Der Vorschlag war, die bedingte Regel in JS mit jQuery Validation zu implementieren, dies kann jedoch kompliziert sein, wenn Sie eine komplexe Validierung haben, die bedingt hinzugefügt werden sollte.

Wie wäre es, wenn man die Validatoren mit dem Attribut versehen würde, sie dann aber irgendwie unterdrückt? Z.B. indem Sie danach die unauffälligen Attribute aus den Elementen entfernen?

    
Tz_ 04.09.2012 22:02
quelle
1

Wie Sie in Ihrem Update angeben, müssen Sie den Kindtyp mit dem Validator dekorieren, wenn Sie das unauffällige Markup ausgeben möchten. Sie können diese bedingt dann in der "übergeordneten" Validierungsklasse verwenden, indem Sie sie in einen if-Block einfügen oder die When () -Methode von FluentValidation verwenden, um einen Ausdruck zu verwenden.

Beachten Sie auch, dass Sie auch Regeln für Eigenschaften verketten können (d. h. die fließende Schnittstelle verwenden):

%Vor%     
MarkG 19.12.2012 12:55
quelle
0

Falls jemand anderes das gleiche Problem hat:

Sie müssen das Validator-Attribut in Ihrem ChildModel too

hinzufügen %Vor%

und behalten Sie alle anderen Codes, wie es ist, dann funktioniert es auf der Client-Seite

    
RezaRahmati 05.09.2016 15:50
quelle