填充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的第一个参数?

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

谁能建议一个示例代码?

填充MVC3中的下拉列表

下面这行代码是错误的:

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

指定CityIDName属性,但citiesIEnumerable<SelectListItem>SelectListItem只有ValueText属性。没有所谓的CityIDName

所以你的意思可能是:

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();