我正在尝试创建一个从数据库填充的下拉列表。我有:
public class Employee
{
[Key]
public int Id { get; set; }
[Required]
public String FirstName { get; set; }
[Required]
public String LastName { get; set; }
[Required]
public String JobTitle { get; set; }
}
public class Project
{
[Key]
public int Id { get; set; }
[Required]
public String ProjectName { get; set; }
[Required]
public String CompanyName { get; set; }
}
public class ProjectHour
{
[Key]
public int Id { get; set; }
[Required]
public decimal Hours { get; set; }
[Required]
public DateTime Date { get; set; }
public virtual ICollection<Employee> employeeId { get; set; }
public virtual ICollection<Project> projectId { get; set; }
}
我想要的是创建一个表单,该表单将创建与项目和员工关联的新项目时间。我正在尝试使用下拉列表在创建表单上显示员工和项目。显然,我对此完全陌生,但到目前为止我所拥有的是:
[HttpPost]
public ActionResult CreateProjectHour(ProjectHour newProjectHour)
{
using (var db = new TimesheetContext())
{
IEnumerable<SelectListItem> emp = db.Employees
.Select(c => new SelectListItem
{
Value = c.Id.ToString(),
Text = c.LastName
});
ViewBag.EmployeeId = emp;
db.ProjectHours.Add(newProjectHour);
db.SaveChanges();
}
return RedirectToAction("ProjectHourList");
}
}
在表格上:
@model TimesheetMVC.Models.ProjectHour
...
@Html.DropDownListFor(model => model.employeeId, (SelectList)ViewBag.EmployeeId)
这显然是非常错误的。任何帮助将不胜感激......!
答案 0 :(得分:13)
不要使用相同的名称EmployeeId。在ASP.NET MVC中创建下拉列表需要两件事:一个标量属性将保存所选值,另一个属性将包含可能的值。但是,由于您正在使用ViewBag(我完全建议您反对),您可以执行以下操作:
ViewBag.Employees = emp;
并在您看来:
@Html.DropDownListFor(
model => model.employeeId,
(IEnumerable<SelectListItem>)ViewBag.Employees
)
但正如我所说,这根本不是我推荐的方法。我建议使用视图模型。因此,在视图模型上定义IEnumerable<SelectListItem>
属性:
public IEnumerable<SelectListItem> Employees { get; set; }
并在您的控制器中填充此视图模型属性,然后将视图强烈键入视图模型。
答案 1 :(得分:9)
或者你可以做一个 在控制器中
SelectList selectList = new SelectList(db.Employees, "Id", "LastName");
ViewBag.EmployeeList = selectList;
并在视图中
@Html.DropDownBoxFor(model => model.id_Employee, ViewBag.EmployeeList as SelectList)
我觉得这种方法更容易。
答案 2 :(得分:0)
EmployeeId
是IEnumerable<SelectListItem>
,而不是SelectList
因此,你的演员阵容无法奏效。
您需要明确创建SelectList
。