2013-03-30 51 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)