J'ai certains panneaux sur ma page cachés dans certaines circonstances. P>
Par exemple, je pourrais avoir une "adresse de facturation" et "adresse de livraison" et je ne veux pas valider "Adresse de livraison" si une case à cocher "ShippingSameAsBillingLill" est cochée. P>
J'essaie d'utiliser le nouveau Capacités de basenotation de ASP.NET MVC 2 (Aperçu 1) pour y parvenir. P>
J'ai besoin d'empêcher la validation de l'adresse de livraison lorsqu'il n'est pas affiché et qu'il ne faut pas trouver le chemin de la réalisation. Je parle principalement du côté serveur par opposition à Utilisation de jQuery . P>
Comment puis-je y parvenir? J'ai eu plusieurs idées, liées à la liaison de modèle personnalisée, mais ma meilleure solution actuelle est ci-dessous. Tout retour sur cette méthode? P>
7 Réponses :
Pour la Checkoutmodel, j'utilise cette approche (la plupart des champs masqués): Le classeur de modèle personnalisé supprime toutes les erreurs de modèle de modèle pour les champs commençant par "LivraisonAdress" s'il en trouve. Alors 'tryupdateemodel ()' reviendra true. P> toutes meilleures solutions? P> P>
Bonne idée mais je n'aime pas la pensée de supprimer les erreurs de la liste après avoir été ajoutées. Je préférerais ne pas les ajouter en premier lieu.
Article très utile. L'aperçu ASP.NET MVC 2 utilise des données de basenotation dans la valeur par défautModelbinder. Cependant, cela ne répond pas spécifiquement à ma question, mais merci d'avoir posté
Je peux voir votre situation de prédiction. Je cherche également d'autres solutions de validation également en ce qui concerne les règles de validation complexes qui pourraient s'appliquer à plus d'une propriété sur un objet de modèle donné ou même de nombreuses propriétés à partir de différents objets de modèle dans un graphique d'objet (si vous avez suffisamment malchanceux pour valider des objets liés. comme ça). P>
La limitation de l'interface code> idataerrrorinfo code> est qu'un objet de modèle répond à l'état valide simplement lorsque aucune des propriétés n'a d'erreur. C'est-à-dire qu'un objet fort> valide strong> est celui où toutes ses propriétés sont également Donc j'ai trouvé ce Approche de délégué . Maintenant, bon nombre des avancées utiles en MVC n'existaient pas au moment de la rédaction de cet article, mais le concept de base devrait vous aider. Plutôt que d'utiliser des attributs pour définir les conditions de validation d'un objet, nous créons des fonctions déléguées qui valident des exigences plus complexes et, car elles sont déléguées, nous pouvons les réutiliser. Bien sûr, c'est plus de travail, mais l'utilisation de délégués signifie que nous devrions pouvoir écrire du code de la règle de validation une fois Je suis sûr que vous pouvez boeuf de l'approche suggérée dans l'article ci-dessus en hausse un peu avec des délégués anonymes tels que idataerrorinfo code> dataannotations code> attributs code>. P>
defaultModelbinder code> pour appeler la validation automatiquement (sans les tas de vérification de nos actions de contrôleur - comme le blog de Scott, indique que nous pouvons faire avec
dataannotations code >. Reportez-vous au Dernier paragraphe avant la position" fortement typée de l'interface utilisateur "! p>
Func
prédicat
shippingSameAsBilling code> est true, vous pouvez ignorer plus de règles pour l'adresse d'expédition, etc.). p>
dataannotations code> permet de définir de simples règles de validation sur des objets
Assurez-vous que les champs que vous ne voulez pas valider ne sont pas affichés à l'action. Nous validons uniquement les champs réellement postés. P>
Ce comportement a changé en MVC2 RC2: P>
Le système de validation par défaut valide
modèle complet la validation par défaut
Système dans ASP.NET MVC 1.0 et dans
Aperçu de ASP.NET MVC 2 Avant RC
2 uniquement les propriétés modèles validées
ont été postés sur le serveur. Dans asp.net
MVC 2, le nouveau comportement est que tous
Les propriétés du modèle sont validées lorsque
Le modèle est validé, peu importe
si une nouvelle valeur a été postée.
Applications qui dépendent du
Le comportement ASP.NET MVC 1.0 peut nécessiter
changements. Pour plus d'informations sur
Ce changement, voir l'entrée Entrée
Validation vs. Validation du modèle dans
ASP.NET MVC sur le blog de Brad Wilson. P>
blockQuote>
Ce n'est pas lié à Aussi, il semble également avoir été construit avec MVC à l'esprit, mais elle a également son propre " runtime em>" afin que vous puissiez l'utiliser dans d'autres applications .NET, ce qui est un autre bonus dans mon livre . p>
Pour les cas plus complexes, j'ai éloigné des données de données simples sur les éléments suivants: Validation avec les visiteurs et les méthodes d'extension .
Si vous souhaitez utiliser vos donnéesAnotations, vous remplaceriez quelque chose comme ce qui suit: p> avec une méthode permettant de valider une propriété par nom via Dataannotations (que je n'ai pas 't avoir guichet automatique). p> p>
J'ai créé un classeur de modèle partiel qui valide uniquement les clés soumises. Pour des raisons de sécurité (si j'allais prendre cela un pas plus loin), je créerais un attribut d'annotation de données qui marque les champs autorisés à être exclus d'un modèle. Ensuite, des attributs de champ de chèque de contrôle Onmodelupdé pour vous assurer qu'il n'y a pas de sous-équiper indésirable en cours.
public class PartialModelBinder : DefaultModelBinder { protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) { // default model binding to get errors base.OnModelUpdated(controllerContext, bindingContext); // remove errors from filds not posted // TODO: include request files var postedKeys = controllerContext.HttpContext.Request.Form.AllKeys; var unpostedKeysWithErrors = bindingContext.ModelState .Where(i => !postedKeys.Contains(i.Key)) .Select(i=> i.Key).ToList(); foreach (var key in unpostedKeysWithErrors) { bindingContext.ModelState.Remove(key); } } }