在MVC3中填充DropDownList?

Ali*_*lix 1 c# asp.net-mvc-3

我在填充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

正如我读过不同的文章,提到的论点应该是表单字段的名称.

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

Dar*_*rov 5

以下代码行是错误的:

new SelectList(cities.AsEnumerable(), "CityID", "Name")
Run Code Online (Sandbox Code Playgroud)

您正在指定CityIDName属性但是citiesIEnumerable<SelectListItem>.而且SelectListItem只有ValueText属性.有没有这样的东西CityIDName.

所以你可能意味着:

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帮助器,它将绑定到视图模型上的特定属性.