2009-07-27 72 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