如何在ASP.NET MVC中将Controller对象列表转换为Controller上的viewmodel

时间:2009-11-08 23:50:51

标签: c# asp.net asp.net-mvc

我想知道将我检索到的域对象列表转换为控制器中的自定义ViewModel的最佳方法

e.g。

IList<Balls> _balls = _ballsService.GetBalls(searchCriteria);

进入

IList<BallViewModels> _balls = _ballsService.GetBalls(searchCriteria);

它不一定与我上面概述的完全相同,即它不必是IList,如果不是直接访问服务,而是通过一些其他层将对象转换为viewmodels,那么好的。

感谢

3 个答案:

答案 0 :(得分:7)

对于简单对象,您可以使用Linq:

IList<BallViewModel> _balls = _ballsService.GetBalls(searchCriteria)
    .Select(b => new BallsViewModel
                 {
                     ID = b.ID,
                     Name = b.Name,
                     // etc
                 })
    .ToList();

虽然这可能会非常重复,所以你可能想给你的BallViewModel类一个接受Ball的构造函数,并为你工作。

另一种方法是使用像AutoMapper这样的库将属性(甚至是嵌套的属性)从域对象复制到视图模型。

答案 1 :(得分:1)

可能有点像Linq,有点像

var ballQuery = from ball in _ballsService.GetBalls(searchCriteria)
                select new BallViewModels
                {
                    Diameter = ball.Diameter,
                    color = ball.Color,
                    ...
                }
IList<BallViewModels> _balls = ballQuery.ToList();

无论是那个问题还是问题都比我想象的要复杂......

答案 2 :(得分:1)

我一直使用AutoMapper来做这件事。它非常灵活,到目前为止对我没有任何麻烦。

首先,在应用初始化过程中设置地图:

Mapper.CreateMapping<Balls, BallViewModel>();

无论何时需要映射对象,都可以这样做:

Mapper.Map<IList<Balls>, IList<BallViewModel>>(_ballsService.GetBalls());

就像我说的那样,它非常灵活,您可以使用流畅的API修改每个属性的映射方式。