2013-03-30 48 views
2

所以我正在学习MVC/Razor的过程中,我无法弄清楚它是如何工作的。Html.DropdownList如何实际绑定?

在创建方法

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对象中获取值,但是这种边步骤就是模型绑定的整个点。

回答

5

的下拉列表助手会自动搜索选择列表与传递

  1. 模型
  2. ViewBag
  3. TempData的

如果创建了一个选择列表的字符串,这个助手将呈现具有与传递字符串同名的名称和ID属性的下拉列表

在这个过程中,助手假设id和name将与传递的字符串相同。无论您传递什么字符串,都会填充呈现的下拉列表的名称和ID属性。

如果使用

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

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

如果,otherhand,你想区分绑定参数的名字和你的SelectList,你可以使用DropDownList的

过载
Html.DropDownList("Genres", (IEnumerable<SelectListItem>) ViewBag.GenresList) 
+0

我得到最后一个声明,我可以检索'请求。Form [“x”]'但是是否有任何Html Helper说:使用x作为下拉的数据源,但在选择后将selectValue绑定到属性Y – Mike

+1

如果我理解了你的话,可以使用Html.DropDownList “流派”,(IEnumerable )ViewBag.GenresList) –

1

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

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

并在视图结束检索值与以下,我没有问题。

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