2010-01-17 5 views
2

J'essaie d'utiliser un SelectList un de mes points de vue, et c'est juste ne pas peupler correctement. Il obtient le nombre correct d'entrées (4), mais tous ont lu System.Web.Mvc.SelectListItem. J'ai lancé le débogueur sur le code et j'ai vu une étrangeté se produire. Je dois faire quelque chose de mal, mais je ne vois pas très bien quoi.Quel est le problème avec mon ASP.NET MVC SelectList?

code de la ViewModel:

public SelectList DeviceTypes {get; private set;} 
.... 
var device_types = DataTableHelpers.DeviceTypes(); 
IEnumerable<SelectListItem> sl = device_types.Select(
         dt => new SelectListItem { Selected = (dt.DeviceType == 1), 
         Text = dt.Description, 
         Value = dt.DeviceType.ToString() }).ToList(); 
DeviceTypes = new SelectList(sl); 

et le code de la vue:

<%= Html.DropDownList("Type",Model.DeviceTypes) %> 

Alors, quand je regarde cela dans le débogueur, le sl IEnumerable est construit se correctement. Je peux voir tous les 4 éléments là-bas, avec les bonnes valeurs de propriété Text et Value. Une fois que j'appelle le constructeur SelectList cependant, si je développe le IEnumerable qu'il contient, je vois qu'il a 4 entrées, mais toutes les données dedans ont été perdues. Le texte est défini sur System.Web.Mvc.SelectListItem et la valeur est null.

J'ai essayé de remplacer l'appel ToList() par un ToArray(), ainsi que de le supprimer entièrement. Cela n'a pas changé le comportement.

Qu'est-ce que je fais mal ici?

Répondre

4

EDIT: Grattez ma première réponse.

Vous devez passer la liste IEnumerable si des éléments à la vue, n'essayant pas de construire un élément HTML dans le contrôleur.

code pour le contrôleur:

public IEnumberable<YourModel> DeviceTypes {get; internal set;} 
.... 
DeviceTypes = DataTableHelpers.DeviceTypes(); 

Code pour Voir:

<%= Html.DropDownList("Type", from dt in Model.DeviceTypes 
           select new SelectListItem 
           { 
            Text = dt.Description, 
            Value = dt.DeviceType.ToString(), 
            Selected = dt.DeviceType == 1 
           }) %> 
+0

Eh oui, qui l'a fait, merci. Je pense que je vois ce que je faisais mal maintenant aussi. –

+0

Ceci est une réponse ancienne et fonctionnelle, mais s'il vous plaît, ** JAMAIS ** écrire une demande Linq directement dans la vue !! Une bonne pratique serait de déclarer une propriété 'int SelectedValue' et une propriété' IEnumerable <> YourEnumerableProperty' dans le modèle, puis de le remplir dans le contrôleur, et finalement d'utiliser '@ Html.DropDownListFor (m => m.SelectedValue, new SelectList (Model.YourEnumerableProperty, "Value", "Text") '. Les vues ne sont pas censées contenir les opérations logiques – AlexB

+0

Les vues peuvent contenir de la logique, il suffit d'utiliser la logique d'affichage au lieu de la logique métier. –