2010-07-16 11 views
0

Résumé:ASP.NET MVC 2: Annotation de données ou modèle: façon d'associer un DDL à sa liste d'options Model.data?

Si vous utilisez les modèles d'ASP.NET MVC 2 pour afficher un DropDownList, comment accéderiez-vous à la liste d'options s'ils étaient stockés dans Model.property de View de niveau supérieur? En outre, existe-t-il un moyen [DataAnnotation] d'associer cette liste? Des liens vers des exemples seraient très utiles.

Contexte:

Dans ASP.NET MVC 2, vous pouvez créer une classe personnalisée comme StateName et utiliser un EditorTemplate appelé StateName.ascx, qui affiche ce point de vue partielle chaque fois qu'il trouve une propriété StateName. Brad Wilson a un grand article here le décrivant. Ces modèles de vue partielle peuvent être imbriqués de sorte que chaque modèle ne traite que de sa propre portée (en faisant correspondre la portée du modèle aux propriétés POCO correspondantes).

Configuration:

Maintenant, imaginez que le StateName.ascx rend un DropDownList et a besoin de la liste des états possibles ([{ "AL", "Alabama"}, { "PA", "Pennsylvania"}, ... ]). Généralement, le modèle de vue de niveau supérieur a tout ce dont nous avons besoin pour rendre à la fois le DomainModel (comme notre ShoppingCart), et toutes les données diverses comme les listes pour les listes déroulantes.

Question:

Ainsi, la question est de savoir comment un modèle de référence vue partielle StateName.ascx la propriété vue de niveau supérieur non partiel du modèle IList<StateName> States pour alimenter le DDL dans le modèle de vue partielle? (en particulier si vous avez plusieurs rendus imbriqués ou deep dive tels que Model.Customer [0] .BillingAddress.State, la vue parent du modèle n'est peut-être pas la vue de niveau supérieur).

Un autre angle peut être de mettre une sorte de [Annotation de données] sur la propriété de classe qui associe cette liste d'états possibles au modèle du modèle de vue partielle?

Par exemple, voici le niveau haut de page Voir Modèle:

Model.ShoppingCart.Customer.ShippingAddress; 
Model.ShoppingCart.Customer.BillingAddress; 
Model.StateNames;   // IList<StateName> 
Model.MaritalStatusNames; // IList<MaritalStatus> 
Model.GenderNames;  // IList<Gender> 

De plus nous pourrions faire toutes les listes de données dans une propriété DDL, comme Model.DDLs.StateNames, Model.DDLs.GenderNames, etc.?

Répondre

1

Je pense que la réponse courte est que le modèle partiel ne peut pas accéder au modèle entier du parent parce qu'il reçoit seulement le sous-modèle avec lequel il est censé travailler. Dans votre cas (c'est-à-dire les listes globales de choses qui ne changent pas), vous pouvez toujours déclarer votre liste dans une propriété statique sur un objet auxiliaire afin de ne pas avoir besoin d'une instance de modèle pour y accéder. Par exemple, votre objet Address pourrait avoir une liste statique de tous les états.