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;
然后将其与
一起使用Html.DropDownList("OrderTypeList")
呈现
<select id="OrderTypeList" name="OrderTypeList"><option>System.Web.Mvc.SelectListItem</option>
<option>System.Web.Mvc.SelectListItem</option>
</select>
为什么它没有正确渲染选项?
答案 0 :(得分:7)
执行时调用的构造函数方法:
SelectList selectList = new SelectList(items);
创建一组SelectListItems,它们本身指向SelectListItems(因此它是奇怪的选项,因为它只是在对象上调用ToString)。而是直接将列表设置为ViewData键
ViewData["OrderTypeList"] = items;
答案 1 :(得分:7)
你也可以简单地改变一行:
SelectList selectList = new SelectList(items);
到
SelectList selectList = new SelectList(items, "Text", "Value");
这将指示MVC将哪些属性用作选项标记中的Text
和Value
。
答案 2 :(得分: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" })%>
答案 3 :(得分:1)
如果您查看SelectList构造函数重载的Intellisense,代码SelectList(items)应该可以工作,但不能。据我所知,它只是对项目执行ToString()这一事实是微软应该修复的错误。答案都是很好的解决方法。顺便说一句,如果你使用提供“文本”和“值”的方法,正确的答案应该是
SelectList selectList = new SelectList(items, "Value", "Text")
不
SelectList selectList = new SelectList(items, "Text", "Value")
至少,这与我在MVC 3中的实验一致。
答案 4 :(得分:0)
我认为您应该尝试使用
进行渲染Html.DropDownList("OrderTypeList", ViewData["OrderTypeList"])