Razor, MVC4, @html.dropdownlistfor 问题

标签 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)

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

最佳答案

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

ViewBag.Employees = emp;

在您看来:
@Html.DropDownListFor(
    model => model.employeeId, 
    (IEnumerable<SelectListItem>)ViewBag.Employees
)

但正如我所说,这根本不是我推荐的方法。我建议使用 View 模型。所以定义一个 IEnumerable<SelectListItem>您的 View 模型上的属性:
public IEnumerable<SelectListItem> Employees { get; set; }

并在您的 Controller 中填充此 View 模型属性,然后将您的 View 强类型化为 View 模型。

关于Razor, MVC4, @html.dropdownlistfor 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11230850/

相关文章:

c# - 如何使用 Razor View 引擎声明注释?

razor - 如何在mvc3中以货币格式显示金额

asp.net-mvc - 为什么要缓存操作结果?

javascript - 如何将包含按钮的 Kendo Grid 中的列的值发送到 ClientTemplate?

asp.net-mvc - MVC4中根据条件动态加载布局

javascript - 如何清除 MVC 应用程序中的浏览器缓存?

c# - Razor 2 到 Razor 3 MVC 5

Html.BeginForm 不会返回 POST 操作结果 - RAZOR

javascript - 为什么我的 List<string> 没有从 $ajax 调用的 MVC Controller 返回

c# - MVC4中基于下拉选择的FluentValidation Rule依赖验证