Modele etat des lieu

By : | 0 Комментариев | On : Февраль 19, 2019 | Category : Без рубрики

Notez que nous devons utiliser $set pour créer les propriétés modelState. C`est parce que vue ne peut pas réagir à de nouvelles propriétés. La méthode vue. Set (et son alias $set) ajoute une propriété réactive pré-encapsulée à un objet. Le POST renvoie ensuite une vue créée à partir d`un ViewModel non valide, ce qui donne des avertissements de validation. Modelclasseurs. classeurs. Add (typeof (Decimal?), New DecimalModelBinder ()); ModelState a deux objectifs: stocker la valeur soumise au serveur et stocker les erreurs de validation associées à ces valeurs. Le serveur retournera un code d`état 400 (requête incorrecte) si ModelState n`est pas valide, nous devons donc l`intercepter. Vous pouvez le faire comme l`exemple ci-dessus, ou simplement fournir une fonction «erreur».

Dans l`exemple ci-dessus, nous analyons la réponse et la passons au plugin jQuery Validate pour afficher les erreurs. Dans ce cas, le DefaultModelBinder étouffe sur la valeur. C`est malheureux parce que jQuery Validate permet à cette valeur très bien. Je vais parler au reste de mon équipe pour savoir si nous devrions résoudre ce problème dans la prochaine version de ASP.NET MVC, mais pour l`instant il est bon de savoir qu`il ya une solution de contournement. Voici le code de mon DecimalModelBinder. Je devrais probablement écrire un pour d`autres types de décimales aussi, mais je suis paresseux. Notez que nous avons l`attribut [ValidateModelState] sur l`action POST et un attribut [ImportModelStateFromTempData] sur l`action GET. Comme le suggère la même chose, cela indique au serveur de renseigner ModelState à partir de TempData (s`il existe).

Super, maintenant si ModelState n`est pas valide, nous pouvons reconstruire le modèle, puis le passer à la vue. J`ai fait diverses tentatives pour reconstruire le modèle de vue à l`intérieur de Onactionexecution. Le premier problème est que ViewData. Model se trouve être null à ce stade. Nous pouvons l`attraper à partir de ControllerBase. ActionParameters mais nous sommes présentés avec le deuxième problème, il est stocké comme une instance de System. Object. Localiser le «constructeur de modèles» approprié est possible, mais nécessite un peu de réflexion, et pour être honnête, est totalement unecessary.

L`une des raisons possibles est que ModelState n`est pas conservé entre les requêtes. Il peut être, mais vous devez le copier quelque part plus permanent. TempData est un endroit idéal pour cela et puisque je ne suis pas la première personne à avoir ce moment de clarté, il y a déjà du code disponible pour le faire (dans MvcContrib et par Kazi Manzur Rashid). Le filtre ValidateModelState détecte si une demande est une requête AJAX et retourne des erreurs ModelState au format JSON à la place, que vous pouvez ensuite traiter sur le client: efface les entrées ModelStateDictionary qui correspondent à la clé passée en tant que paramètre. Si la deuxième vue est identique à la première, le ViewModel doit être valide, ou l`affichage ne sera pas correct, en raison des propriétés manquantes. Définit le RawValue et la valeur de tentative pour le ModelStateEntry avec la clé spécifiée. En ce qui me concerne, une action de contrôleur ne doit pas être exécutée si ModelState n`est pas valide. J`utilise MVC. J`ai ajouté une expression régulière dans mon ViewModel pour forcer les utilisateurs à entrer un nombre avec 1 ou 2 décimales.

Je pense qu`il doit y avoir une erreur dans mon Regex, mais la même déclaration fonctionne bien ailleurs. Cela signifie Model. IsValid = = false. Si j`avais un résumé de validation sur la page-cela l`invoquerait. Si la deuxième vue est différente de la première, vous devez utiliser un autre ViewModel, qui contient uniquement les propriétés nécessaires pour la deuxième vue, sans avertissements de validation il ne fonctionne que pour moi quand je retire le symbole de devise de la chaîne. Comme ceci: valueResult. tentative Tedvalue. Replace (CultureInfo. CurrentCulture. NumberFormat.

CurrencySymbol, String. Vide). Trim () le ActionFilter ci-dessus fait plus ou moins le même travail que le code au début de cet article. Le problème est que ModelState contient uniquement les propriétés du Model qui ont été validées sur le serveur et gérées par le classeur de modèles MVC. Même dans les applications ASP.NET MVC simples de votre GET «vue» est susceptible d`être plus complexe que votre POST «commande»-peut-être vous avez quelques propriétés SelectList nécessaires pour construire votre formulaire.

FavoriteLoadingДобавить в Избранные
Share This Post!