使用 ViewBag 在下拉列表绑定中包含 'ALL' 选项

Include 'ALL' option in dropdownlist bind using ViewBag

我已经通过 Viewbag 从控制器绑定了视图中的下拉列表,如下所示:

ViewBag.test = from p in _userRegisterViewModel.GetEmpPrimary().ToList().Where(a => a.UserType_id != Convert.ToInt32(Session["loginUserType"].ToString()))
                           select new
                           {
                Id = p.EmpId,
                Name =  p.First_Name.Trim() + " " + p.Last_Name.Trim()
            };

鉴于我的绑定如下:

@Html.DropDownListFor(model => model.EmpId, new SelectList(@ViewBag.test, "Id", "Name"),
                        new { @class = "form-control", id="ddlEmp" })

现在我想在此下拉列表中插入 "ALL" 和“--Select--”..我该怎么做.. 谁能帮我做这个.. 提前致谢..

您可以使用接受 optionLabelDropDownlistFor()overloads 之一向下拉列表添加 null 选项,例如

@Html.DropDownListFor(m => m.EmpId, new SelectList(@ViewBag.test, "Id", "Name"), "--select--", new { @class = "form-control", id="ddlEmp" })

这将生成第一个选项 <option value="">--select--</option>

但是,如果您想同时包含 "--select--""ALL" 选项,您需要在控制器中生成您自己的 IEnumerable<SelectListItem> 并将其传递给视图。我建议使用带有 IEnumerable<SelectListItem> 属性 的视图模型作为选项,但使用 ViewBag,控制器中的代码将是

List<SelectListItem> options = _userRegisterViewModel.GetEmpPrimary()
    .Where(a => a.UserType_id != Convert.ToInt32(Session["loginUserType"].ToString()))
    .Select(a => new SelectListItem
    {
        Value = a.EmpId.ToString(),
        Text = a.First_Name.Trim() + " " + a.Last_Name.Trim()
    }).ToList();
// add the 'ALL' option
options.Add(new SelectListItem(){ Value = "-1", Text = "ALL" });
ViewBag.test = options;

请注意,我已将 ALL 选项的值设为 -1,假设您的 EmpId 值中的 none 将为 -1

然后在视图中,生成下拉列表的代码将是

 @Html.DropDownListFor(m => m.EmpId, (Ienumerable<SelectListItem>)ViewBag.test, "--select--", new { @class = "form-control" })

不确定为什么要将 id 属性从 id="EmpId" 更改为 id="ddlEmp"

然后在 POST 方法中,首先检查 ModelState 是否无效(如果用户选择了 "--select--" 选项,将发布 null 的值并且模型将无效),因此 return 视图(不要忘记重新分配 ViewBag.test 属性)。

如果ModelState有效,则检查model.EmpId的值。如果是 -1,则用户选择了 "ALL",否则他们选择了一个特定选项。