2011-06-22 28 views
0

我做了一个简单的mvc 3网站。它工作正常,但数据库和类是凌乱的,因为我需要做下拉列表,我不知道如何实现使用不同风格的下沉列表。Mvc代码第一款

这里的东西怎么看起来像:

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;}  
} 

然后我用DropDownListFor帮手。可悲的是,我对这个代码的第一件事是新的。所以,现在我在数据库中得到了这两个额外的不必要的列。任何其他方式来做这个更清洁/更好?

回答

1

你的类应该是这样的

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

} 

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

字符串SelectedDept是不需要的。当你使用DropDownListFor帮助器时,它会自动为你设置Users.DeptId。

你也可以考虑改名“用户”为“用户” =)

+0

感谢您的提示。对于字符串SelectedDept,它是@ Html.DropDownListFor(model => model.SelectedDept,new SelectList(Model.DeptList,“Value”,“Text”))。任何样本的帮手下拉列表? – Bahamut

+0

使用类似于@ Html.DropDownListFor(x => x.DeptId,new SelectList(ViewBag.DeptList,“DerparmentName”,“id”),“Choose:”) – Daveo

0

列表中只应受到什么创造了这个视图模型。

从我正在阅读的文章中,您将实际的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; 
} 

现在您有一个视图模型,它是特定于您的操作并包含您所需的信息。你现在就行动起来变成一个类似于:

public ActionResult SomeMethod() 
{ 
    var vm = new SomeMethodViewModel(); 
    vm.DepartmentList = **Some_Method_To_Retrieve_List_Of_Departments** 

    return View(vm); 
} 

您现在有一个强类型的模型绑定到视图和你的POCO保持清洁。当用户回帖并验证数据时,这是将其映射到您的POCO实体的问题。

Daveo的回答也是正确的。我只是觉得错过的一点是你似乎直接从你POCO绑定到视图。

希望有帮助!

+0

谢谢。确实。你的两个答案都是正确的。不知何故,在视图模型的设计过程中,我会牢记这些。 – Bahamut