如何手动mapa viewmodel与列表到dto

时间:2017-04-25 22:14:51

标签: c# asp.net-mvc

我是后端开发的新手,在将视图模型映射到具有列表的dto时遇到了一些麻烦。

你能帮我弄清楚映射器有什么问题。结果从dto正确。我有7个项目的清单。当它映射到视图时,它们就消失了。

这是viewmodel

public class StatisticsViewModel : BaseViewModel
{
    public string StartDate { get; set; }
    public string EndDate { get; set; }
    public string ProviderId { get; set; }
    public List<StatisticsTotalsViewModel> Totals { get; set; } = new List<StatisticsTotalsViewModel>();
    public List<StatisticsProvidersViewModel> Providers { get; set; } = new List<StatisticsProvidersViewModel>();
}

public class StatisticsTotalsViewModel
{
    public string PayerName { get; set; }
    public string PayerType { get; set; }
    public short Status { get; set; }
    public int TotalCount { get; set; }
    public decimal TotalBalance { get; set; }
}

继承人dto

public class StatisticsDto
{
    public string StartDate { get; set; }
    public string EndDate { get; set; }
    public string ProviderId { get; set; }
    public List<StatisticsTotalsDto> Totals { get; set; } = new List<StatisticsTotalsDto>();
    public List<StatisticsProvidersDto> Providers { get; set; } = new List<StatisticsProvidersDto>();
}

public class StatisticsTotalsDto
{
    public string PayerName { get; set; }
    public string PayerType { get; set; }
    public short Status { get; set; }
    public int TotalCount { get; set; }
    public decimal TotalBalance { get; set; }
}

这是映射器

    public static StatisticsViewModel MapToView(StatisticsDto dto)
    {
        var viewmodel = new StatisticsViewModel();

        viewmodel.StartDate = dto.StartDate;
        viewmodel.EndDate = dto.EndDate;
        viewmodel.ProviderId = dto.ProviderId;

        var dtoTotals = new List<StatisticsTotalsDto>();
        var totals = new List<StatisticsTotalsViewModel>();

        foreach (var item in dtoTotals)
        {
            var totalsModel = new StatisticsTotalsViewModel();
            item.PayerName = totalsModel.PayerName;
            item.PayerType = totalsModel.PayerType;
            item.Status = totalsModel.Status;
            item.TotalBalance = totalsModel.TotalBalance;
            item.TotalCount = totalsModel.TotalCount;
            totals.Add(totalsModel);
        }

        viewmodel.Totals = totals;

       return viewmodel;

    }

2 个答案:

答案 0 :(得分:1)

这一行的问题。代替

var dtoTotals = new List<StatisticsTotalsDto>();

您需要接收StatisticsTotalsDto列表,而不是创建新的空列表

var dtoTotals = dto.Totals;

答案 1 :(得分:0)

您可以尝试Automapper.

比如说:

public static StatisticsViewModel MapToView(StatisticsDto dto)
{
     Mapper.Initialize(cfg => cfg.CreateMap<StatisticsDto, StatisticsViewModel>());
     var ViewModel = Mapper.Map<StatisticsViewModel>(dto);

     return viewModel;
}

请查看here以了解有关Automapper的更多信息。如果您遇到问题映射列表项,也可以检查herehere

P.S 请勿忘记将Automapper添加到您的项目中,并在您使用它的顶部添加using Automapper()