Привязка модели представления ASP.NET MVC 5

Я не могу привязать данные (события), полученные из службы в ViewModel в контроллере. Работает нормально без ViewModel.

Модель домена

namespace Tournament.Model
{
      public class Event
    {
        public int EventID { get; set; }
        public string Name { get; set; }
        public DateTime StartDate { get; set; }
        public DateTime EndDate { get; set; }
        public string Geolocation { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string Country { get; set; }
        public string Description { get; set; }
        public string Type { get; set; }

        public virtual List<Team> Teams { get; set; }

    }
}

Мне нужно всего несколько свойств для: ViewModel

    namespace Tournament.Web.ViewModel.EventViews
    {
        public class EventIndexViewModel
        {
            public int EventIndexViewModelID { get; set; }
            public string Name { get; set; }
            public DateTime StartDate { get; set; }
            public DateTime EndDate { get; set; }
            public string City { get; set; }

        }
    }

И теперь в контроллере у меня есть это (я пропустил часть инициализации службы - она ​​отлично работает). Итак, события содержат список событий (из модели предметной области).

        public ActionResult Index()
        {
            //Create list of Events
            var events = eventService.GetEvents();

            //Search events

            //Add _eventService Event details to var event

            var model = new EventIndexViewModel();
            List<EventIndexViewModel> modelList = new List<EventIndexViewModel>();

            foreach (var Event in events)
            {
                events.Add(new Event {
                    Name = model.Name,
                    StartDate = model.StartDate,
                    EndDate = model.EndDate });
                    modelList.Add(model);
            }           

            return View(modelList);
        }
    }
}

Сгенерировано стандартное представление списка на основе ViewModel и получено:

Server Error in '/' Application.

Collection was modified; enumeration operation may not execute.

Source Error: 


Line 36:             List<EventIndexViewModel> modelList = new List<EventIndexViewModel>();
Line 37: 
**Line 38:             foreach (var Event in events)**
Line 39:             {
Line 40:                 events.Add(new Event {

ОБНОВЛЕНИЕ - РЕШЕНИЕ. Теперь это рабочий контроллер:

 public ActionResult Index()
        {
            //Create list of Events
            var domainEvents = eventService.GetEvents();


            //Add domain Events to ViewModel Event properties

            var eventViewModel = new EventIndexViewModel();
            List<EventIndexViewModel> eventListViewModel = new List<EventIndexViewModel>();

            foreach (var domainEvent in domainEvents)
            {
                eventListViewModel.Add(new EventIndexViewModel
                {    
                    Name = domainEvent.Name,
                    StartDate = domainEvent.StartDate,
                    EndDate = domainEvent.EndDate });
                }           

            return View(eventListViewModel);
        }

ОБНОВЛЕНИЕ 2 - короче, и я думаю, лучший способ сделать это с помощью LINQ

public ActionResult Index()
        {
            //Create list of Events
            var domainEvents = eventService.GetEvents();

            //Search events

            //Add domain Event list to ViewModel list

                var eventListViewModel = domainEvents.Select(
                    x => new EventIndexViewModel()
                    {
                        Name = x.Name,
                        StartDate = x.StartDate,
                        EndDate = x.EndDate,
                        City = x.City

                    })
                        .ToList();

            return View(eventListViewModel);
        }

person Harvey    schedule 20.05.2016    source источник
comment
Вы найдете это намного проще с linq .Select() - var eventListViewModel = domainEvents.Select(x => new EventIndexViewModel() { Name = x.Name, StartDate = x.StartDate, EndDate = x.EndDate }).ToList();   -  person    schedule 21.05.2016
comment
@Stephen Muecke Отлично, отлично работает. Добавлю в раствор.   -  person Harvey    schedule 21.05.2016


Ответы (1)


Вы добавляете коллекцию к себе:

foreach (var Event in events)
{
    events.Add(new Event {
    //...

Итак, для каждого event вы хотите добавить event? Возможно, вы хотели вместо этого добавить элементы в modelList?

foreach (var Event in events)
{
    modelList.Add(new EventIndexViewModel {
    //...

(Примечание: более четкая стратегия именования поможет вам легче выявлять проблемы. modelList на самом деле не говорит вам, что это такое. Вероятно, вы используете переменную events, потому что семантически вы должны работать с событиями. Возможно, вы можете вызвать их domainEvents и viewEvents? Кроме того, присвоение имени переменной Event, имеющей тип Event, просто вызывает проблемы.)

person David    schedule 20.05.2016
comment
Работает! Спасибо! Я помещу обновленный контроллер в сообщение под своим вопросом. Прокомментируйте, правильно ли сейчас выглядят соглашения об именах. - person Harvey; 20.05.2016