7

我正在使用DropDownListFor在視圖中呈現下拉列表。不知何故,渲染列表不會選擇SelectListItemSelected設置爲trueASP.NET MVC DropDownListFor不承諾SelectListItem.Selected

在控制器動作:

var selectList = sortedEntries.Select(entry => new SelectListItem 
          { 
           Selected = entry.Value.Equals(selectedValue), 
           Text = entry.Value, 
           Value = entry.Id 
          }); 

return View(new DropDownListModel 
      { 
       ListId = id, 
       SelectList = selectList, 
       OptionLabel = "Click to Select" 
      }); 

在視圖:

<%= Html.DropDownListFor(m => m.ListId, 
    Model.SelectList, 
    Model.OptionLabel, 
    new {@class="someClass"}) %> 

我曾嘗試以下:

  1. 確保有一個且只有一個項目進行Selected設置爲true
  2. 刪除選項標籤參數。
  3. 刪除HTML屬性對象。
  4. 使用SelectListDropDownListFor

Html.DropDownListFor(m => m.ListId, 
     new SelectList(Model.SelectList, "Value", "Text", 
      new List<SelectListItem>(Model.SelectList).Find(s => s.Selected)), 
     new {@class="someClass"}) 

任何建議,什麼地方出了錯?

編輯

的更多信息:

  • 這個動作是一個孩子的動作,用HTML.RenderAction

回答

4

通過另一種觀點認爲所謂的嘗試是這樣的:

var selectList = sortedEntries.Select(entry => new SelectListItem 
{ 
    Text = entry.Value, 
    Value = entry.Id 
}); 

return View(new DropDownListModel 
{ 
    // The drop down list is bound to ListId so simply set its value 
    // to some element value in the list and it will get automatically 
    // preselected 
    ListId = selectedValue, 
    SelectList = selectList, 
    OptionLabel = "Click to Select" 
}); 

和視圖:

<%= Html.DropDownListFor(
    m => m.ListId, 
    new SelectList(Model.SelectList, "Value", "Text"), 
    Model.OptionLabel, 
    new { @class = "someClass" } 
) %> 

有可能是一個更疑難雜症:你正在試圖改變在POST操作所選擇的值。例如,您渲染了一個表單,用戶在下拉列表中選擇了一些值,提交了表單,並在您的POST操作中對這個選定的值做了一些處理,當您重新顯示視圖時,您希望下拉列表選擇其他值。在這種情況下,你將需要刪除其包含在ModelState中或HTML輔助的初始選擇將忽略該模型中選擇的值:

// do this before returning the view and only if your scenario 
// corresponds to what I described above 
ModelState.Remove("ListId"); 
+0

ModelState.Remove(「ListId」)是關鍵。謝謝。 –

6

DropDownListFor總是會選擇列表框是價值,所以在這種情況下,它將查看ListId的值並使該列表中的項目處於選中狀態。如果列表中沒有找到ListId,則會選擇第一項(或默認文本)。如果你想要一個基於所選屬性選擇的列表,使用DropDownList(沒有For,在這種情況下你必須自己命名)。

所以你的情況這會工作:

var selectList = sortedEntries.Select(entry => new SelectListItem 
{ 
    Text = entry.Value, 
    Value = entry.Id 
}); 

return View(new DropDownListModel 
{ 
    ListId = selectedValue, 
    SelectList = selectList, 
    OptionLabel = "Click to Select" 
}); 
+0

我最終使用了'DropDownList',它允許我爲選擇控件指定一個ID,並在'SelectListItem'中指定一個選定的值。感謝您的解釋! –

5

我得到了同樣的問題在同一個模型(在決策的其他車型沒有問題)

不起作用:

@Html.DropDownListFor(o => o.Drivers.ValueListItems.Value, Model.Drivers.ValueListItems, new { size = Model.Drivers.ValueSizeList, Multiple = "multiple" }) 

完美地工作,所選擇的元素:

@Html.DropDownListFor(o => o.Drivers.ValueListItems.ToDictionary(u=>u.Value).Values, Model.Drivers.ValueListItems, new { size = Model.Drivers.ValueSizeList, Multiple = "multiple" }) 
+0

唯一的問題是,控件的名稱現在是「值」。 –

0

這個問題的解決方案是簡單的,我們都覺得...

所有我們需要做的是設置該屬性上的下拉必將爲元素的視圖模型 - 即:ListId = 3例如

這樣,當我們做到這一點

Html.DropDownListFor(m => m.ListId, 
    new SelectList(Model.SelectList, "Value", "Text", 
     new List<SelectListItem>(Model.SelectList).Find(s => s.Selected)), 
    new {@class="someClass"}) 

中的HtmlHelper會自動拿起默認值,顯示在DropDownList的

simples!

希望它可以幫助你和所有其他人 - 像我一樣! - 已經花了很多時間尋找解決這個明顯問題的方法。

+1

對不起老兄,完全不起作用。 –