使用 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--”..我该怎么做..
谁能帮我做这个..
提前致谢..
您可以使用接受 optionLabel
的 DropDownlistFor()
的 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"
,否则他们选择了一个特定选项。
我已经通过 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--”..我该怎么做.. 谁能帮我做这个.. 提前致谢..
您可以使用接受 optionLabel
的 DropDownlistFor()
的 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"
,否则他们选择了一个特定选项。