【发布时间】:2011-02-22 20:57:32
【问题描述】:
我有一个应用程序,用于在数据库中存储有关顾问的信息。该模型是一个实体框架模型,数据库表是与许多其他表(WorkExperiences、Programs、CompetenceAreas 等)具有一对多关系的顾问。现在,当我想在视图中创建一个新的顾问对象时,我真的只想将一个顾问对象作为模型传递给视图。但一方面,有人建议我 (Collection of complex child objects in Asp.Net MVC 3 application?) 我不应该这样做,而是使用 ViewModels。其次,也许这就是原因,当我尝试发布顾问对象时,如果将其用作视图中的模型,我收到一条错误消息“EntityCollection 已被初始化”,错误的原因似乎是对象的集合,例如 WorkExperiences。
所以我的第一个问题是为什么会出现这个错误。
但更重要的是,如果我应该改用 ViewModel,我该如何正确地做到这一点?因为我实际上已经尝试了一些东西,并且让它工作了。但是......代码很糟糕。谁能告诉我我应该怎么做才能让这个工作更干净?
让我向您展示我所拥有的(这同样有效,但在代码方面是一场噩梦):
GET 创建方法:
public ActionResult Create()
{
Consultant consultant = new Consultant();
ConsultantViewModel vm = GetViewModel(consultant);
return View(vm);
}
创建“ViewModel”的辅助方法(如果这实际上是 ViewModel 应该是的样子):
private ConsultantViewModel GetViewModel(Consultant consultant)
{
ConsultantViewModel vm = new ConsultantViewModel();
vm.FirstName = consultant.FirstName;
vm.LastName = consultant.LastName;
vm.UserName = consultant.UserName;
vm.Description = consultant.Description;
vm.Programs = consultant.Programs.ToList();
vm.Languages = consultant.Languages.ToList();
vm.Educations = consultant.Educations.ToList();
vm.CompetenceAreas = consultant.CompetenceAreas.ToList();
vm.WorkExperiences = consultant.WorkExperiences.ToList();
return vm;
}
POST 创建方法:
[HttpPost]
[ValidateInput(false)] //To allow HTML in description box
public ActionResult Create(ConsultantViewModel vm, FormCollection collection)
{
try
{
Consultant consultant = CreateConsultant(vm);
_repository.AddConsultant(consultant);
_repository.Save();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
创建顾问对象的辅助方法(这个方法特别糟糕,我必须检查集合是否不为空,以防用户决定不在这些列表中添加任何内容......):
private Consultant CreateConsultant(ConsultantViewModel vm)
{
Consultant consultant = new Consultant();
consultant.Description = vm.Description;
consultant.FirstName = vm.FirstName;
consultant.LastName = vm.LastName;
consultant.UserName = vm.UserName;
if (vm.Programs != null)
foreach (var program in vm.Programs)
consultant.Programs.Add(program);
if (vm.Languages != null)
foreach (var language in vm.Languages)
consultant.Languages.Add(language);
if (vm.Educations != null)
foreach (var education in vm.Educations)
consultant.Educations.Add(education);
if (vm.WorkExperiences != null)
foreach (var workExperience in vm.WorkExperiences)
consultant.WorkExperiences.Add(workExperience);
if (vm.CompetenceAreas != null)
foreach (var competenceArea in vm.CompetenceAreas)
consultant.CompetenceAreas.Add(competenceArea);
return consultant;
}
所以,它再次起作用,但远不如我可以直接使用顾问对象那样干净(如果不是因为“EntityCollection 已初始化”错误”......)。所以我应该怎么做?
【问题讨论】:
标签: entity-framework collections asp.net-mvc-3 viewmodel one-to-many