ViewModel 保存数据
Posted
技术标签:
【中文标题】ViewModel 保存数据【英文标题】:ViewModel Saving Data 【发布时间】:2012-04-23 00:09:14 【问题描述】:我有一个包含文本框和下拉框的 ViewModel,我想将数据保存到 MVC3 中的数据库中。
我通常会这样做:
if (ModelState.IsValid)
db.Orders.Add(orders);
db.SaveChanges();
return RedirectToAction("Index");
如何保存 ViewModel?
提前致谢
编辑 好的,我得到了这个 ViewModel:
namespace DropDownList.Models
public class CreditCardModel
public List<SelectListItem> CardTypeOptions get; set;
[Display(Name = "Card Type")]
public string CardTypeID get; set;
[Display(Name = "Card Number")]
[Required(ErrorMessage = "Please provide your card number")]
public string CardNumber get; set;
and this controller:
namespace DropDownList.Controllers
public class CreditCardModelController : Controller
//
// GET: /CreditCardModel/
public ActionResult Index()
var model = new CreditCardModel();
// Populate the dropdown options
model.CardTypeOptions = GetCardTypes("MS"); // Set the default to American Express
return View(model);
[HttpPost]
public ActionResult Index(CreditCardModel model)
if (ModelState.IsValid)
return RedirectToAction("addcardcomplete");
// TODO - Handle the form submit
// Populate the dropdown options
model.CardTypeOptions = GetCardTypes("MS"); // Set the default to American Express
return View(model);
// TODO - AddCardComplete goes here
// TODO - GetCardTypes goes here
private List<SelectListItem> GetCardTypes(string defaultValue)
List<SelectListItem> items = new List<SelectListItem>();
items.Add(new SelectListItem Text = "American Express", Value = "AE", Selected = (defaultValue == "AE") );
items.Add(new SelectListItem Text = "Mastercard", Value = "MS", Selected = (defaultValue == "MS") );
items.Add(new SelectListItem Text = "Visa", Value = "VS", Selected = (defaultValue == "VS") );
return items;
public ActionResult AddCardComplete()
return View();
我将如何保存这些数据?一旦 iv 学会了这一点,我就可以将它应用到实际场景中
谢谢
【问题讨论】:
澄清一下,你是说通常你会直接接受你的数据库对象类型的模型,而这次你不是? @AFinkelston 我正在按照本教程进行操作codeoverload.wordpress.com/2011/05/22/dropdown-lists-in-mvc-3,但我不知道如何使用我以前从未使用过的 ViewModel 保存选定的值,因为我是 MVC3 的新手。跨度> 【参考方案1】:创建实体模型的实例并设置您从 ViewModel 读取的值,该值已发布到操作方法,并将其用于保存到数据库。像这样的东西。
[HttpPost]
public ActionResult SaveOrder(OrderViewModel orderVM)
if(ModelState.IsValid)
YourDomainEntity objDomainModel=new YourDomainEntity();
objDomainModel.ItemId=orderVm.ItemId;
objDomainModel.Quantity=orderVM.Quantity;
//Set Other relevant properties also
db.Orders.Add(orders);
db.SaveChanges();
return RedirectToAction("Index");
您可以考虑使用像 AutoMapper 这样的库来将您的域对象映射到您的 ViewModel。
【讨论】:
【参考方案2】:我假设你的意思是编辑?您可以将其重新附加为已修改并重新保存..
db.Orders.Attach(orders, true);
db.ObjectStateManager.ChangeObjectState(orders, EntityState.Modified);
db.SaveChanges();
虽然我会强烈建议您拆分数据库对象和视图模型。您也可以使用AutoMapper 来简化来回操作,但将数据库和前端分开。
【讨论】:
以上是关于ViewModel 保存数据的主要内容,如果未能解决你的问题,请参考以下文章
使用 ViewModel 在数据库中保存 MVC 下拉列表项
Android jetpack viewModel 屏幕旋转数据如何保存。
Android JetPack组件之ViewModel状态的保存(程序在后台被系统杀死数据也存活)