【问题标题】:Modify DropdownList items in MVC 5修改 MVC 5 中的 DropdownList 项
【发布时间】:2015-09-13 14:00:19
【问题描述】:

我真的很困惑 DropdownList 在 MVC 中是如何工作的

我基本上有具有 EmployeeID 和 EmployeeReportsToID 的表 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 中的参数为空。

  2. 如何修改 DropdownList 中的项目。我基本上想根据同一张表中的某些字段手动将员工头衔添加到他们的姓名中。例如项目可以如下。

员工 1 - 销售经理

员工 2 - 副总裁

员工 3 - 开发人员

员工 4 - 开发人员

员工 5 - 软件经理

【问题讨论】:

  • 代码不起作用 - 在.ToList() 之后你有一个额外的) - 但假设这只是一个错字:)。向您展示Employees 的模型(您要添加哪个额外属性?)
  • 谢谢斯蒂芬。是的,这是错字。额外属性可以是任何字符串字段。

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


【解决方案1】:

查看包:

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" })

【讨论】:

  • 谢谢西尔万。它有帮助。
【解决方案2】:
  1. 在下面的代码中,EmployeeReportsToID 告诉从哪里获取列表。

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

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

    @Html.DropDownListFor(m =&gt; 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();

【讨论】:

    【解决方案3】:

    第 1 部分。

    当您将null 提供给DropDownList() 的第二个参数时,该方法回退到在ViewDataDictionary 中搜索与第一个参数匹配的属性,并且如果该属性(在您的情况下为EmployeeReportsToID)是@ 987654325@(它就是)它会使用它。

    第 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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-07
      • 2016-08-09
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 2014-02-09
      相关资源
      最近更新 更多