我觉得这个问题的答案必须在几个地方出现,因为这个问题的变体似乎被问了很多。不幸的是,我无法准确掌握如何做我想要实现的目标,因此再次非常感谢您的帮助。
我有一个用户组列表,每个用户组都分配给一个工作人员。这是通过遍历用户组列表并在每个用户组旁边显示可用员工的下拉列表来完成的。也应该可以不分配工作人员,因此应该可以使用空值选择选项。
在创建新组时,将 null 值作为默认值很好,但我只是在更新现有记录时,我希望下拉菜单默认为具有匹配员工 ID 的选项。
所以我查询可用的工作人员:
var rtrnStaff = (from st in db.PrmTbl_Staffs
join sal in db.PrmTbl_Salutations on st.SalutationID equals sal.ID
where st.Active == true
select new { st.ID, Name = sal.Desc + ". " + st.Name });
要在此数组中插入一个空白值:
List<SelectListItem> staff = new SelectList(rtrnStaff, "ID", "Name").ToList();
staff.Insert(0, (new SelectListItem { Text = "None", Value = "0" })); //can value be = null?
在我看来,对于创建新用户组的表单,我可以提供如下下拉列表:
@Html.DropDownList( "staffID", (IEnumerable<SelectListItem>)ViewData["StaffwNull"])
这提供了一个下拉菜单,首先是“无”选项,这很好。但是,当我为我的更新表单尝试同样的事情时,添加了一个默认值参数,它不起作用:
@Html.DropDownList( "staffID", (IEnumerable<SelectListItem>)ViewData["StaffwNull"], item.StaffID)
目的是当放置在 foreach 循环中时,与相关人员 ID 匹配的选项将显示为默认值。相反,“无”仍然是第一个选项。
我确实尝试只在我的控制器中查询表,而不是在那里构建一个选择列表,而是通过 ViewData 将结果直接传递给 View,然后在 View 中执行以下操作:
@Html.DropDownList("staffID", new SelectList(
(System.Collections.IEnumerable) ViewData["Staff"], "ID", "Name", item.StaffID),
new { Name = "staffID" })
这没有问题,但没有“无”选项。显然我需要一些中间立场!在 DropDownList、DropDownListFor、List、SelectList 等之间,我很困惑。
编辑
(显示代码的当前状态)
控制器:
var rtrnStaff = (from st in db.PrmTbl_Staffs
join sal in db.PrmTbl_Salutations on st.SalutationID equals sal.ID
where st.Active == true
select new { st.ID, Name = sal.Desc + ". " + st.Name });
List<SelectListItem> staff = new SelectList(rtrnStaff, "ID", "Name").ToList();
ViewData["StaffwNull"] = staff;
看法:
//show dropdown of all staff,
//defaulting to "None" value (works)
@Html.DropDownList("staffID", (IEnumerable<SelectListItem>)ViewData["StaffwNull"], "None")
//show dropdown of all staff,
//defaulting to value matching item.staffID (doesn't work)
//default selection is first list item
//and list doesnt include "None" option
@foreach (var item in Model)
{
...
var thisStaffID = item.StaffID;
....
@Html.DropDownList( "staffID", (IEnumerable<SelectListItem>)ViewData["StaffwNull"], thisStaffID)
}