Mar*_*ark 2 c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-4
我正在尝试使用ViewModels和AutoMapper,因为我知道这些是避免许多问题的最佳实践.
我可以使用AutoMapper来填充视图模型,但是我不确定如何更新我的数据库,从ViewModel发回到我的控制器.
我的GET是:
public ActionResult Edit(int id = 0)
{
Customer customer = db.Customers.Find(id);
var offers = db.Offers.Where(x => x.CustomerId == id).ToList();
var email = db.Emails.FirstOrDefault();
var vm = new CreateViewModel();
vm.CustomerId = customer.CustomerId;
vm.ArrivalDate = customer.ArrivalDate;
vm.CustomerName = customer.CustomerName;
vm.EmailAddress = customer.EmailAddress;
vm.NumNights = customer.NumNights;
vm.NumPeople = customer.NumPeople;
vm.EmailBody = email.EmailBody;
vm.From = email.From;
vm.Subject = email.Subject;
// Map list of Offers into ViewModel
vm.Offers = Mapper.Map<IList<Offer>, IList<OfferVM>>(offers);
return View(vm);
}
Run Code Online (Sandbox Code Playgroud)
我的帖子是:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(EditViewModel vme)
{
if (ModelState.IsValid)
{
// Update the Customer properties
Customer customer = db.Customers.Find(vme.CustomerId);
customer.NumPeople = vme.NumPeople;
customer.NumNights = vme.NumNights;
customer.ArrivalDate = vme.ArrivalDate;
customer.CustomerName = vme.CustomerName;
customer.EmailAddress = vme.EmailAddress;
// Update Offers table
foreach (var o in vme.Offers)
{
// find the offer
Offer offer = db.Offers.Find(o.OfferId);
if (offer != null)
{
// update the properties of Offer
offer.RoomRate = o.RoomRate;
offer.IncludeInOffer = o.IncludeInOffer;
}
}
db.SaveChanges();
return RedirectToAction("Index");
}
return View(vme);
}
Run Code Online (Sandbox Code Playgroud)
所以我的帖子是手动更新两个数据库表(优惠和客户).
GET方法很优雅,使用AutoMapper,POST不是.我想知道是否有更简单的方法通过AutoMapper更新数据库,而无需手动浏览我想要更新的每个属性?或者我的POST控制器是否尽可能高效?
谢谢你的任何指示,
标记
Map的重载允许将属性映射到一个预先存在的实例:
Mapper.Map<IObjectA, IObjectB>(objectA, ObjectB);
Run Code Online (Sandbox Code Playgroud)
因此,您只需要从参数vme(CreateViewModel vme)映射到customer从DB恢复.这也适用于优惠部分.
当然,您必须以相反的方向配置映射:您已经从db对象到视图模型完成了映射,现在需要将它们从viewmodel映射到db对象.如果您遵循Automapper惯例,它将非常简单甚至是不必要的.
编辑: Henk Mollema添加了有趣的评论
您可以将AutoMapper配置为忽略属性,如果ViewModel不包含域模型中的所有属性(很可能是这种情况),则不会使用空值覆盖它们.
| 归档时间: |
|
| 查看次数: |
1444 次 |
| 最近记录: |