5

Ich suche nach einer Möglichkeit, unauffällige benutzerdefinierte Validierung für Fluent-Validierung zu implementieren. Laut der documentation scheint es nicht anzuzeigen, dass es eine unauffällige Validierung unterstützt.Unauffällige benutzerdefinierte/bedingte Validierung mit Fluent Validation

Gleiches gilt für die Verwendung der bedingten Validierung (When/Unless). Ich sehe in ihrer MVC documentation, unaufdringlichen Validierung nicht mit bedingter und anderer komplexer Validierung unterstützt:

Beachten Sie, dass FluentValidation auch mit ASP.NET MVC clientseitige Validierung arbeiten, aber nicht alle Regeln unterstützt werden. Zum Beispiel werden alle Regeln, die mit einer Bedingung (mit Wenn/Nicht), benutzerdefinierten Validatoren oder Aufrufen von Muss definiert sind, nicht auf der Client-Seite ausgeführt. Die folgenden Prüfungen werden auf dem Client unterstützt:

* NotNull/NotEmpty
* Spiele (regex)
* InclusiveBetween (Bereich)
* Credit
* Email
* EqualTo (Cross-Eigenschaft Gleichheitsvergleich)
* Länge

So jemand herausgefunden hat, wie diese Arbeit zu bekommen? Wenn nicht, gibt es andere Validierungsoptionen, die eine unauffällige benutzerdefinierte/komplexe Validierung besser unterstützen?

+0

Könnten Sie ein konkretes Beispiel für das liefern, was Sie erreichen wollen? Was ist dein genaues Szenario? –

+0

Nun, die When/Oiless-Methoden funktionieren nicht unauffällig, sie sind sowieso out-of-the-box.Selbst wenn ich eine Lösung finden könnte, die bei denen funktioniert, würde ich einen Schritt näher kommen. Wahrscheinlich würde es, wenn es mit Bedingungen wie When/Oiles funktioniert, wahrscheinlich auch mit einer benutzerdefinierten Validierung funktionieren. –

Antwort

1

Ich habe FluentValidation erfolgreich an ASP.NET MVC 3 angeschlossen, indem ich die Integration with ASP.NET MVC Dokumentation befolgte.

Der einfache Weg ist FluentValidation in das MVC Validation Framework in Global.asax Application_Start() wie folgt anschließen:

FluentValidationModelValidatorProvider.Configure(); 

Dann Sie Ihre POCO-Klassen mit dem Attribut dekorieren, den Validator spezifizieren sie verwenden.

[Validator(typeof(PersonValidator))] 
public class Person { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Email { get; set; } 
    public int Age { get; set; } 
} 

In meinem Fall, ich wollte nicht, das zu tun (Verwendung Attribute), und tatsächlich die gleiche POCO-Klasse gegen verschiedene Validatoren zur Validierung erforderlich, auf den Geschäftsregeln abhängig.

Wenn Sie auf diese Weise verschiedene Prüfer auswählen möchten, befolgen Sie die Anweisungen unter "custom validator factory with an IoC container". Erstellen Sie eine Klasse FluentMvcValidatorFactory-Unterklasse ValidatorFactoryBase, die die Schnittstelle IValidatorFactory implementiert. Die Custom Validator Factory kann die Auswahl des richtigen Validators übernehmen.

Ich habe versucht, clientseitige Validierung funktioniert (es tat), aber es scheint auch in unauffällige Validierung zu stecken. Mein HTML ausgegeben wird wie folgt aussehen:

<input type="text" value="" name="Email" id="Email" data-val-length-max="128" data-val-length="&amp;#39;Email&amp;#39; must be between 0 and 128 characters." data-val-email="&amp;#39;Email&amp;#39; is not a valid email address." data-val="true" class="text-box single-line"> 

Solange Sie es in MVC richtig stecken, ich glaube, unauffällig funktionieren sollte.

In der Praxis sollten Sie sich nicht ausschließlich auf clientseitige oder unauffällige Validierung verlassen, sondern nur zur Unterstützung des Benutzers bei der Eingabe verwenden. Letztendlich muss der Server validieren, aber Sie können Ihren serverseitigen Code die gleichen FluentValidation-Validatoren verwenden lassen.

+1

Danke für Ihren Beitrag. Ich habe tatsächlich Standardvalidierung funktioniert unauffällig, das Problem ist, die Wann/Wenn nicht bedingte Validierungen zu arbeiten, oder benutzerdefinierte Validierung (wo ich meine eigenen Validierungsregeln erstellen). –

+0

Ich sehe - also möchten Sie die benutzerdefinierten Validierungsregeln (Bedingungen) mit FluentValidation definieren, und diese Regeln in benutzerdefinierte jquery.unobtrusive.validation Regeln für die clientseitige Validierung umgewandelt haben? Das wird nicht unterstützt. Es würde also einen benutzerdefinierten Code benötigen, um die Lücke zu überbrücken. Wie wichtig ist es, die benutzerdefinierten Regeln auf der Client-Seite zu haben, nicht mit einem Server-Post? Vielleicht ist es Overkill. Der Grund für die Verwendung von FluentValidation besteht darin, dass Sie weniger Code schreiben - dieselben Validierungsregeln für Client und Server. –

+1

Ich stimme zu. Es gibt jedoch viele Fälle, in denen die Validierung einiger Felder nur in einigen Fällen erforderlich ist (d. H. Versandadressenfelder erfordern, wenn das Kontrollkästchen "Wie Fakturierung" nicht aktiviert ist). Für mich scheint dies eine allgemeine Anforderung zu sein, und wie Sie bereits gesagt haben, möchte ich keine separate Validierung dafür schreiben müssen, da die unauffällige Validierung für diese "Wann/Außer" -Konditionen nicht funktioniert. –