我真的很困惑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>
现在我几乎没有问题
dropdownList如何知道从哪里带来物品。 DropDownList中的我的参数为null。
如何修改DropdownList中的项目。我基本上想要根据同一个表中的某个字段手动将Employee标题添加到其名称中。例如,项目可以如下所示。
员工1 - 销售经理
员工2 - 副总裁
员工3 - 开发人员
员工4 - 开发人员
员工5 - 软件经理
答案 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)
在下面的代码中,EmployeeReportsToID
告诉从哪里获取列表。
@Html.DropDownList("EmployeeReportsToID", null, htmlAttributes: new { @class = "form-control" })
EmployeeReportsToID
作为数据来源。如果你使用强类型视图,你实际上可以使用DropdownListFor
的其他html助手。它看起来如下
@Html.DropDownListFor(m => m.EmployeeReportsToID, Model.EmployeeReports, "Select one")
试试这段代码
ViewBag.EmployeeReportsToID = = Employee.Select(x => new SelectListItem()
{
Text = x.EmployeeReportToId+" - "+x.EmployeeTitle,
Value = x.EmployeeReportToId
});
return list.ToList();
答案 2 :(得分:1)
第1部分。
当您向null
的第二个参数提供DropDownList()
时,该方法将回退到在ViewDataDictionary
中搜索与第一个参数匹配的属性,以及该属性(如果是EmployeeReportsToID
)IEnumerable<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")