asp.net mvc 5 -在控制器中从实体模型填充ViewModel,反之亦然



我已经开始使用MVC一段时间了,我正在学习不同的方法来处理不同的场景。处理单一场景可能有不同的方法,哪一种更有效,哪一种更好,这是相当有争议的。

我的困惑与实体模型和视图模型的使用有关。我为每个数据库实体创建了单独的实体模型,也为每个视图创建了单独的视图模型。现在我有一个简单的视图,上面有文本框、单选按钮、复选框和下拉列表。我在视图上有两种方式的数据绑定,并且我使用相同的视图来创建新记录和编辑现有记录。

我的困惑是,我正在从数据库中检索实体模型,并从实体模型中填充ViewModel的每个字段,然后将ViewModel传递给模型。现在,这必须为每个字段手动完成。那么,是否有一些方法通过ViewModel和实体模型在运行时自动映射?例如,在一个简单的视图中,我做了如下操作:

List<User> UserList = db.Users.ToList();
        List<UserViewModel> UsersViewModel = new List<UserViewModel>();
        foreach (User user in UserList)
        {
            UserViewModel model = new UserViewModel();
            model.FirstName = user.FirstName;
            model.LastName = user.LastName;
            model.DOB = user.DOB;
            model.Addresses = user.Addresses;
        }

当ViewModel手动填充时,我将它传递给视图。此外,为了将记录保存到数据库,我做了相反的事情,并从ViewModel填充实体模型。对我来说,一定有一些更有效和更短的方法来做我正在做的事情。我在MVC4 c#中检查了类似的问题,从数据库中填充视图模型中的数据,但它没有回答我的问题,而是解决了一些错误。

使用AutoMapper之类的工具。一旦您配置了映射,您就可以像这样填充视图模型:

var user = db.Users.First();
var uservm = Mapper.Map<UserViewModel>(user);
var users = db.Users.ToList();
var usersvm = Mapper.Map<IEnumerable<UserViewModel>>(users);

一般来说,自动映射是单向的,并且只对实体到视图模型是安全的。映射回实体类型仍然是手动完成的。

对于您的手动示例,出于性能原因,您希望使用投影而不是迭代:

var users = db.Users.Select(u => new UserViewModel {
    FirstName = u.FirstName,
    LastName = u.LastName,
    ...
});

最新更新