Ich verwende FluentValidation, um meine ASP.NET MVC 5.1-Ansichtsmodelle zu validieren (mit der standardmäßigen, unauffälligen clientseitigen Validierung). Ich registriere/eröffne mein Validatoren über Ninject (keine Attribute auf dem Viewmodel):ASP.NET MVC + FluentValidation + PartialView> keine clientseitige Validierung
FluentValidationModelValidatorProvider.Configure(x => x.ValidatorFactory = new NinjectValidatorFactory(_kernel));
AssemblyScanner.FindValidatorsInAssembly(Assembly.GetExecutingAssembly()).ForEach(match => _kernel.Bind(match.InterfaceType).To(match.ValidatorType));
ich eine Teilansicht, die oft in der gesamten Anwendung verwendet wird. Diese Teilansicht hat ein eigenes Viewmodel. Das "Main" Viewmodel (das für die gesamte View) erbt nur von diesem "Teil" Viewmodel.
public class IndexViewModel : PersonalInfoViewModel { ... }
Das gleiche Muster wird auf den Validatoren verwendet:
public class IndexValidator : PersonalInfoValidator { ... }
Dies funktioniert gut und die serverseitige Validierung funktioniert sowie die clientseitige Validierung auf der „main“ Ansicht. Die clientseitige Validierung der Teilansicht wird jedoch nicht ausgelöst (keine data-val-*
Attribute auf Eingabefeldern).
Meine "main" Ansicht 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
Ich bemerkte, dass es funktioniert, wenn ich das Modell für die Teilansicht auf das "main" Ansichtsmodell ändern:
@model IndexViewModel
@Html.TextBoxFor(x => x.FirstName) // client-side validation works
Also ich denke irgendwo beim Aufbau der Client-Seite Validierung der korrekte Validator wird nicht abgeholt und keine data-val-*
Attribute werden in den HTML-Code eingefügt. Aber ich kann das Viewmodel in der Teilansicht nicht ändern, da es auf mehreren verschiedenen Seiten mit verschiedenen "Haupt" -Sichten verwendet wird (alle erben jedoch von PersonalInfoViewModel).
Irgendwelche Ideen, wie man meine clientseitige Validierung in diesem Fall funktioniert?
aktualisieren
Nach ein paar Stunden von der Quelle durch die ASP.NET WebStack graben, fand ich, dass das Problem in der TextBoxFor
Verfahren aufzutreten scheint. Dort wird die ModelMetaData
aus dem Modell erstellt - und dort irgendwo beginnt es IndexViewModel
statt PersonalInfoViewModel
zu verwenden, die Metadaten für die clientseitige Validierung zu erhalten:
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
Html.GetUnobtrusiveValidationAttributes("FirstName", metadata); // no client-side validation attributes found
Aber dies erzeugt die richtige clientseitige Validierung, wenn ich Attribute spezifiziere die Metadaten nicht explizit:
Leider habe ich noch keinen Weg gefunden, dieses Wissen zu meinem Vorteil zu nutzen.
Ich habe dies als ein Problem gemeldet: https://fluentvalidation.codeplex.com/workitem/7168 –