2010-10-25 233 views
2

我正在創建這個MVC模型,並試圖理解最好的方式來做它。當我有表之間的關係時,我應該如何獲得相關數據。例如在下面的代碼中,我創建了一個formviewmodel,我是調用函數以獲取用戶的Images表中的所有圖像。我是否應該保留用戶模型的圖像屬性,並將其填充到存儲庫中的LINQ查詢中,而不是從模型中調用方法?有沒有辦法在LINQ中自動填充聯繫人的所有圖片?MVC模型與關係數據庫

public class UserFormViewModel { 

    UucsrRepository repository = new UucsrRepository(); 

    public User User { get; set; } 
    public SelectList States { get; private set; } 
    public SelectList Genders { get; private set; } 
    public List<Images> UserImages { get; set; } 

    public UserFormViewModel(User User) { 
     User = User; 
     UserImages = repository.GetUserImages(User.Id).ToList(); 
     States = new SelectList(repository.GetAllStates(), "ShortName", "Name"); 
     Genders = new SelectList(repository.GetAllGenders(), "Gender", "Description"); 

    } 
} 

謝謝!

回答

1

首先,在視圖模型中存儲實際存儲庫對象通常沒有意義。這違反了你應該只發送視圖到底需要什麼,只能發送視圖。他們的方式我通常創建viewmodels是一個非常基本的包裝,它幾乎沒有代碼。填充虛擬機的大部分邏輯都是使用存儲庫模式在控制器中完成的。

你的例子已經足夠清楚瞭解你應該或不應該使用視圖模型。

0

Kevin正確指出,ViewModel應該只包含您在視圖中用於表示目的的數據。在你的情況下,根據視圖的作用,你可能只發送一部分User屬性。例如,如果您只顯示一些用戶信息,但不修改它,則不需要發送用戶標識。我會去與像水木清華:

public class UserFormViewModel 
{ 
    public string UserName { get; set; } 
    public string Email { get; set; } 
    ... 
    public SelectList States { get; private set; } 
    public SelectList Genders { get; private set; } 
    public List<Images> UserImages { get; set; } 
} 

要填充(準備)視圖模型這是相當方便的使用單獨的helper方法:

private UserFormViewModel PopulateUserFormViewModel(int userId) 
{ 
    var model = new UserFormViewModel(); 
    var user = repository.GetUser(userId); 

    model.UserName = user.Name; 
    model.Email = user.Email; 
    ... 
    model.UserImages = repository.GetUserImages(userId).ToList(); 
    ... 

    return model; 
} 

而且在你的行動,你撥打:

public ActionResult ShowUser(int userId) 
{ 
    // maybe do something else 

    var userFormViewModel = PopulateUserFormViewModel(userId); 
    return View(userFormViewModel); 
} 

這只是其中一種可能的方式,但一般原則非常明確:保持您的ViewModel簡單(只需在視圖中需要的數據),並且最好創建一個可重用的方法將您的域名對象轉換爲您的ViewModel