Html.DropdownList如何实际绑定?

时间:2013-03-30 01:43:10

标签: asp.net-mvc razor

所以我正在学习MVC / Razor,我无法弄清楚这是如何起作用的。

在创建方法

ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name");

我在页面上

@Html.DropDownList("GenreId", String.Empty);

这很有效。我感到困惑的是ViewBag和对象属性之间的区别

所以我可以将第一行改为

ViewBag.x= new SelectList(db.Genres, "GenreId", "Name");

@Html.DropDownList("x", String.Empty);

但当然它没有绑定到对象那么当我可能不希望列表名称与对象属性同名时,为字段设置下拉列表的正确方法是什么?

我猜可以直接从Request.Form对象中获取值,但这种方式可以解决模型绑定的整个问题。

2 个答案:

答案 0 :(得分:5)

dropdownlist帮助器会自动搜索传递字符串的选择列表

  1. 你的模特
  2. ViewBag
  3. TempData的
  4. 如果创建了一个选择列表,帮助程序将呈现一个下拉列表,其中包含与传递的字符串同名的name和id属性

    在此过程中,帮助程序假定id和name与传递的字符串相同。您传递的任何字符串都将填充呈现的下拉列表的名称和ID属性。

    如果您使用

    @Html.DropDownList("x", String.Empty);
    

    生成的下拉列表将具有name =“x”和id =“x”。您发布的任何操作方法都会收到一个名为“x”的参数。

    另一方面,如果您想要区分绑定参数的名称并选择list,则可以使用DropDownList的重载

    Html.DropDownList("Genres", (IEnumerable<SelectListItem>) ViewBag.GenresList)
    

答案 1 :(得分:1)

我认为viewbag是一个动态对象,在上述问题的上下文中,viewbag.x可以达到目的。我尝试在控制器端设置以下内容。

        Album album = db.Albums.Find(id);
        ViewBag.x = new SelectList(db.Genres, "GenreId", "Name",album.GenreId);

并使用以下内容检索Views末尾的值,我没有遇到任何问题。

        @Html.DropDownList("x","Please Select a Value")
        @Html.ValidationMessageFor(model => model.GenreId)