我现在正在适应MVC,因为我来自ASP.Net。
到目前为止,我已经找到了实现我想做的事情的方法,但是有了这个方法,我得到了一个“这不是最简单的方法”的时刻。
场景:我正在将引用应用程序迁移到具有现有数据库的MVC,因此我的模型类是自动生成的。我为每个需要向用户显示数据的控制器操作创建了一个viewmodel类。
编辑引用视图模型如下所示:
public class QuoteEdit_ViewModel
{
public SelectList DelLocations { get; set; }
public int QuoteID { get; set; }
public string QuoteNo { get; set; }
public string EnquiryNo { get; set; }
public string SalesPerson { get; set; }
public string Exceptions { get; set; }
public string CreatedBy { get; set; }
public string ModifiedBy { get; set; }
[Required]
[Display(Name = "Equipment Overview")]
public string EquipmentOverview { get; set; }
public DateTime Created { get; set; }
public DateTime Modified { get; set; }
[Required]
public int? Validity { get; set; }
[Required]
[Display(Name = "Minimum Delivery Weeks")]
public int? DeliveryMin { get; set; }
[Required]
[Display(Name = "Maximum Delivery Weeks")]
public int? DeliveryMax { get; set; }
[Required]
[Display(Name = "Delivery Location")]
public int? DelLocationID { get; set; }
public List<Constants.QPT> PackTypes { get; set; }
public List<Constants.QE> Equipments { get; set; }
public List<Constants.QEEx> Extras { get; set; }
}底部的列表包含设备、线路等,它们是数据库中的连接表。
目前,我可以编辑这个,并将数据发回数据库,并且它工作得很好。
看起来凌乱的部分如下,特别是在if之后的部分:
public ActionResult Save(QuoteEdit_ViewModel VM)
{
Quote a = DAL.DB.Quotes.Where(x => x.QuoteID == VM.QuoteID).Single();
TryUpdateModel(a);
if (ModelState.IsValid)
{
DAL.DB.SaveChanges();
return RedirectToAction("Dashboard", "Home");
}
VM.DelLocations = DAL.GetDeliveryLocationDropdown();
var QData = DAL.GetQuoteEditVM(VM.QuoteID);
VM.QuoteNo = QData.QuoteNo;
VM.EnquiryNo = QData.EnquiryNo;
VM.SalesPerson = QData.SalesPerson;
VM.PackTypes = QData.PackTypes;
VM.Equipments = QData.Equipments;
VM.Extras = QData.Extras;
VM.Created = QData.Created;
VM.CreatedBy = QData.CreatedBy;
VM.Modified = QData.Modified;
VM.ModifiedBy = QData.ModifiedBy;
return View("Edit", VM);
}目前,我需要重新加载整个视图模型,并重新填充视图中没有绑定的所有字段,因为它们的值在POST中丢失。
我在其他文章中读到过,您可以使用hiddenfor,但这也可以用于列表吗?
而且,这是正确的方法来处理这个问题,还是我完全忽略了MVC的观点?
发布于 2016-11-22 14:02:04
不要使用HiddenFor。你走的是正确的道路。我要做的唯一改变就是将您的公共代码分解成另一个方法,GET和POST操作都可以利用这些方法。
private void PopulateQuoteEditViewModel(QuoteEdit_ViewModel model)
{
mode.DelLocations = DAL.GetDeliveryLocationDropdown();
var QData = DAL.GetQuoteEditVM(model.QuoteID);
model.QuoteNo = QData.QuoteNo;
model.EnquiryNo = QData.EnquiryNo;
model.SalesPerson = QData.SalesPerson;
model.PackTypes = QData.PackTypes;
model.Equipments = QData.Equipments;
model.Extras = QData.Extras;
model.Created = QData.Created;
model.CreatedBy = QData.CreatedBy;
model.Modified = QData.Modified;
model.ModifiedBy = QData.ModifiedBy;
}然后:
public ActionResult QuoteEdit()
{
var model = new QuoteEdit_ViewModel();
PopulateQuoteEditViewModel(model);
return View(model);
}
[HttpPost]
public ActionResult QuoteEdit(QuoteEdit_ViewModel model)
{
if (ModelState.IsValid)
{
...
}
PopulateQuoteEditViewModel(model);
return View(model);
}其他评论
TryUpdateModel。它不应该像你在这里那样被使用。正确的方法是映射视图模型中发布的值。您可以手动完成此操作,也可以使用像AutoMapper这样的库。无论哪种方式,您都不想像正在做的那样,根据原始发布的数据,任意覆盖数据库实体上的任何内容。https://stackoverflow.com/questions/40740916
复制相似问题