9
votes

Validation conditionnellement des parties d'un modèle ASP.NET MVC avec des produits de base?

J'ai certains panneaux sur ma page cachés dans certaines circonstances.

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.

J'essaie d'utiliser le nouveau Capacités de basenotation de ASP.NET MVC 2 (Aperçu 1) pour y parvenir.

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 .

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?


0 commentaires

7 Réponses :


6
votes

Pour la Checkoutmodel, j'utilise cette approche (la plupart des champs masqués): xxx

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. xxx

toutes meilleures solutions?


1 commentaires

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.



3
votes

1 commentaires

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é



2
votes

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).

La limitation de l'interface idataerrrorinfo 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 valide est celui où toutes ses propriétés sont également valides . Cependant, je peux avoir une situation où si la propriété A, B et C est valide - alors l'objet entier est valide .. mais aussi si la propriété A n'est pas valide mais b et C sont, alors l'objet satisfait à la validité. Je n'ai simplement aucun moyen de décrire cette condition / règle avec l'interface idataerrorinfo dataannotations attributs .

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 et stocker toutes les règles de validation dans le même endroit (peut-être la couche de service) et (le kool bit) utilise même le MVC 2 defaultModelbinder 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 . Reportez-vous au Dernier paragraphe avant la position" fortement typée de l'interface utilisateur "!

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 Func ou prédicat et écrire personnalisé Les blocs de code des règles de validation permettront aux conditions de la propriété croisée (par exemple, la condition que vous avez référé à l'endroit où si votre propriété shippingSameAsBilling est true, vous pouvez ignorer plus de règles pour l'adresse d'expédition, etc.).

dataannotations permet de définir de simples règles de validation sur des objets vraiment faciles avec très peu de code. Mais comme vos exigences développent que vous devrez valider des règles plus complexes. Les nouvelles méthodes virtuelles du classeur de modèle MVC2 devraient continuer à nous fournir des moyens d'intégrer nos futures inventions de validation dans le cadre MVC.


0 commentaires

2
votes

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.

EDIT: (par interrogateur)

Ce comportement a changé en MVC2 RC2:

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.


0 commentaires

0
votes

Ce n'est pas lié à dataannotations mais avez-vous regardé le Validation Projet? Il vous donne une commande de grain fine sur votre validation et si vous avez une validation d'objet à l'objet, un objet agrégé des deux objets vous aidera.

Aussi, il semble également avoir été construit avec MVC à l'esprit, mais elle a également son propre " runtime " afin que vous puissiez l'utiliser dans d'autres applications .NET, ce qui est un autre bonus dans mon livre .


0 commentaires

1
votes

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: xxx

avec une méthode permettant de valider une propriété par nom via Dataannotations (que je n'ai pas 't avoir guichet automatique).


0 commentaires

1
votes

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);
        }
    }    
}


0 commentaires