【发布时间】:2014-05-21 14:55:02
【问题描述】:
当我编辑我的模型时,所有属性都会正确保存,但可以为空的属性在此过程中总是会丢失其值。
我试图在我的视图中隐藏该属性:
@Html.HiddenFor(model => model.UserId)
在我的控制器的编辑方法中,我尝试:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(ItemViewModel viewModel)
{
if (ModelState.IsValid)
{
var item= db.Items.Find(viewModel.ItemId);
Mapper.Map<ItemViewModel, Item>(viewModel, item);
//db.Entry(item).State = EntityState.Modified;
if (TryUpdateModel(item))
{
db.SaveChanges();
return RedirectToAction("Index");
}
}
ViewBag.UserId = new SelectList(db.Users, "UserId", "Username", viewModel.UserId);
return View(viewModel);
}
我也尝试不使用 TryUpdateModel 和使用 UpdateModel(model) 方法。我什至尝试在保存更改之前手动将 ViewModel 中的属性值重新分配给 Model。
当我在整个方法中放置断点时,我可以看到该属性仍然保持其值,但一旦我点击 Save,它就会变为 null。
请注意,如果我取消注释 EntityState.Modified 行,我将不再丢失属性值,但我正在我的 DbContext 中处理这些内容(我对不同的属性有不同类型的编辑事件,并且这行代码在我的即使没有任何改变,控制器似乎也会触发我所有的编辑事件)。
请注意,这个属性也是一个外键(不确定它是否真的很重要)
【问题讨论】:
-
我看不到您将要保存到数据库的对象传递到何处。从我可以看到您在数据库不知道的对象上调用 SaveChanges()。
-
TryUpdateModel 正在传递模型(我原来的帖子必须是错误的模型名称,我现在修复了它)。所有编辑的属性都已正确保存,因此可以正常工作。即使没有 TryUpdatModel 并且只需调用 db.SaveChanges() 方法,它也可以工作。不过,我的可空属性仍然失去了它的价值。
-
你为什么注释掉
db.Entry(item).State = EntityState.Modified? -
@ChrisPratt 我有不同的模型来处理不同类型的编辑(用于记录目的),并且即使仅假设更新了 Location 属性,这行代码也会触发所有编辑事件。不过,这确实似乎使我失去了可以为空的财产。我试图了解所有这些都是相关的,但到目前为止还没有这样做。
-
我看到您已将模型映射到项目,但您尚未重新分配值。将重新评估添加到映射器调用中,我相信它会解决您的问题
标签: c# asp.net-mvc entity-framework viewmodel