对DropDownListFor的强类型绑定?

时间:2013-12-06 09:06:42

标签: c# asp.net asp.net-mvc asp.net-mvc-5 html.dropdownlistfor

通常我会使用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))

4 个答案:

答案 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)

似乎没有重载的构造函数来允许这样做。 但手动指定DataTextFieldDataValueField并不会有任何损害吗?

答案 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")