C# 过帐时保留未绑定的viewmodel数据
我来自ASP.Net,目前正在逐渐习惯MVC 到目前为止,我已经找到了实现我想做的事情的方法,但是有了这个方法,我得到了一个“这不是最简单的方法”的时刻 场景: 我正在将一个报价应用程序迁移到具有现有数据库的MVC,以便自动生成模型类。我为需要向用户显示数据的每个控制器操作创建了一个viewmodel类 “编辑报价”视图模型如下所示:C# 过帐时保留未绑定的viewmodel数据,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我来自ASP.Net,目前正在逐渐习惯MVC 到目前为止,我已经找到了实现我想做的事情的方法,但是有了这个方法,我得到了一个“这不是最简单的方法”的时刻 场景: 我正在将一个报价应用程序迁移到具有现有数据库的MVC,以便自动生成模型类。我为需要向用户显示数据的每个控制器操作创建了一个viewmodel类 “编辑报价”视图模型如下所示: public class QuoteEdit_ViewModel { public SelectList DelLocations { get; set;
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; }
}
目前,我需要重新加载整个viewmodel,并重新填充视图中未绑定的任何字段,因为它们的值在发布过程中丢失
我在其他帖子中读到,你可以使用hiddenfor,但这也可以用于列表吗
这是正确的方法还是我完全忽略了MVC的要点?不要使用
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;
}
然后:
其他评论
TryUpdateModel
。这不是你在这里的习惯。正确的方法是映射视图模型中的已发布值。您可以手动执行此操作,也可以使用AutoMapper之类的库。不管是哪种方式,您都不希望在执行过程中基于原始发布数据随意覆盖数据库实体上的任何内容不要使用
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;
}
然后:
其他评论
TryUpdateModel
。这不是你在这里的习惯。正确的方法是映射视图模型中的已发布值。您可以手动执行此操作,也可以使用AutoMapper之类的库。不管是哪种方式,您都不希望在执行过程中基于原始发布数据随意覆盖数据库实体上的任何内容谢谢你的反馈。我将研究代码的分解,并阅读AutoMapper和route参数。感谢您的反馈。我将研究代码的分解,并阅读AutoMapper和route参数。
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);
}