2011-06-22 26 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