2011-05-11 70 views
4

所以,我有這兩個表 - 產品,measurement_unitHtml.DropDownListFor結合問題

產品:(id int,name varchar(20),id_um INT)其中id_um是對measurement_unit表的主鍵的引用,id是此表的主鍵。

Measurement_unit:(id_um INT,名稱爲varchar(20))。 id_um是主鍵 我使用LINQ to SQL映射了這兩個鍵。

當我想創建一個新的產品,我需要從測量單位列表中選擇,這意味着他們的名字一個下拉列表,但我想選定一個ID ....

我綁定在控制器爲創建行動(創建一個新的產品)在做這樣的:

var items = new List<SelectListItem>(); 
      foreach (var t in db.measurement_unit) 
       items.Add(new SelectListItem() { Text = t.name.ToString(), Value =t.id_um.ToString() }); 
ViewData["UM"] = new SelectList(items, "Value", "Text"); 

現在,對於視圖:

<%: Html.DropDownListFor(model=>model.id_um, (IEnumerable <SelectListItem>)ViewData["UM"])%> 

但我得到以下錯誤:

The ViewData item that has the key 'id_um' is of type 'System.Int32' but must be of type 'IEnumerable<SelectListItem>'. 

我之前一直在努力做這件事,我成功地做到了,但是我不小心刪除了那個項目。 請告訴我我做錯了什麼?謝謝!

回答

5

我將使用視圖模型,而不是ViewData建議您。這將使得代碼更清潔/安全/重構友好/智能感知啓用/更容易單元測試/魔法串免費/ ....:

public class MyViewModel 
{ 
    public int Id { get; set; } 
    public IEnumerable<SelectListItem> Items { get; set; } 
} 

位指示:

public class HomeController: Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel 
     { 
      Items = db.measurement_unit.Select(x => new SelectListItem 
      { 
       Value = x.id_um.ToString(), 
       Text = x.name.ToString() 
      }) 
     }; 
     return View(model); 
    } 
} 

終於在強類型的視圖:

<%= Html.DropDownListFor(
    x => x.Id, 
    new SelectList(Model.Items, "Value", "Text") 
) %> 
+0

感謝。我現在使用視圖模型而不是ViewData,它更容易,更快速...... – davvidd 2011-06-14 13:46:41