2013-10-21 55 views
1

我有以下類:MVC4 Html.DropDownListFor不選擇指定值

public class PreviewImage_Edit 
{ 
    ... 
    public List<GridDetail_Edit> GridDetails { get; set; } 
    public SelectList GridDetailTypesList { get; set; } 
    ... 
} 

public class GridDetail_Edit 
{ 
    ... 
    public int GridDetailTypeId { get; set; } 
    ... 
} 

而且,我有一個期望類型PreviewImage_Edit的模型,其具有下面的代碼塊的局部視圖:

@model PreviewImage_Edit 
... 
@if (Model.GridDetails != null) 
{ 
    for (var i = 0; i < Model.GridDetails.Count(); i++) 
    { 
     ... 
     @Html.DropDownListFor(model => model.GridDetails[i].GridDetailTypeId, Model.GridDetailTypesList) 
     ... 
    } 
} 

我正在GridDetail_Edit中正確創建SelectList,並且按照預期填充下拉列表。下面是針對第一GridDetails生成的標記對象:

<select data-val="true" data-val-number="The field GridDetailTypeId must be a number." data-val-required="The GridDetailTypeId field is required." id="GridDetails_0__GridDetailTypeId" name="GridDetails[0].GridDetailTypeId"> 
    <option value="1">Top</option> 
    <option value="2">Bottom</option> 
</select> 

我已驗證所選的選項正確保存在數據庫中(即使在選擇的選項不在第一/默認選項當點擊保存按鈕時,可以選擇下拉菜單。但是,當我重新編輯時,選定的選項仍然是下拉菜單中的第一個選項。

我翻遍了代碼並驗證了數據是從數據庫中正確檢索的。我甚至已經將Html.DropDownListFor轉換爲Html.EditorFor,並確認存儲在數據庫中的值正在按照預期使其進入視圖。

我用過Html.DropDownListFor當與它關聯的屬性是一個整數值,但從來沒有它是一個整數值,它是對象集合的一部分。我會對目前爲止所做的工作感到擔憂,但似乎一切都與這一關鍵問題有關。

到目前爲止,我已經嘗試將PreviewImage_Edit中的SelectList移動​​到GridDetail_Edit中,並分別初始化它們,在那裏我以編程方式爲適當的SelectedListItem設置了「Selected」值。這不起作用...相同的結果。

有沒有人遇到過這個問題?有關解決此問題的最佳方法的任何建議?


更新

下面的代碼填充GridDetailTypesList

var gridDetailTypes = _db.GridDetailTypes.OrderBy(g => g.DisplayOrder).ToList(); 
return new SelectList(gridDetailTypes, "GridDetailTypeId", "Name"); 

這是非常簡單的代碼片段。 SelectList構造函數的第二個參數表示值應該在「value」屬性中使用的字段。我不認爲這個問題與值域是一個整數有關,因爲我在同一頁上有類似的代碼,並且下拉功能正常。唯一的區別是我的「問題」下拉列表在我的ViewModel的集合中。

+0

你可以添加代碼段插入項目到GridDetailsTypeList的位置嗎?它可能與此有關(GridDetailTypeId的值是一個int,而SelectListItems的值是字符串) – jingtao

回答

0

我唯一一次看到關於「必須是數字」的下拉列表中的消息時,我搞砸了,並且當我從數據庫中加載它們時,OPTION的(數值)值被空格填充。這看起來不是你的問題(你的例子中沒有顯示填充),但我一定要看看GridDetails [0] .GridDetailTypeId的值,以確保它是正確的類型/值。

希望我可以添加此評論,而不是一個答案 - 但我的代表還不夠高...

0

它適用於我的唯一方法是當我的列表是一個簡單的IEnumerable<string>,或者當我將DataText作爲DataValue傳遞給DataText的自定義對象的屬性時。如下:

Html.DropDownListFor(m => m.TypeOfFilter, new SelectList(Model.Filters, "DataText", "DataText") 

其中TypeOfFilter是一個枚舉和Model.Filters爲List<MySelectItemModel>。 通過這種方式,您可以在生成的HTML中看到選擇了正確的選項。