我在一个仓库中返回用于两个下拉框(razor视图中的父级和子级)的数据。当从父级下拉框中选择一个父级时,子级下拉框会过滤出仅属于所选父级的子级。如果没有父级选择时,子级下拉框则显示所有子级按父级分组的情况。这种做法效果很好,但是当存在分组项目时,要在列表顶部添加一个“选择子项”的选项以及设置所选项就变得有些复杂。
这是我的仓库代码:
Children = await results.OrderBy(m => m.ParentId).ThenBy(m => m.Date)
.Select(m => new SelectListItem {
Value = m.Id.ToString(),
Text = m.Date.ToString() + ": " + m.Title.ToString(),
Group = new SelectListGroup { Name = m.Parent.LastName }
}).ToListAsync();
var tip = new SelectListItem() {
Value = null,
Text = "Select Child",
Group = new SelectListGroup { Name = "Default" }
};
Children.Insert(0, tip);
return new SelectList(Children, "Value", "Text", null, "Group.Name");
这段代码能够工作,但它将提示项放入了一个名为“Default”的分组中,位于列表顶部,虽然不是大问题,但实际上HTML允许在具有分组选项的select元素中同时存在一些未分组的选项。
当我创建提示项为一个新的SelectListItem但不包含分组时:
var tip = new SelectListItem() { Value = null, Text = "Select Meeting" };
在Razor视图代码中使用@Html.DropDownListFor()
时,会抛出空引用异常。我不确定问题是否出在HTML辅助方法上,或者我尝试做的事情是否不受服务器端SelectList类的支持。
我想要得到的结果是在服务器端(控制器和视图)构建出来的如下所示:
<select id="ParentId" name="ParentId" style="width: 100%">
<option value="">Select Child</option>
<optgroup label="Parent 1">
<option value="2">Child 2-1</option>
<option value="3">Child 3-1</option>
<option value="1">Child 1-1</option>
</optgroup>
<optgroup label="Parent 2">
<option value="5">Child 2-2</option>
<option value="6">Child 3-2</option>
<option value="4">Child 1-2</option>
</optgroup>
</select>