修改MVC 5中的DropdownList项

时间:2015-09-13 05:02:45

标签: c# asp.net-mvc drop-down-menu asp.net-mvc-5

我真的很困惑DropdownList在MVC中的工作方式

我基本上拥有EmployeeID和EmployeeReportsToID的表Employee。因此,每当我编辑/创建一个Employee时,我想为EmployeeReportsToID字段提供DropdownList,其中的项目来自Employee表本身。

下面是我拥有的代码,它运行良好。

控制器

ViewBag.EmployeeReportsToID = new SelectList(db.Employees.ToList(), "Employeeid", "Description", Employee.EmployeeReportsToID);

视图

<div class="col-md-10">@Html.DropDownList("EmployeeReportsToID", null, htmlAttributes: new { @class = "form-control" })  </div>

现在我几乎没有问题

  1. dropdownList如何知道从哪里带来物品。 DropDownList中的我的参数为null。

  2. 如何修改DropdownList中的项目。我基本上想要根据同一个表中的某个字段手动将Employee标题添加到其名称中。例如,项目可以如下所示。

  3.   

    员工1 - 销售经理

         

    员工2 - 副总裁

         

    员工3 - 开发人员

         

    员工4 - 开发人员

         

    员工5 - 软件经理

3 个答案:

答案 0 :(得分:1)

ViewBag:

ViewBag.EmployeeReports = new SelectList(db.Employees.ToList()), "Employeeid", "Description");

为了填充您的下拉列表,您可以使用this extension method并设置您想要的任何内容:

public static IList<SelectListItem> ToSelectList<T>(this IEnumerable<T> itemsToMap, Func<T, string> textProperty, Func<T, string> valueProperty, Predicate<T> isSelected)
{
    var result = new List<SelectListItem>();

    foreach (var item in itemsToMap)
    {
        result.Add(new SelectListItem
        {
            Value = valueProperty(item),
            Text = textProperty(item),
            Selected = isSelected(item)
        });
    }
    return result;
}

然后将此方法称为:

ViewBag.EmployeeReports = db.Employees.ToList().ToSelectList(m => m.EmployeeId + " - " + m.EmployeeName, m.Id.ToString(), m => m.Id < -1);

查看:

@Html.DropDownList("EmployeeReportsToID", (SelectList)ViewBag.EmployeeReports, "-- Select ---", new { id= "reqType", @class = "form-control" })

答案 1 :(得分:1)

  1. 在下面的代码中,EmployeeReportsToID告诉从哪里获取列表。

    @Html.DropDownList("EmployeeReportsToID", null, htmlAttributes: new { @class = "form-control" })

    EmployeeReportsToID作为数据来源。如果你使用强类型视图,你实际上可以使用DropdownListFor的其他html助手。它看起来如下

    @Html.DropDownListFor(m => m.EmployeeReportsToID, Model.EmployeeReports, "Select one")

  2. 试试这段代码

    ViewBag.EmployeeReportsToID = = Employee.Select(x => new SelectListItem() { Text = x.EmployeeReportToId+" - "+x.EmployeeTitle, Value = x.EmployeeReportToId }); return list.ToList();

答案 2 :(得分:1)

第1部分。

当您向null的第二个参数提供DropDownList()时,该方法将回退到在ViewDataDictionary中搜索与第一个参数匹配的属性,以及该属性(如果是EmployeeReportsToIDIEnumerable<SelectListItem>(它是)它将使用它。

第2部分。

您可以生成SelectListItems的集合并设置Text属性

ViewBag.EmployeeReportsToID = new db.Employees.Select(e => new SelectListItem
{
  Value = e.Employeeid.ToString(), // assumes its typeof int
  Text = e.Description + " - " + e.SomeOtherProperty
});

但是,它建议您使用强类型帮助器绑定到模型中的属性。例如,如果视图中的模型具有属性(例如)int EmployeeReportsToID,那么

ViewBag.EmployeeList = new SelectList(db.Employees, "Employeeid", "Description"); // do not need .ToList()

并在视图中

@Html.DropDownListFor(m => m.EmployeeReportsToID, (SelectList)ViewBag.EmployeeList, "Please select")