2009-06-28 42 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; 

然后使用它与MVC的SelectList不工作​​

Html.DropDownList("OrderTypeList") 

呈现

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

为什么它没有渲染选项正确?

回答

7

的构造方法要调用渲染当你这样做:

SelectList selectList = new SelectList(items); 

创建一组自己指向SelectListItems SelectListItems(中因此怪异因为它只是在对象上调用ToString)。而是直接将您的列表设置为ViewData密钥

ViewData["OrderTypeList"] = items; 
+0

谢谢,它解决了这个问题 – mamu 2009-06-28 15:53:43

0

我想你应该尝试与

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

我想我可以使用,如果我有viewdata selectlist。但在这里我试图建立selectlist – mamu 2009-06-28 15:41:41

1

或者您可以创建一个类来保存选择列表,然后将该类作为视图模型返回。我认为这是一种更优雅的方式,而不是ViewData。

public class MyFormViewModel 
{ 
    public SelectList Friends { get; set; } 
} 
在你的ActionResult

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

然后在您的视图

然后

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

你可以有也只是改变了一个专线:

SelectList selectList = new SelectList(items); 

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

这将指示MVC哪些属性在您的选项标签中用作TextValue

1

如果您查看SelectList构造函数重载的Intellisense,则代码SelectList(items)应该可以工作,但不会。事实上,它只是对项目做一个ToString(),据我所知,这是微软应该修复的一个错误。答案都是很好的解决方法。顺便说一句,如果你使用的方法提供“文本”和“价值”,正确的答案应该是

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


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

至少,这与我在MVC 3实验一致。