我有一个Entity Framework建模一个有大约30个表的遗留数据库。我正在使用ASP.NET MVC 4,并且很乐意在我的EDM中使用基于实体的脚手架。我已经看到了大量的例子,但我遇到了一个问题。我的需求并不像我所看到的那样,如下所示:创建一个支撑“客户”实体的控制器,在保存更改后,Controller操作接受客户作为其参数并使用模型绑定一切都很好完成以下操作后:
[HttpPost]
public ActionResult Create(Customer customer)
{
if (ModelState.IsValid)
{
db.Customers.AddObject(customer);
db.SaveChanges();
return RedirectToAction("Index");
}
}
完美而且非常正确;这对我不起作用。在我的情况下,我的屏幕需要来自大约6个不同实体的字段,并更新回相同的6个实体。
这是一个2部分问题:
如果我完全偏离基地,请指导我。我想知道我是如何完成这项任务的,因为它会在我的MVC应用程序中反复出现,我需要知道如何在可能的情况下仍然使用脚手架和模型绑定。
谢谢!
答案 0 :(得分:2)
当您遇到这样的场景时,是时候开始考虑使用ViewModels和EditModels,它们是专门用于显示View所需的确切属性的模型。
这样做的一个策略是:
一些注意事项:
ViewModel示例(来自NerdDinner教程)
public class DinnerFormViewModel {
// Properties
public Dinner Dinner { get; private set; }
public SelectList Countries { get; private set; }
// Constructor
public DinnerFormViewModel(Dinner dinner) {
Dinner = dinner;
Countries = new SelectList(PhoneValidator.AllCountries, dinner.Country);
}
}
// controller actions
[Authorize]
public ActionResult Edit(int id) {
Dinner dinner = dinnerRepository.GetDinner(id);
return View(new DinnerFormViewModel(dinner));
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection collection) {
Dinner dinner = dinnerRepository.GetDinner(id);
try {
UpdateModel(dinner);
dinnerRepository.Save();
return RedirectToAction("Details", new { id=dinner.DinnerID });
}
catch {
ModelState.AddModelErrors(dinner.GetRuleViolations());
return View(new DinnerFormViewModel(dinner));
}
}