Html.DropdownList如何实际绑定?

Mik*_*ike 2 asp.net-mvc razor

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

在"创建方法"中

ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name");
Run Code Online (Sandbox Code Playgroud)

我在页面上

@Html.DropDownList("GenreId", String.Empty);
Run Code Online (Sandbox Code Playgroud)

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

所以我可以将第一行更改为

ViewBag.x= new SelectList(db.Genres, "GenreId", "Name");
Run Code Online (Sandbox Code Playgroud)

@Html.DropDownList("x", String.Empty);
Run Code Online (Sandbox Code Playgroud)

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

我想可以直接从Request.Form对象中获取值,但这种方式可以完成模型绑定的整个过程.

Dav*_*ich 5

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

  1. 你的模特
  2. ViewBag
  3. TempData的

如果创建了一个选择列表,则帮助程序将呈现一个下拉列表,其中包含name和id属性,其名称与传递的字符串相同

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

如果你使用

@Html.DropDownList("x", String.Empty);
Run Code Online (Sandbox Code Playgroud)

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

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

Html.DropDownList("Genres", (IEnumerable<SelectListItem>) ViewBag.GenresList)
Run Code Online (Sandbox Code Playgroud)