我正在尝试使用View,用户可以在集合中添加项目而无需转到新视图(该场景是一种CV网站,用户可以在其中添加有关工作经验,技能等的信息,并且去一个新的视图添加每个小东西似乎很荒谬。
所以我有一个编辑视图,显示已经添加的项目的许多文本框,并且有一个ajax调用,用于在用户添加项目时转到获取新集合的方法。
以下是有问题的方法:
public ActionResult Edit(int id)
{
Consultant consultant = _repository.GetConsultant(id);
var vm = GetViewModel(consultant);
return View(vm);
}
private DetailsViewModel GetViewModel(Consultant consultant)
{
return new DetailsViewModel
{
Programs = consultant.Programs.ToList(),
Consultant = consultant
};
}
public ActionResult NewProgram(int id)
{
//TODO: ordering is rather strange, because the entitycollection adds at the beginning rather than the end...
Consultant consultant = _repository.GetConsultant(id);
consultant.Programs.Add(new Program());
_repository.Save();
var vm = GetViewModel(consultant);
return PartialView("ProgramList", vm);
}
现在问题:当调用NewProgram方法时,它会向Consultant对象添加一个新程序并创建一个新的ViewModel以便发回,但是它将新程序添加到EntityCollection的开头,而不是最后。但是当您发布整个表单并再次打开“编辑视图”时,列表将在最后添加新添加的程序。这很奇怪。用户会认为他/她在列表的开头添加了一个项目,但如果他们再次返回该页面,他们将在最后找到新项目。
为什么会这样做,有什么方法可以让NewProgram()直接在最后添加新程序?
如果有人在考虑“他应该使用ViewModel”而不是直接使用EF对象,那么,我已经走了很长一段时间了(Entity Framework and MVC 3: The relationship could not be changed because one or more of the foreign-key properties is non-nullable),所以远没有人明确告诉我如何实现这一点,仍然能够在同一个视图中添加和删除项目。维护集合的索引存在问题,或者实体框架不会让我保存...而且代码变成了一场噩梦。
这样我至少可以理解代码,唯一的问题是我需要以“正常”顺序完成此添加,即在集合的末尾添加...
有什么想法吗?
顺便说一句:
这很有效,但首先必须将新程序添加到Consultant对象,创建没有新程序的ViewModel,然后将其单独添加到ViewModel中......
public ActionResult NewProgram(int id)
{
//TODO: ordering is rather strange, because the entitycollection adds at the beginning rather than the end...
Consultant consultant = _repository.GetConsultant(id);
var vm = GetViewModel(consultant);
var program = new Program();
consultant.Programs.Add(program);
_repository.Save();
vm.Programs.Add(program);
return PartialView("ProgramList", vm);
}
答案 0 :(得分:1)
根据http://blogs.msdn.com/b/adonet/archive/2009/12/22/poco-proxies-part-1.aspx,您的导航属性Programs
会被覆盖,以调用某种DoLazyLoad()
方法。由于属性实例本身没有必要更改,DoLazyLoad()
实际上可能是异步的,这可能会导致您注意到的行为。
由于您无论如何都在评估列表,因此可以在添加新程序之前调用ToList()
。它需要你只改变一点:
consultant.Programs.ToList().Add(new Program());
如果这不起作用,请尝试:
consultant.Programs.ToList();
consultant.Programs.Add(new Program());
这实际上不适合我的“异步”理论,但可能会帮助你。