Razor,MVC4,@ html.dropdownlistfor problems

时间:2012-06-27 16:24:27

标签: 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; }
    }

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

[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)

这显然是非常错误的。任何帮助将不胜感激......!

3 个答案:

答案 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)

EmployeeIdIEnumerable<SelectListItem>,而不是SelectList 因此,你的演员阵容无法奏效。

您需要明确创建SelectList