ASP.NET MVC 5 视图模型绑定
ASP.NET MVC 5 ViewModel Binding
我无法绑定从控制器中 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生成了标准的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);
}
您正在向自身添加一个集合:
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
只是自找麻烦.)
我无法绑定从控制器中 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生成了标准的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);
}
您正在向自身添加一个集合:
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
只是自找麻烦.)