ViewModels と AutoMapper を使用しようとしていますが、これらは多くの問題を回避するためのベスト プラクティスであることがわかっています。
AutoMapper を使用してビューモデルにデータを入力しても問題ありませんが、コントローラーにポストされたビューモデルからデータベースを更新する方法についてはよくわかりません。
私の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);
}
私の投稿は:
[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);
}
したがって、私の投稿は 2 つのデータベース テーブル (Offers と Customers) を手動で更新しています。
AutoMapper を使用する GET メソッドは洗練されていますが、POST はそうではありません。更新しようとしている各プロパティを手動で確認する必要なく、AutoMapper を介してデータベースを更新するより簡単な方法があるかどうか疑問に思っています。または、私の POST コントローラーは可能な限り効率的ですか?
ご指摘ありがとうございます。
マーク