Как на самом деле отобразить объект Model в объект ViewModel, используя AutoMapper в ASP.Net core 2? - PullRequest
0 голосов
/ 08 мая 2019

На моих классах ASP.NET мне сказали разработать простое приложение, считывающее данные из файла .csv и затем отображающее их в виде. У меня есть модель, в которую я импортирую данные из файла .csv. У меня также есть ViewModel, которая содержит свойства, которые я действительно хочу отображать в моем представлении. Как обработать сопоставление Model с объектом ViewModel с помощью AutoMapper?

Я создал профиль конфигурации для сопоставления, которое я хотел бы выполнить, я зарегистрировал конфигурацию в файле Startup.cs. Я врезаюсь в стену всякий раз, когда хочу на самом деле выполнить сопоставление в моем контроллере, потому что я не знаю, как обрабатывать сопоставление. Enumerables

Класс моей модели:

public class Donation
    {
        public string First_Name { get; set; }
        public string Last_Name { get; set; }
        public long Pesel { get; set; }
        public string Donation_date { get; set; }
        public string Donated_blood_amount { get; set; }
        public string Blood_type { get; set; }
        public string Blood_factor { get; set; }
        public string Address { get; set; }
    }

Мой класс ViewModel:

public class DisplayDonatorViewModel
    {
        public string First_Name { get; set; }
        public string Last_Name { get; set; }
        public string Donated_blood_amount { get; set; }

    }

Класс профиля My AutoMapper:

public class DisplayDonatorViewModelProfile : Profile
    {
        public DisplayDonatorViewModelProfile()
        {

            CreateMap<Donation, DisplayDonatorViewModel>()
                .ForMember(destination => destination.First_Name, h => h.MapFrom(source => source.First_Name))
                .ForMember(destination => destination.Last_Name, h => h.MapFrom(source => source.Last_Name))
                .ForMember(destination => destination.Donated_blood_amount, h => h.MapFrom(source => source.Donated_blood_amount));



        }
    }

Конфигурация внутри Startup.cs

var config = new MapperConfiguration(cfg => {
                cfg.AddProfile<DisplayDonatorViewModelProfile>();
            });

            var mapper = config.CreateMapper();

Теперь к основной проблеме, вот контроллер

public class DonationsController : Controller
    {
        private readonly IHostingEnvironment _env;
        private readonly IMapper _mapper;
        public DonationsController(IHostingEnvironment env, IMapper mapper)
        {
            _env = env;
            _mapper = mapper;
        }

        public IActionResult Index()
        {
            string webRootPath = _env.WebRootPath;
            string dataFolder = "data";
            string fileName = "MOCK_DATA.csv";
            string csvFilePath = Path.Combine(webRootPath, dataFolder, fileName);
            IEnumerable<Donation> dataRecords;
            IEnumerable<DisplayDonatorViewModel> displayDonatorViewModels;

            using (var reader = new StreamReader(csvFilePath))
            using (var csv = new CsvReader(reader))
            {
                dataRecords = csv.GetRecords<Donation>().ToList();

            }            
            displayDonatorViewModels = _mapper.Map<Donation, DisplayDonatorViewModel>(dataRecords); //does not work, "cannot convert from 'System.Collections.Generic.IEnumerable<BloodDonatorsApp.Models.Donation>' to 'BloodDonatorsApp.Models.Donation'

            return View(dataRecords);
        }
    }

dataRecords - это переменная IEnumerable с данными из csv. Я хотел бы отобразить этот объект и его данные в IEnumerable displayDonatorViewModels и передать его в мое представление вместо передачи перечисляемых объектов Donation.

Решение, вероятно, действительно простое, и я упускаю что-то простое, но я ничего не могу понять после просмотра документации AutoMapper, мне это кажется очень расплывчатым, тем более что я новичок

1 Ответ

1 голос
/ 08 мая 2019

Составление карт перечисления встроено. Пока есть сопоставления для универсальных типов, AutoMapper может отображать в перечисляемые типы этих типов. Другими словами:

var displayDonatorViewModels = _mapper.Map<IEnumerable<DisplayDonatorViewModel>>(dataRecords);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...