Frage

Ich verwende FluentValidation, um meine ASP.NET MVC 5.1-Ansichtsmodelle zu validieren (unter Verwendung der standardmäßigen unauffälligen clientseitigen Validierung).Ich registriere/erstelle meine Validatoren über Ninject (keine Attribute in den Ansichtsmodellen):

FluentValidationModelValidatorProvider.Configure(x => x.ValidatorFactory = new NinjectValidatorFactory(_kernel));
AssemblyScanner.FindValidatorsInAssembly(Assembly.GetExecutingAssembly()).ForEach(match => _kernel.Bind(match.InterfaceType).To(match.ValidatorType));

Ich habe eine Teilansicht, die in der gesamten Anwendung häufig verwendet wird.Diese Teilansicht verfügt über ein eigenes Ansichtsmodell.Das „Haupt“-Ansichtsmodell (das für die gesamte Ansicht) erbt einfach von diesem „Teil“-Ansichtsmodell.

public class IndexViewModel : PersonalInfoViewModel { ... }

Das gleiche Muster wird bei den Validatoren verwendet:

public class IndexValidator : PersonalInfoValidator { ... }

Dies funktioniert einwandfrei und die serverseitige Validierung funktioniert ebenso wie die clientseitige Validierung in der „Haupt“-Ansicht.Die clientseitige Validierung der Teilansicht wird jedoch nicht ausgelöst (Nr data-val-* Attribute auf dortigen Eingabefeldern).

Meine „Hauptansicht“. Index.cshtml

@model IndexViewModel
@Html.TextBoxFor(x => x.SomeProperty) // client-side validation works fine

@Html.Partial("PersonalInfo") // client-side validation in the partial view does not work (see below)

Meine Teilansicht PersonalInfo.cshtml:

@model PersonalInfoViewModel
@Html.TextBoxFor(x => x.FirstName) // client-side validation does not work

Mir ist aufgefallen, dass es funktioniert, wenn ich das Modell für die Teilansicht in das „Haupt“-Ansichtsmodell ändere:

@model IndexViewModel
@Html.TextBoxFor(x => x.FirstName) // client-side validation works

Ich vermute also, dass beim Erstellen der clientseitigen Validierung irgendwo nicht der richtige Validator ausgewählt wird und nein data-val-* Attribute werden in den HTML-Code eingefügt.Ich kann das Ansichtsmodell der Teilansicht jedoch nicht ändern, da es auf mehreren verschiedenen Seiten mit unterschiedlichen „Haupt“-Ansichten verwendet wird (allerdings erben alle von PersonalInfoViewModel).

Irgendwelche Ideen, wie ich meine clientseitige Validierung in diesem Fall zum Laufen bringen kann?

Aktualisieren

Nachdem ich ein paar Stunden lang die ASP.NET WebStack-Quelle durchforstet hatte, stellte ich fest, dass das Problem in der aufzutreten scheint TextBoxFor Methode.Da die ModelMetaData wird aus dem Modell erstellt - und dort irgendwo beginnt es zu verwenden IndexViewModel anstatt PersonalInfoViewModel So erhalten Sie die Metadaten für die clientseitige Validierung:

ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
Html.GetUnobtrusiveValidationAttributes("FirstName", metadata); // no client-side validation attributes found

Dies generiert jedoch die richtigen clientseitigen Validierungsattribute, wenn ich die Metadaten nicht explizit angebe:

Html.GetUnobtrusiveValidationAttributes("FirstName");

Leider habe ich bisher keine Möglichkeit gefunden, dieses Wissen zu meinem Vorteil zu nutzen.

War es hilfreich?

Lösung

Ich konnte keine gute Lösung für mein Problem finden und wollte nicht mehr mit der ASP.NET WebStack-Quelle herumspielen, also habe ich mich mit einer hässlichen Problemumgehung zufrieden gegeben:

Das Fehlende spritze ich „manuell“ ein data-val-* Attribute beim Rendern der Eingabefelder, etwa so:

@Html.TextBoxFor(x => x.FirstName, Html.GetUnobtrusiveValidationAttributes("FirstName"))

Seit GetUnobtrusiveValidationAttributes (Standalone genannt) erstellt die richtigen HTML-Attribute. Ich nehme sie einfach und füge sie der TextBox hinzu.Sicherlich nicht schön, aber es funktioniert und ich kann mit meiner Arbeit weitermachen.Wenn jemand eine bessere Lösung hat, würde ich mich sehr darüber freuen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top