填充MVC3中的下拉列表
本文关键字:下拉列表 MVC3 填充 | 更新日期: 2023-09-27 18:16:23
我在填充MVC3的下拉列表时有一点问题。我希望有人能在这件事上给我帮助。
我正在尝试呈现包含城市下拉列表的用户视图。这应该从数据库中获取。事实上,User类有一个City类的外键。
这里是控制器和视图:
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());
}
//视图<div class="editor-field">
@Html.DropDownList(**"CityID"**, ViewData["AllCities"] as SelectList, "--Choose One--"))
@Html.ValidationMessageFor(model => model.CityID)
</div>
但是显示以下错误:
没有'IEnumerable'类型的ViewData项具有'CityID'键。
这是我第一次使用MVC!"CityID"指的是什么?我应该写什么作为@Html.DropDownList
的第一个参数?
正如我在不同的文章中所读到的,所提到的参数应该是表单字段的名称。
谁能建议一个示例代码?
下面这行代码是错误的:
new SelectList(cities.AsEnumerable(), "CityID", "Name")
指定CityID
和Name
属性,但cities
是IEnumerable<SelectListItem>
。SelectListItem
只有Value
和Text
属性。没有所谓的CityID
和Name
。
所以你的意思可能是:
ViewData["AllCities"] = cities != null
? new SelectList(cities, "Value", "Text")
: new SelectList(DefaultCities, "Name");
或简单的:
ViewData["AllCities"] = cities != null
? cities
: new SelectList(DefaultCities, "Name");
和在你看来:
@Html.DropDownList(
"CityID",
ViewData["AllCities"] as IEnumerable<SelectListItem>,
"--Choose One--"
)
就视图中的CityID
参数而言,这基本上将由DropDownList helper使用,以生成DOM中select元素的name
属性,因此将被选择的值名称传递给您提交表单的控制器动作。
顺便说一下,使用ViewData/ViewBag是非常糟糕的做法。我建议你使用视图模型,并在视图中使用强类型的DropDownListFor helper,它将绑定到视图模型上的特定属性。
我很好奇您的城市存储库的输出如何强制转换为IEnumerable<SelectListItem>
但是假设它是一个城市对象的枚举,你可以尝试下面的
在控制器
ViewBag.Cities = new SelectList(unitOfWork.CityRepository.Get(), "CityID", "Name");
在你的视图
<div class="editor-field">
@Html.DropDownList("CityID", (SelectList)ViewBag.Cities)
</div>
看看你的代码,如果城市为空,那么它就会转到默认城市。但是,在默认的SelectList中只列出了Name而没有列出CityID。
您可能还想先尝试绑定默认集合以确保它正常工作。那就试试另一个……
这是你需要的:
var cities = unitOfWork.CityRepository.Get();
ViewData["AllCities"] = cities != null ? new SelectList(cities, "CityID", "Name") : new SelectList(DefaultCities.AsEnumerable(), "CityID", "Name");
你的视图是:
@Html.DropDownList("Cities",(SelectList)ViewData["AllCities"])
还有,我刚刚看到你在哪里定义DefaultCities。它也没有CityID。:
var DefaultCities = new[]
{
new {Name = "London"}
}.ToList();
应该是这样的:
var DefaultCities = new[]
{
new {Name = "London", CityID=1}
}.ToList();