在MVC3中填充DropDownList?

时间:2013-05-31 20:04:40

标签: c# asp.net-mvc-3

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

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

有人可以推荐一个示例代码吗? 任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:5)

以下代码行错误:

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帮助器基本上会使用它来生成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();