2009-06-28 8 views
6
List<SelectListItem> items = new List<SelectListItem>(); 
if (a) 
{ 
    SelectListItem deliveryItem = new SelectListItem() 
    { 
     Selected = a.selected, 
     Text = "Delivery", 
     Value = "1" 
    }; 

    items.Add(deliveryItem); 
} 

if (b) 
{ 
    SelectListItem pickupItem = new SelectListItem() 
    { 
     Selected = b.selected, 
     Text = "Pickup", 
     Value = "2" 
    }; 

    items.Add(pickupItem); 
} 

SelectList selectList = new SelectList(items); 

ViewData["OrderTypeList"] = selectList; 

Ensuite, en utilisant avecMVC SelectList ne fonctionne pas

Html.DropDownList("OrderTypeList") 

Renders

<select id="OrderTypeList" name="OrderTypeList"><option>System.Web.Mvc.SelectListItem</option> 
<option>System.Web.Mvc.SelectListItem</option> 
</select> 

Pourquoi est-il pas correctement les options de rendu?

Répondre

7

La méthode constructeur que vous appelez lorsque vous faites:

SelectList selectList = new SelectList(items); 

crée un ensemble de SelectListItems qui se pointent à SelectListItems (d'où l'étrange option car elle appelle juste ToString sur l'objet). Au lieu de cela définir votre liste à la clé ViewData directement

ViewData["OrderTypeList"] = items; 
+0

merci, il a résolu le problème – mamu

0

Je pense que vous devriez essayer de rendre avec

Html.DropDownList("OrderTypeList", ViewData["OrderTypeList"]) 
+0

Je pense que je peux l'utiliser si j'ai selectlist dans viewdata. Mais ici, j'essaie de construire liste de sélection – mamu

1

Ou vous pouvez créer une classe qui contiendra la liste de sélection, puis retourner la classe comme le modèle de vue. Je pense que c'est une façon beaucoup plus élégante de le faire plutôt que ViewData.

public class MyFormViewModel 
{ 
    public SelectList Friends { get; set; } 
} 

Puis dans votre ActionResult

MyFormViewModel fvm = new MyFormViewModel(); 
fvm.Friends = new SelectList(myList, "UserName", "NickName"); 

Alors à votre avis

<%= Html.DropDownList("ToUserName", Model.Friends, new { @class = "field" })%> 
7

Vous pouvez aussi tout simplement changé une ligne de:

SelectList selectList = new SelectList(items); 

à

SelectList selectList = new SelectList(items, "Text", "Value"); 

Ce instruira MVC les propriétés à utiliser comme Text et Value dans vos balises d'options.

1

Si vous observez les surcharges du constructeur de SelectList pour Intellisense, le code SelectList (items) devrait fonctionner, mais pas. Le fait qu'il ne fasse qu'un ToString() sur les objets est, pour autant que je sache, un bug que Microsoft devrait corriger. Les réponses sont toutes de bonnes solutions de contournement. En passant, si vous utilisez la méthode fournissant « Texte » et « Value », la réponse correcte doit être

SelectList selectList = new SelectList(items, "Value", "Text") 

pas

SelectList selectList = new SelectList(items, "Text", "Value") 

Au moins, qui est d'accord avec mon expérimentation dans MVC 3.