2014-02-25 10 views
6

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.

Antwort

3

Ich war nicht in der Lage, eine gute Lösung für mein Problem zu finden, und wollte nicht mit dem ASP spielen.NET WebStack Quelle mehr, also ließ ich mich mit einem hässlichen Abhilfe:

I "von Hand" injizieren, die fehlenden data-val-* Attribute, wenn die Eingabefelder machen, wie folgt aus:

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

Seit GetUnobtrusiveValidationAttributes (so genannte Stand-alone) erstellt die richtigen HTML-Attribute Ich nehme sie einfach und füge sie der TextBox hinzu. Definitiv nicht schön, aber es funktioniert und ich kann mit meiner Arbeit weitermachen. Wenn jemand eine bessere Lösung hat, würde ich mich freuen, es zu hören.

+0

Ich habe dies als ein Problem gemeldet: https://fluentvalidation.codeplex.com/workitem/7168 –