2016-02-29 64 views
0

我的模型包含一系列郵政編碼項目(IEnumerable<SelectListItem>)。 它還包含一組選定的郵政編碼(string[])。MVC下拉列表不拾取選定的項目?

在我的HTML頁面中,我想將每個選定的郵政編碼作爲下拉列表與所有郵政編碼選項一起顯示。我第一次嘗試沒有成功:

@foreach (var zip in Model.ZipCodes) { 
    Html.DropDownList("ZipCodes", Model.ZipCodeOptions) 
} 

我意識到,儘管這會產生下拉列表右擊「name」屬性,它不會知道哪個郵編元素適用於特定框中的值,並可能只是默認第一個。

我的第二次嘗試真的讓我感到驚訝。我明確正確的SelectListItem的Selected屬性設置爲true,它仍然呈現什麼也沒有控制選擇:

@foreach (var zip in Model.ZipCodes) { 
    Html.DropDownList("ZipCodes", Model.ZipCodeOptions.Select(x => (x.Value == zip) ? new SelectListItem() { Value = x.Value, Text = x.Text, Selected = true } : x)) 
} 

在那裏,它返回一個新的IEnumerable<SelectListitem>包含所有原始項目,除非它是所選擇的項目,其中如果該元素是一個新的SelectListItem,並且它的Selected屬性設置爲true。該財產在最終產出中完全沒有兌現。

我最後的嘗試是試圖將字符串元素,我想爲要使用的值上使用一個明確的指標:

@{int zipCodeIndex = 0;} 
@foreach (var zip in Model.ZipCodes) { 
    Html.DropDownList("ZipCodes[" + (zipCodeIndex++) + "]", Model.ZipCodeOptions) 
} 

,不能正常工作,可能是因爲名字不再是「 ZipCodes「,但是」ZipCodes [x]「。我起初也收到了某種只讀收集錯誤,必須將ZipCodes屬性的類型從string[]更改爲List<string>

在第四嘗試,我試過如下:

@for (int zipCodeIndex = 0; zipCodeIndex < Model.ZipCodes.Count; zipCodeIndex++) 
{ 
    var zip = Model.ZipCodes[zipCodeIndex]; 
    Html.DropDownListFor(x => x.ZipCodes[zipCodeIndex], Model.ZipCodeOptions) 
} 

產生控制與ID,如「ZipCodes_1_」和名稱,如「拉鍊碼[1]」,但不會選擇正確的價值觀。如果我明確設置權項目的Selected屬性,那麼這個工程:

@for (int zipCodeIndex = 0; zipCodeIndex < Model.ZipCodes.Count; zipCodeIndex++) 
{ 
    var zip = Model.ZipCodes[zipCodeIndex]; 
    Html.DropDownListFor(x => x.ZipCodes[zipCodeIndex], Model.ZipCodeOptions.Select(x => (x.Value == zip) ? new SelectListItem() { Value = x.Value, Text = x.Text, Selected = true } : x)) 
} 

然而,這種做法的問題是,如果我在JavaScript中添加一個新的下拉菜單,讓他們都命名爲「郵編」 ,那麼這些將完全覆蓋所有顯式索引的,而這些都不會傳遞給服務器。它似乎並不喜歡將純粹的「ZipCodes」名稱與顯式數組元素「ZipCodes [1]」混合使用,即使它們映射到專有變量時也使用相同的變量。

在U.I中,用戶可以點擊一個按鈕添加一個新的下拉菜單並選擇另一個郵政編碼。它們都被命名爲ZipCodes,所以它們都被髮布到ZipCodes數組中。當在上面的循環中渲染字段時,我期望它讀取給定索引處的屬性值,但這不起作用。我甚至嘗試重新映射SelectListItems,以便正確的選項的「Selected」屬性爲true,但它仍呈現沒有選中任何內容的控件。出了什麼問題?

+0

示出了使用的一個例子,我希望所有的「選擇」的元素具有相同的名稱「郵編」,這樣我可以添加更多的動態無擔心解析和索引名稱連續我們。我認爲這應該與我的第二次嘗試一樣開箱即用,但它不會,因爲出於某種原因,DropDownList幫助程序根本無法遵守SelectListItems的Selected屬性。我認爲這是一個錯誤。 – Triynko

回答

1

你第一次2段不工作的原因是,ZipCodes是在模型的屬性,以及其它決定選擇什麼你的財產值(未設置在SelectList構造的selected值被忽略)。由於ZipCodes的值是一個值數組,因爲沒有匹配其中一個選項值的單個值,所以找不到匹配,因此第一個選項被選中(因爲必須是)。請注意,在內部,輔助方法會根據您提供的方法生成一個新的IEnumerable<SelectListItem>,並根據模型值設置selected屬性。

你第3和第4段不工作的原因,是由於使用DropDownListFor()方法的一個已知的限制,並使其正常工作,你需要使用一個EditorTemplate和使用AdditionalViewData通過SelectList到模板,或在循環的每次迭代中構建一個新的SelectList(按照您的最後一次嘗試)。請注意,它需要所有的

for(int i = 0; i < Model.ZipCodes.Length; i++) 
{ 
    @Html.DropDownListFor(m => m.ZipCodes[i], 
     new SelectList(Model.ZipCodeOptions, "Value", "Text", Model.ZipCodes[i])) 
} 

如果你想只使用一個共同的名字(不包括索引)使用DropDownList()方法各<select>元素,那麼它必須是不匹配的名稱一個模型屬性,例如

foreach(var item in Model.ZipCodes) 
{ 
    @Html.DropDownList("SelectedZipCodes", 
     new SelectList(Model.ZipCodeOptions, "Value", "Text", item)) 
} 

,然後在你POST方法綁定中的值增加一個額外的參數string[] SelectedZipCodes

或者,使用for循環和DropDownListFor()方法同上,但包括對indexer允許非零爲主,非連續採集物品被提交到控制器並修改腳本中使用添加新項的隱藏輸入在this answer

注中所示的技術的EditorTemplateAdditionalViewDatathis answer

相關問題