Question

J'utilise FluentValidation pour valider mes modèles de vue ASP.NET MVC 5.1 (en utilisant la validation discrète côté client par défaut).J'inscris/crée mes validateurs via Ninject (pas d'attributs sur les viewmodels) :

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

J'ai une vue partielle qui est souvent utilisée dans toute l'application.Cette vue partielle possède son propre modèle de vue.Le modèle de vue "principal" (celui de la vue entière) hérite simplement de ce modèle de vue "partiel".

public class IndexViewModel : PersonalInfoViewModel { ... }

Le même modèle est utilisé sur les validateurs :

public class IndexValidator : PersonalInfoValidator { ... }

Cela fonctionne bien et la validation côté serveur fonctionne ainsi que la validation côté client sur la vue "principale".Mais la validation côté client sur la vue partielle n'est pas déclenchée (non data-val-* attributs sur les champs de saisie là-bas).

Ma vue "principale" 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)

Ma vision partielle PersonalInfo.cshtml:

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

J'ai remarqué que cela fonctionne lorsque je change le modèle de la vue partielle en modèle de vue "principal":

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

Donc je suppose que quelque part lors de la construction de la validation côté client, le bon validateur n'est pas récupéré et non data-val-* les attributs sont injectés dans le HTML.Mais je ne peux pas modifier le modèle de vue sur la vue partielle, car il est utilisé sur plusieurs pages différentes avec des vues "principales" différentes (toutes héritent cependant de PersonalInfoViewModel).

Des idées sur la façon de faire fonctionner ma validation côté client dans ce cas ?

Mise à jour

Après quelques heures passées à fouiller dans les sources d'ASP.NET WebStack, j'ai découvert que le problème semble se produire dans le TextBoxFor méthode.Ici le ModelMetaData est créé à partir du modèle - et quelque part, il commence à utiliser IndexViewModel au lieu de PersonalInfoViewModel pour obtenir les métadonnées pour la validation côté client :

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

Mais cela génère les attributs de validation côté client corrects si je ne spécifie pas explicitement les métadonnées :

Html.GetUnobtrusiveValidationAttributes("FirstName");

Malheureusement, je n’ai pas encore trouvé le moyen d’utiliser ces connaissances à mon avantage.

Était-ce utile?

La solution

Je n'ai pas réussi à trouver une solution intéressante à mon problème et je ne voulais plus jouer avec la source ASP.NET WebStack, j'ai donc opté pour une solution de contournement laide :

J'injecte "manuellement" les manquants data-val-* attributs lors du rendu des champs de saisie, comme ceci :

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

Depuis GetUnobtrusiveValidationAttributes (appelé autonome) crée les attributs HTML corrects, je les prends simplement et les ajoute à TextBox.Ce n'est certainement pas beau, mais ça marche et je peux continuer mon travail.Si quelqu'un a une meilleure solution, je serais très heureux de l'entendre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top