通常我会使用DropDownListFor
SelectList
@Html.DropDownListFor(model => model.CustomerId, new SelectList(Model.Orders, "OrderId", "ItemName"))
有没有办法通过强类型lambdas而不是属性字符串来做到这一点。例如:
@Html.DropDownListFor(model => model.CustomerId, new SelectList(Model.Orders, x => x.OrderId, x => x.ItemName))
答案 0 :(得分:13)
您可以在控制器中创建选择列表,并将其分配给视图模型中的属性:
public IEnumerable<SelectListItem> OrdersList { get; set; }
控制器中的代码如下所示:
model.OrdersList = db.Orders
.Select(o => new SelectListItem { Value = o.OrderId, Text = o.ItemName })
.ToList();
在视图中,您可以像这样使用它:
@Html.DropDownListFor(model => model.CustomerId, Model.OrderList)
我个人更喜欢这种方法,因为它减少了视图中的逻辑。它还可以使你的逻辑“严格打字”,在任何地方都没有神奇的字符串。
答案 1 :(得分:0)
似乎没有重载的构造函数来允许这样做。
但手动指定DataTextField
和DataValueField
并不会有任何损害吗?
答案 2 :(得分:0)
为此你可以使用ViewBag将数据存储到下拉控件中
这是一个例子..............
@Html.DropDownList("department", (IEnumerable<SelectListItem>)@ViewBag.DepartmentList, new { value = @ViewBag.department, style = "width:140px", onchange = "OnDepartmentChange(this)" })
在Index方法的控制器中,您可以像
一样编写 ViewBag.Department = department;
答案 3 :(得分:0)
当我们使用强类型视图时,可以使用@Html.DropDownListFor()
方法。此辅助方法需要首先列出下拉列表的部门列表,然后将在模型对象中传递的员工的部门ID设置为选定项。
public ActionResult edit(int id)
{
Employee emp = db.Employees.Where(e => e.EmployeeId == id).FirstOrDefault();
ViewBag.DepartmentListItems = db.Departments.Distinct().Select(i => new SelectListItem() { Text = i.DepartmentName, Value = i.DepartmentId.ToString() }).ToList();
return View(emp);
}
视图包中的列表项将用于绑定dropddownlist,并且html helper将基于传递给视图的DepartmentId
模型来设置Employee
。查看下面的代码。
@Html.DropDownListFor(model => model.DepartmentId, ViewBag.DepartmentListItems as IEnumerable<SelectListItem>,"Select")