2010-10-25 186 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