我正在開發一個ASP.NET MVC應用程序,並且我遇到了一個非常尷尬的情況。ViewModels和ASP.NET MVC中的域模型
我有一個頁面,用戶可以通過一些標準搜索一些項目(比如學生)。我以前的學生集合傳遞給我的看法,但我已經添加了一些設置進行搜索,所以我已經決定要創建視圖模型如下
public class SearchViewModel
{
public string SearchString { get; set; }
public bool IsCaseSensitive { get; set; }
...
//other parameters
...
public IEnumerable<Student> Students { get; set; }
}
然後我想過的情況時,我必須向每個學生添加一些額外的信息,這些信息並不存儲在數據庫中並在控制器上生成。我的第一個想法是很愚蠢的一個 - 我已經添加了額外的陣列將其保存在視圖模型是這樣的:
public class SearchViewModel
{
public string SearchString { get; set; }
public bool IsCaseSensitive { get; set; }
...
//other parameters
...
public IEnumerable<Student> Students { get; set; }
public IEnumerable<int> someData { get; set; }
}
這樣得到的數據,客戶端代碼就一定得在學生的位置數組,然後轉到someData數組中的相應位置。
我不太喜歡這個想法,所以我改變了我的模型,包括搜索參數+一個額外的模型來保存學生對象和他們的數據。
public class SearchViewModel
{
public string SearchString { get; set; }
public bool IsCaseSensitive { get; set; }
...
//other parameters
...
public IEnumerable<StudentViewModel> StudentModels { get; set; }
}
public class StudentViewModel
{
public Student Student { get; set; }
public int someData { get; set; }
}
這是個好主意來創造這樣的 '幫手' 模型作爲StudentViewModel?我可能不會使用StudentViewModel,但在SearchViewModel內部。鑑於SearchViewModel本身就是一種「幫助」模型,創建另一個僅在SearchViewModel中使用的模型似乎有點奇怪。是這樣嗎?
據我發現,一個ViewModel不應該包含域模型。我應該將學生資產分成較小的資產嗎?舉例來說,像這樣:
public class StudentViewModel { public string Name { get; set; } public int GroupId { get; set; } public int someData { get; set; } }
一般來說,因爲我已經明白,一個視圖模型應該包括只有原語及其藏品(和可能,其他的ViewModels作爲第一個問題)。這是對的嗎?
謝謝。我唯一不完全理解的是你的第三個答案。參考你的第二個答案,我不應該在我的Views中使用任何領域模型(通常的Student,不是StudentViewModel)。然而,那麼你說我實際上應該使用我的學生課。我是否正確地認爲最好的方法是1)保持領域模型學生不變,2)使用StudentViewModel來滿足視圖的需求,而不是將其劃分爲不同的屬性?另外,我對DTO條款不太滿意。我的ViewModels可以被視爲DTO嗎? – 2014-11-24 18:42:12