如何在控制器创建操作中使用状态填充 SelectList
How to populate SelectList with States in Controller Create Action
我正在尝试使用 MS 教程 NerdDinner 中的代码来填充带有状态的下拉列表,包括已经存在的任何内容(用于编辑 ActionResult)。
这是在 NerdDinner 中用于 Phone 个国家的内容:
//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
是 typeof 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";
,那么当您第一次渲染视图时将选择第三个选项 ("Oregon")。
我正在尝试使用 MS 教程 NerdDinner 中的代码来填充带有状态的下拉列表,包括已经存在的任何内容(用于编辑 ActionResult)。
这是在 NerdDinner 中用于 Phone 个国家的内容:
//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
是 typeof 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";
,那么当您第一次渲染视图时将选择第三个选项 ("Oregon")。