2009-09-07 7 views
3

Lors de ma première entreprise dans ASP.NET MVC, je rencontre quelques situations où j'ai des listes déroulantes qui sont limitées dans leur but à une seule vue. Un bon exemple est que j'ai un formulaire d'inscription où un utilisateur doit mettre dans leur sexe et date de naissance. Une fois entré, nulle part dans l'application il est changé.Meilleur endroit pour mettre des générateurs SelectListItem dans l'application ASP.NET MVC

Pour le genre, je construis les sexes et pour la date de naissance, je construis les pièces individuelles (mois, jours et années) pour leurs listes déroulantes respectives. Maintenant, j'ai les méthodes qui génèrent ces valeurs dans le contrôleur qui renvoie cette vue (dans le constructeur). Je ne peux pas m'empêcher de penser qu'il y a une légère odeur de code venant de cette façon, car toutes les méthodes du contrôleur ne renvoient pas toujours la vue (peut-être à cause des appels REST, etc.)). Je ne pense pas que générer à chaque fois est l'approche à adopter.

Quelles méthodes les gens utilisent-ils pour médier ceci? Je pense à une sorte de classe avec des méthodes statiques qui peuvent être appelées directement à partir de l'affectation (<% = Html.Dropdown ("myitem", GeneratorMethod())%>). Le seul problème que je peux éviter de faire de cette façon est de savoir comment sélectionner à nouveau un élément dans le cas où la vue est retournée (en raison d'une erreur de validation, par exemple).

Un commentaire serait apprécié!

Répondre

2

Vous pouvez demander à vos modèles de préparer les ensembles de valeurs pour toutes les listes déroulantes. Ensuite, à votre avis, vous utiliserez simplement les propriétés du modèle. Vous avez raison de penser que cela n'appartient pas à la responsabilité du contrôleur.

Vous pouvez créer une classe statique pour renvoyer des ensembles de valeurs pour toutes les situations de choix que votre application doit prendre en charge. Vos modèles pourraient appeler ces méthodes dans le constructeur. Bien sûr, vous pouvez les appeler directement dans les aides de vue, mais c'est une bonne approche pour essayer de minimiser la communication de vue extérieure. Pour resélectionner, vous devez saisir une valeur soumise, la définir sur l'une des propriétés du modèle, puis renvoyer ce modèle. Si une aide intégrée accepte une valeur présélectionnée dont je ne me souviens pas exactement, j'ai arrêté d'utiliser des aides intégrées assez rapidement. Je suppose qu'ils devraient pouvoir.

+0

Cela a beaucoup de sens. J'avais eu l'idée d'ajouter ces valeurs dans mon modèle (je n'utilise pas le modèle intégré, mais une implémentation de référentiel externe) et cela me porte à croire que ce sera probablement la meilleure approche. Mes implémentations de référentiel incluent la mise en cache des entités, donc après le premier appel à froid, il sera mis en cache. Je ne suis toujours pas sûr du processus de re-sélection, mais je suis sûr que je peux comprendre maintenant que je pointe dans la bonne direction. Merci! –

1

Je développe habituellement la classe HtmlHelper avec les méthodes que je veux être réutilisable sur plusieurs vues. Pour plus d'informations sur les méthodes d'extension, voir http://msdn.microsoft.com/en-us/library/bb383977.aspx. Je conserve toutes mes classes qui contiennent des méthodes d'extension dans le même espace de noms. Ensuite, je définis les classes dans Web.config pour être disponible dans toutes les vues.

<pages> 
    <namespaces> 
     <add namespace="MyApplication.Extensions"/> 
    </namespaces> 
</pages> 
+0

Je pense définitivement à inclure certaines fonctionnalités dans les extensions HtmlHelper. Spécifiquement, c'est quelque chose que je regarde pour la génération de liste déroulante de liste déroulante pour des dates, puisque je peux voir la réutilisation et l'installation qui entrent dans la construction de ceux-ci. J'importerai définitivement l'espace de nom dans le fichier Web.config, car il permet de garder cette responsabilité hors de vue, où je m'attends à passer à un concepteur à l'avenir. –

Questions connexes