2009-07-27 100 views
5

我確定這是一個常見的操作,但我很難找到解決方案。這是網頁上兩個<select>的問題,其中一個取決於其他可能值的列表。ASP.NET MVC中的空SelectList

我有一個下拉列表,其中包含一個網頁上的子代碼,其可能值的列表取決於包含狀態代碼的頁面上的另一個下拉列表中的選擇。在我的控制器中,我從數據庫中檢索可能的狀態代碼列表,並將這些值放入SelectList中,該列表由DropDownList HTMLHelper用來在視圖中構建我的選擇列表。我檢索一個包含狀態代碼的模型記錄,並使用該狀態代碼值查找數據庫中的子狀態的可能值,然後將該列表放入另一個SelectList中作爲第二個下拉列表。當用戶更改狀態下拉列表中的選擇時,該頁面會向服務器發送ajax回調以重新填充子狀態下拉列表,並顯示新的可能值列表。

空的狀態碼確實不是一個有效的值,但是這是一個用於糾正這些問題的質量控制應用程序。我的問題是,模型記錄上的當前狀態代碼可以有時爲空,因此第二個下拉列表中的子狀態值列表將爲空。不幸的是,似乎沒有辦法創建一個空的SelectList傳遞給DropDownList HTMLHelper,但我的下拉列表必須在加載頁面以支持我的ajax解決方案時創建。

有沒有人制定出一種高效,超級爽滑的方式來處理這種情況?或者我需要訴諸一些醜陋的東西,比如檢查我的視圖中的子狀態SelectList是否爲空,以及它是否使用不同的HTML來生成下拉列表?看起來我的病態心態是,能夠生成一個空的SelectList以切換到HTMLHelper將是一個合理的解決方案。我歡迎任何想法。

回答

3

可以將一個空列表傳遞給DropDownList。

在你的控制器,你應該有這樣的:

 
var status_code_id = mymodel.status_code_id; 
var substatus_code_id = mymodel.substatus_code_id; 

ViewData["status_code_id"] = new SelectList(
    StatusCodes.FindAll(), "id", "code", status_code_id); 

ViewData["substatus_code_id"] = new SelectList(
    SubstatusCodes.FindAllForStatus(status_code_id), "id", "code", substatus_code_id); 

...其中FindAllForStatus包含在你的AJAX調用你使用相同的代碼來填充子狀態下拉列表。 FindAllForStatus應該帶一個空的狀態碼並返回一個空的列表。

在你看來,你應該是這樣的:

 
<%= Html.DropDownList("status_code_id", "--not selected--")%> 
<%= Html.DropDownList("substatus_code_id", "--not selected--")%> 
-4

只返回1個虛擬物品,讓javascript檢查這個物品,然後禁用第二個下拉列表。

27

您可以使用Enumerable.Empty()

@Html.DropDownList("dropdown-name", Enumerable.Empty<SelectListItem>()) 
+1

也MultiSelectList通過增加工作Enumerable.Empty ()作爲參數 – garyh 2016-11-17 12:03:49