2013-07-25 23 views
2

所以我有一個包含項目列表的表單,每個項目都有一個選擇列表。我的代碼是像這樣(除去多餘的物品):MVC4 Html.DropDownListFor在循環中未設置選定的選項

@for(var i = 0; i < Model.InputSlots.Count; i++) 
{ 
@Html.DropDownListFor(model => model.InputSlots[i].VariableId, 
     new SelectList(Model.Variables, "VariableId", "Name"), 
     "--Select Variable--", 
     new { @class = "span8" }) 
} 

的下拉列表中顯示正確,如果我選擇的項目之一,併發布形式,選擇崗位正常,但是當我加載頁面將VariableId設置爲有效選項時,它不顯示選定的選項,而是顯示默認的「--Select Variable--」。

我在我的代碼中的許多其他地方使用DropDownListFor,它的工作方式與預期的一樣,只是在這種情況下不起作用。我可以告訴的唯一區別是它引用了一個數組項的屬性。

我在視圖中設置了一個斷點來驗證Model.InputSlots [i] .VariableId設置爲有效選項(2),並且我還查看了生成的HTML以確保有一個選項值爲2,兩者似乎都是正確的,但是在選項元素上沒有「選擇」,其值爲2.

這是一個已知的行爲,還是我只是在某些地方做錯了某些事情,我沒有注意到了嗎?

更新:

在選擇列表的構造函數設置所選的項目做的工作,即:

@Html.DropDownListFor(model => model.InputSlots[i].VariableId, 
     new SelectList(Model.Variables, "VariableId", "Name", Model.InputSlots[i].VariableId), 
     "--Select Variable--", 
     new { @class = "span8" }) 

但它似乎並不想從表達式得到它,因爲它在其他不案例。

+0

參見例如HTTP://計算器。com/questions/17691742以及與之相關的五個問題中的任何一個(它們都是同一事物的變體)。 – JimmiTh

+0

這些鏈接確實提醒我在SelectList的構造函數中存在一個參數來設置選定的項目,該項目確實有效,但他們並沒有真正解決爲什麼它不能從我的lambda中獲取它的問題。我的理解是DropDownListFor真的應該忽略這個參數,除非它不能從表達式中找出它。 – Gerald

+0

對,錯誤的問題......這裏的問題是,所有的幫助者都使用lambda來將它翻譯成字符串表示法,它用來查找'ModelState'或'ViewData'中的值。換句話說,到那時它實際上不知道'i'具有什麼值,所以它找不到'Model.InputSlots [i]'的值。 – JimmiTh

回答

1

這裏的問題是所有DropDown幫助者查找defaultValue的方式(這總是一個痛點)。

當發現ModelState(即返回從POST視圖時),他們會使用,你的情況下,將正常工作,因爲ModelState確實有一個名爲InputSlots[0].VariableId字典條目。

然而,當沒有ModelState時,它們將回落到ViewData及其​​方法。

該方法將通過查看數據查找InputSlots[0].VariableId字典密鑰 - 或該名稱的Model(通過TypeDescriptor.GetProperties())的屬性。

它也會嘗試InputSlots[0] - 即使用該密鑰找到具有該名稱或字典條目的屬性 - 然後查找VariableId子屬性。

當然,無論InputSlots[0].VariableId也不InputSlots[0]會被發現,因爲沒有包含在其名稱[0]屬性或關鍵 - 和​​沒有做任何工作來分析索引 - 它的工作原理是簡單地分裂字符串點(.)。

簡而言之,如果在傳遞給幫助程序的lambda表達式(或字符串字面量)中有一個索引器,那麼這些幫助器(在MVC 4中工作時)將無法自動查找默認值。我想不出比自己指定更好的方法,就像你在更新問題中一樣。

+0

你知道,我完全忘了MVC是開源的。在查看代碼後,看起來你是正確的。我會認爲他們會執行lambda表達式來獲取默認值,但顯然不是。 – Gerald

相關問題