Asp.net mvc Mvc代码优先样式

Asp.net mvc Mvc代码优先样式,asp.net-mvc,ef-code-first,Asp.net Mvc,Ef Code First,我制作了一个简单的MVC3网站。它工作得很好,但是数据库和类很混乱,因为我需要制作DropDownList,我不知道如何使用不同的样式实现DrowDownList 事情是这样的: public class Departments { public int ID {get; set;} ... } public class Users { public int ID {get; set;} ... public Department Dept {get; set;}

我制作了一个简单的MVC3网站。它工作得很好,但是数据库和类很混乱,因为我需要制作DropDownList,我不知道如何使用不同的样式实现DrowDownList

事情是这样的:

public class Departments
{
   public int ID {get; set;}
   ...
}

public class Users
{
   public int ID {get; set;}
   ...
   public Department Dept {get; set;}
   public List<Department> DeptList {get; set;}
   public string SelectedDept {get; set;}       
}
公共类部门
{
公共int ID{get;set;}
...
}
公共类用户
{
公共int ID{get;set;}
...
公共部门部门{get;set;}
公共列表部门列表{get;set;}
公共字符串SelectedDept{get;set;}
}

然后我用dropdownlist作为助手。遗憾的是,我对这段代码还不熟悉。所以,现在我在数据库中得到了这两个额外的不必要的列。有没有其他方法可以更干净/更好

你的班级应该是这样的

public class Users
{
   public int ID {get; set;}
   ...
   public virtual int DeptId {get; set;}
    [ForeignKey("DeptId")]
   public virtual Department Dept {get; set;}

}
然后在MVC.NET控制器中执行一个查询以填充List DeptList。 DeptList可以存储在ViewBag.DeptList中,也可以作为模型的属性返回视图

不需要字符串SelectedDept。当您使用DropDownList for helper时,它将自动为您设置Users.DeptId


也可以考虑将“用户”重命名为“用户”=

该列表应该只暴露于生成的视图模型。

从我在你的帖子中读到的内容来看,你将实际的POCO对象直接绑定到视图。这通常不符合您的最佳利益(原因之一是您看到了什么)。您将UI模型与数据实体紧密耦合。这不是你想要的情况

不要将POCO绑定到视图,而是创建一个中介,视图模型(如果愿意的话),类似这样

public class SomeMethodViewModel
{
    public SomeMethodViewModel()
    {
        DepartmentList = new List<Department>();
    }

    public int Id { get; set; }
    public string SelectedDepartment { get; set; }
    public List<Department> DepartmentList { get; set;
}
现在您有一个强类型模型要绑定到视图,并且POCO保持干净。当用户发回并且您已经验证了数据时,就需要将其映射到您的POCO实体

达维奥的回答也是正确的。我只是认为遗漏的一点是,你似乎直接从你的POCO绑定到视图


希望这有帮助

谢谢你的提示。字符串SelectedDept为@Html.DropDownListFor(model=>model.SelectedDept,新的SelectList(model.DeptList,“Value”,“Text”))。有dropdownlistfor帮助程序的示例吗?请使用@Html.dropdownlistfor(x=>x.DeptId,new SelectList(ViewBag.DeptList,“DerparmentName”,“id”),“Choose:”)之类的东西谢谢。的确你的两个答案都是正确的。无论如何,我会在设计视图模型时记住这些。
public ActionResult SomeMethod()
{
    var vm = new SomeMethodViewModel();
    vm.DepartmentList = **Some_Method_To_Retrieve_List_Of_Departments**

    return View(vm);
}