【问题标题】:ASP.NET MVC 5 ViewModel BindingASP.NET MVC 5 ViewModel 绑定
【发布时间】:2016-05-20 14:20:04
【问题描述】:

我无法绑定从控制器中 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; }

    }
}

我只需要几个属性: 视图模型

    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; }

        }
    }

现在在 controller 我有这个(我省略了服务初始化部分 - 工作正常)。所以事件包含事件列表(来自域模型)。

        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生成标准List视图并得到:

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);
        }

【问题讨论】:

  • 你会发现使用 linq .Select() - var eventListViewModel = domainEvents.Select(x =&gt; new EventIndexViewModel() { Name = x.Name, StartDate = x.StartDate, EndDate = x.EndDate }).ToList(); 会容易得多
  • @Stephen Muecke 太好了,效果很好。我将添加到解决方案中。

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


【解决方案1】:

您正在向自身添加一个集合:

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

那么,对于每个event,您想添加一个event?也许您打算改为向modelList 添加元素?

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

(旁注:更简洁的命名策略将帮助您更轻松地识别问题。modelList 并没有真正告诉您它是什么。您可能正在使用events 变量,因为从语义上讲,您应该正在工作与事件。也许您可以称它们为domainEventsviewEvents?另外,命名Event 类型为Event 的变量只是在问问题。)

【讨论】:

  • 有效!谢谢!我将把更新的控制器放在我的问题后面。请评论命名约定现在是否合适。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多