ASP.NET MVC中的空SelectList

时间:2009-07-27 21:10:50

标签: asp.net-mvc

我确信这是一项常见的操作,但我很难解决问题。这是网页上的两个<select>的问题,其中一个依赖于另一个网站的可能值列表。

我在网页上有一个包含子状态代码的下拉列表,其可能值列表取决于包含状态代码的页面上另一个下拉列表中的选择。在我的控制器中,我从数据库中检索可能的状态代码列表,并将值放在DropDownList HTMLHelper用于在视图中构建我的选择列表的SelectList中。我检索包含状态代码的模型记录,并使用该状态代码值来查找数据库中子状态的可能值,然后将该列表放在另一个SelectList中以获取第二个下拉列表。当用户在状态下拉列表中更改选择时,该页面向服务器发出ajax回调,以使用新的可能值列表重新填充子状态下拉列表。

空状态代码确实不是有效值,但这是一个质量控制应用程序,用于纠正此类问题。我的问题是模型记录 上的当前状态代码 有时是空的,因此我的第二个下拉列表的子状态列表将为空。不幸的是,似乎无法创建一个空的SelectList传递给DropDownList HTMLHelper,但是当页面加载以支持我的ajax解决方案时,必须创建我的下拉列表。

有没有人制定出有效且超级光滑的方式来处理这种情况?或者,如果子状态SelectList为null,并且是否使用不同的HTML生成下拉列表,我是否需要求助于查看我的视图中的丑陋内容?在我生病的头脑中,能够生成一个空的SelectList以交给HTMLHelper似乎是一个合理的解决方案。我欢迎任何想法。

3 个答案:

答案 0 :(得分:27)

您可以使用Enumerable.Empty()

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

答案 1 :(得分: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--")%>

答案 2 :(得分:-4)

只返回1个虚拟项目,让javascript检查此项目,然后禁用第二个下拉列表。