我在填充MVC3中的下拉列表时遇到了一些问题。我希望有人可以帮我解决这个问题。
我正在尝试呈现一个包含城市DropDownList的用户视图。这应该从数据库中获取。实际上,User类有一个City类的ForeignKey。
以下是Controller和View:
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
的第一个参数?
正如我读过不同的文章,提到的论点应该是表单字段的名称。
有人可以推荐一个示例代码吗? 任何帮助将不胜感激。
答案 0 :(得分:5)
以下代码行错误:
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帮助器基本上会使用它来生成DOM中select元素的name
属性,因此是要传递给您要将表单提交到的控制器操作的选定值名称。
顺便使用ViewData / ViewBag是非常糟糕的做法。我建议您使用视图模型,并在视图中使用强类型DropDownListFor帮助程序,它将绑定到视图模型上的特定属性。
答案 1 :(得分:1)
我很好奇您的城市存储库输出如何转换为IEnumerable<SelectListItem>
但假设它是一个城市对象的枚举,你可以尝试以下
在您的控制器中
ViewBag.Cities = new SelectList(unitOfWork.CityRepository.Get(), "CityID", "Name");
在你看来
<div class="editor-field">
@Html.DropDownList("CityID", (SelectList)ViewBag.Cities)
</div>
答案 2 :(得分:1)
好吧,看看你的代码,如果城市为空,那么它将转到你的默认城市。但是,您只在默认的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();