2010-01-17 72 views
2

我試圖使用的SelectList我的意見之一,它只是不正確填充。它獲得了適當數量的條目(4),但它們都是System.Web.Mvc.SelectListItem。我在代碼上啓動了調試器,發現有一些奇怪的現象。我一定在做錯事,但我不太明白。從視圖模型我的ASP.NET MVC SelectList有什麼問題?

代碼:

public SelectList DeviceTypes {get; private set;} 
.... 
var device_types = DataTableHelpers.DeviceTypes(); 
IEnumerable<SelectListItem> sl = device_types.Select(
         dt => new SelectListItem { Selected = (dt.DeviceType == 1), 
         Text = dt.Description, 
         Value = dt.DeviceType.ToString() }).ToList(); 
DeviceTypes = new SelectList(sl); 

和代碼視圖:

<%= Html.DropDownList("Type",Model.DeviceTypes) %> 

所以,當我在調試器看看這個,對SL的IEnumerable是越來越正確建立。我可以看到裏面的所有4個元素,具有正確的Text和Value屬性值。但是,一旦我調用SelectList構造函數,如果我展開它所包含的IEnumerable,則會看到它有4個條目,但其中的所有數據都已丟失。文本設置爲System.Web.Mvc.SelectListItem,和值爲null

我試着將ToList()調用更改爲ToArray(),並將其完全刪除。這並沒有改變行爲。

我在這裏做錯了什麼?

回答

4

編輯:抓抓我的第一個答案。

你應該傳遞的IEnumerable列表,如果項目視圖,而不是試圖在控制器來構建一個HTML項目。

代碼控制器:

public IEnumberable<YourModel> DeviceTypes {get; internal set;} 
.... 
DeviceTypes = DataTableHelpers.DeviceTypes(); 

代碼查看:

<%= Html.DropDownList("Type", from dt in Model.DeviceTypes 
           select new SelectListItem 
           { 
            Text = dt.Description, 
            Value = dt.DeviceType.ToString(), 
            Selected = dt.DeviceType == 1 
           }) %> 
+0

沒錯,這做到了,謝謝。我想我也明白我現在做錯了什麼。 – 2010-01-17 19:28:26

+0

這是一個老舊的函數式答案,但請**,絕對不要**直接向視圖中寫入Linq請求!好的做法是聲明一個'INT SelectedValue'和模型中的一個'的IEnumerable <> YourEnumerableProperty'屬性,然後在控制器填充它,最後用'@ Html.DropDownListFor(M => m.SelectedValue,新的SelectList( Model.YourEnumerableProperty,「價值」,「文本」)'意見是不應該持有邏輯企業。 – AlexB 2017-12-11 21:29:39

+0

視圖可以包含邏輯,它只是需要顯示邏輯,而不是業務邏輯。 – 2017-12-21 18:50:42