Razor,MVC4,@ html.dropdownlistfor problems

And*_*ear 5 razor asp.net-mvc-4

我正在尝试创建一个从数据库填充的下拉列表.我有:

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; }
    }
Run Code Online (Sandbox Code Playgroud)

我想要的是创建一个表单,该表单将创建与项目和员工相关的新项目时间.我正在尝试使用下拉列表在创建表单上显示员工和项目.显然,我对此完全陌生,但到目前为止我所做的是:

[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");
         }
     }
Run Code Online (Sandbox Code Playgroud)

并在表格上:

@model TimesheetMVC.Models.ProjectHour
...
@Html.DropDownListFor(model => model.employeeId, (SelectList)ViewBag.EmployeeId)
Run Code Online (Sandbox Code Playgroud)

这显然是可怕的错误.任何帮助将非常感激...!

Dar*_*rov 13

不要使用相同的名称EmployeeId.在ASP.NET MVC中创建下拉列表需要两件事:一个标量属性将保存所选值,另一个属性将包含可能的值.但由于您使用的是ViewBag(我完全建议您反对),您可以执行以下操作:

ViewBag.Employees = emp;
Run Code Online (Sandbox Code Playgroud)

在你看来:

@Html.DropDownListFor(
    model => model.employeeId, 
    (IEnumerable<SelectListItem>)ViewBag.Employees
)
Run Code Online (Sandbox Code Playgroud)

但正如我所说,这根本不是我推荐的方法.我建议使用视图模型.因此IEnumerable<SelectListItem>,在视图模型上定义属性:

public IEnumerable<SelectListItem> Employees { get; set; }
Run Code Online (Sandbox Code Playgroud)

并在您的控制器中填充此视图模型属性,然后使您的视图强烈键入视图模型.


Lui*_*les 9

或者你可以在控制器中做一个

SelectList selectList = new SelectList(db.Employees, "Id", "LastName");
ViewBag.EmployeeList = selectList;
Run Code Online (Sandbox Code Playgroud)

并在视图中

@Html.DropDownBoxFor(model => model.id_Employee, ViewBag.EmployeeList as SelectList)
Run Code Online (Sandbox Code Playgroud)

我发现这种方法更容易.