Razor,MVC4,@html.dropdownlistforproblems

Razor,MVC4,@html.dropdownlistforproblems,razor,asp.net-mvc-4,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 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; }
    }

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

EmployeeId
是一个
IEnumerable
,而不是
SelectList

因此,你的演员不能工作


您需要显式创建一个
选择列表

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

ViewBag.Employees = emp;
在你看来:

@Html.DropDownListFor(
    model => model.employeeId, 
    (IEnumerable<SelectListItem>)ViewBag.Employees
)
@Html.DropDownListFor(
model=>model.employeeId,
(IEnumerable)ViewBag.Employees
)
但正如我所说,这根本不是我推荐的方法。我建议使用视图模型。因此,在视图模型上定义一个
IEnumerable
属性:

public IEnumerable<SelectListItem> Employees { get; set; }
public IEnumerable Employees{get;set;}
并在控制器中填充此视图模型属性,然后将视图强类型化为视图模型。

或者您可以只执行一次 在控制器中

SelectList selectList = new SelectList(db.Employees, "Id", "LastName");
ViewBag.EmployeeList = selectList;
在我看来

@Html.DropDownBoxFor(model => model.id_Employee, ViewBag.EmployeeList as SelectList)

我发现这种方法更容易。

哦,这就是它在呈现没有键为“Id”的“IEnumerable”类型的ViewData项时所产生的错误。使用静态DDLHelper类,我很容易尝试您完全推荐的解决方案,但它仍然会产生相同的错误,“没有具有键'employeeId'的'IEnumerable'类型的ViewData项。”。“。另一方面:你为什么建议反对它?你的GET操作中是否有填充
ViewBag.Employees
的相同代码?因为你所显示的是你的POST操作。我建议你反对它,因为在ASP.NET MVC中使用强类型视图模型是一种很好的做法,而不是将你的域模型传递给视图和n使用弱类型的ViewBag/ViewData。这是两个不同的源,用于向视图传递违反模式的信息。我修正了一点愚蠢之处,并将代码移动到GET操作……但现在我得到:“操作无法完成,因为DbContext已被释放。“是的,这是因为EF的延迟加载特性。您应该通过在控制器操作中调用
.ToList()
使其更为迫切:
ViewBag.Employees=emp.ToList()。这将强制在db上下文中加载一个渴望的内容。感谢您的帮助。。。但是现在:“LINQ to Entities无法识别方法'System.String ToString()'方法,并且此方法无法转换为存储表达式。”不是真的。
DropdownListFor
helper签名表示它需要一个可枚举的
SelectListItem
,因此您可以传递一个
列表
Collection1
,或者
IEnumerable
的任何自定义派生项,只要它包含正确的项目类型。
SelectList selectList = new SelectList(db.Employees, "Id", "LastName");
ViewBag.EmployeeList = selectList;
@Html.DropDownBoxFor(model => model.id_Employee, ViewBag.EmployeeList as SelectList)