我在填充MVC3中的下拉列表时遇到了一些问题.我希望有人能给我一个帮助.
我试图渲染一个包含城市DropDownList的用户视图.这应该从数据库中获取.实际上,User类具有City类的ForeignKey.
这是控制器和视图:
public ViewResult Index()
{
//return View(model);
var DefaultCities = new[]
{
new {Name = "London"}
}.ToList();
IEnumerable<SelectListItem> cities = unitOfWork.CityRepository.Get() as IEnumerable<SelectListItem>;
ViewData["AllCities"] = cities != null ? new SelectList(cities.AsEnumerable(), "CityID", "Name") : new SelectList(DefaultCities.AsEnumerable(), "Name");
return View(unitOfWork.UserRepository.Get(orderBy: us => us.OrderByDescending(u => u.ID)).OfType<User>().ToList());
}
Run Code Online (Sandbox Code Playgroud)
//风景
<div class="editor-field">
@Html.DropDownList(**"CityID"**, ViewData["AllCities"] as SelectList, "--Choose One--"))
@Html.ValidationMessageFor(model => model.CityID)
</div>
Run Code Online (Sandbox Code Playgroud)
但是会显示以下错误:
没有类型为'IEnumerable'的ViewData项具有键'CityID'.
这是我第一次参加MVC!"CityID"指的是什么?我应该写什么作为第一个参数@Html.DropDownList?
正如我读过不同的文章,提到的论点应该是表单字段的名称.
有人可以建议一个示例代码吗?任何帮助,将不胜感激.
以下代码行是错误的:
new SelectList(cities.AsEnumerable(), "CityID", "Name")
Run Code Online (Sandbox Code Playgroud)
您正在指定CityID和Name属性但是cities是IEnumerable<SelectListItem>.而且SelectListItem只有Value和Text属性.有没有这样的东西CityID和Name.
所以你可能意味着:
ViewData["AllCities"] = cities != null
? new SelectList(cities, "Value", "Text")
: new SelectList(DefaultCities, "Name");
Run Code Online (Sandbox Code Playgroud)
或者干脆:
ViewData["AllCities"] = cities != null
? cities
: new SelectList(DefaultCities, "Name");
Run Code Online (Sandbox Code Playgroud)
在你看来:
@Html.DropDownList(
"CityID",
ViewData["AllCities"] as IEnumerable<SelectListItem>,
"--Choose One--"
)
Run Code Online (Sandbox Code Playgroud)
就CityID你的视图中的参数而言,DropDownList帮助器基本上会使用它来生成nameDOM中select元素的属性,因此将选择的值名称传递给你的控制器动作正在提交您的表格.
顺便使用ViewData/ViewBag是非常糟糕的做法.我建议您使用视图模型,并在视图中使用强类型DropDownListFor帮助器,它将绑定到视图模型上的特定属性.