1

我在 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());
}

//风景

<div class="editor-field">
    @Html.DropDownList(**"CityID"**, ViewData["AllCities"] as SelectList, "--Choose One--"))
    @Html.ValidationMessageFor(model => model.CityID)
</div>

但显示以下错误:

没有具有键“CityID”的“IEnumerable”类型的 ViewData 项。

这是我第一次接触 MVC!“CityID”指的是什么?我应该写什么作为 的第一个参数@Html.DropDownList

正如我在不同文章中所读到的,提到的参数应该是表单字段的名称。

任何人都可以建议一个示例代码吗?任何帮助,将不胜感激。

4

3 回答 3

5

以下代码行是错误的:

new SelectList(cities.AsEnumerable(), "CityID", "Name")

您正在指定CityIDName属性,但cities它是一个IEnumerable<SelectListItem>. 并且SelectListItem只有 hasValueText属性。没有 和 之类的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 帮助器用于name在您的 DOM 中生成 select 元素的属性,因此将选择的值名称传递给您的控制器操作正在提交您的表格。

顺便说一句,使用 ViewData/ViewBag 是非常糟糕的做法。我建议您改用视图模型,并在您的视图中使用强类型 DropDownListFor 助手,该助手将绑定到您的视图模型上的特定属性。

于 2013-05-31T20:14:37.703 回答
1

好吧,看看你的代码,如果城市为空,那么它会转到你的默认城市。但是,您在默认 SelectList 中只列出了名称而不是 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();
于 2013-05-31T20:17:46.013 回答
1

我很好奇您的城市存储库的输出如何转换为IEnumerable<SelectListItem> 但假设它是城市对象的枚举,您可以尝试以下操作

在您的控制器中

ViewBag.Cities = new SelectList(unitOfWork.CityRepository.Get(), "CityID", "Name");

在你看来

<div class="editor-field">
        @Html.DropDownList("CityID", (SelectList)ViewBag.Cities)
</div>
于 2013-05-31T20:15:53.743 回答