我正试图使用MS教程NerdDinner的代码来填充状态下拉,包括任何已经存在的(用于Edit ActionResult)。
以下是在NerdDinner中使用的电话国家:
//ViewData["Countries"] = new SelectList(PhoneValidator.AllCountries, dinner.Country);
我有所有的州,我只是添加了一些来测试。
public ActionResult Create()
{
Operation operation = new Operation();
ViewData["States"] = new SelectList(
new List<SelectListItem>
{
new SelectListItem{ Text="Ohio", Value="OH"},
new SelectListItem{ Text="Oklahoma", Value="OK"},
new SelectListItem { Text="Oregon", Value="OR"},
new SelectListItem{ Text="Pennsylvania", Value="PA"},
new SelectListItem{ Text="Rhode Island", Value="RI"}
}, operation.State);
return View(operation);
}
下面是创建视图中的帮助器(与编辑视图相同):
@Html.DropDownList("States", ViewData["States"] as SelectList))
你有很多问题。首先,您构建SelectListItem
的集合(这是DropDownList
所需的全部),然后尝试从中制作SelectList
。除了无意义的额外开销之外,您没有指定dataValueField
和dataTextField
参数,因此您生成了一大堆看起来像
<option>System.Web.Mvc.SelectListItem</option>
和您试图设置所选选项的第二个参数也将不起作用(除非operation.State
是SelectListItem
的类型)
其次,绑定到的属性和SelectList
不能使用相同的名称。您的SelectList
应该命名为(例如)StateList
最后,你实际上没有绑定到任何东西。您的模型包含一个名为State
的属性,而不是States
。总是使用强类型的html帮助。
public ActionResult Create()
{
Operation operation = new Operation();
ViewData["StateList"] = new List<SelectListItem>()
{
new SelectListItem{ Text="Ohio", Value="OH"},
new SelectListItem{ Text="Oklahoma", Value="OK"},
....
};
return View(operation);
}
和视图
@Html.DropDownListFor(m => m.State, (IEnumerable<SelectListItem>)ViewData["StateList"])
在您的示例中,第一个选项("Ohio")将被选中,因为State
的值是null
,并且与您的一个选项不匹配。如果你在控制器中使用operation.State = "OR";
,那么第3个选项("Oregon")将在你第一次渲染视图时被选中。