当我编辑模型时,除了可以在过程中丢失其值的可空属性外,所有属性都被正确保存。
我试图在我的视图中隐藏属性:
@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(模型)方法。在保存更改之前,我甚至尝试将属性值从ViewModel手动重新分配给模型。
当我在整个方法中放置断点时,我可以看到属性仍然保持其值,但是一旦我点击Save它就变为null。
请注意,如果我取消注释EntityState.Modified行,我不再丢失属性值,但我在DbContext中处理这些内容(我为不同的属性设置了不同类型的编辑事件,并且在我的代码中没有注释掉这行代码即使没有任何改变,控制器似乎也会对我的所有编辑事件进行调整。)
请注意,此属性也是外键(不确定它是否真的重要)
答案 0 :(得分:0)
TryUpdateModel
实际上对传入其中的项目没有任何作用。它只是对它进行模型验证。无论那里有什么价值,都留在那里。
我认为我知道问题所在,而且它与AutoMapper有关。您发布的模型很可能不包括实际的相关用户对象,只是您为其发布的ID。将模型映射到实体时,AutoMapper会将相关用户对象的值替换为null
,因为模型没有它。尝试将以下内容添加到CreateMap
:
.ForMember(dest => dest.User, opts => opts.Ignore());
答案 1 :(得分:0)
我所说的是你的所有代码都是正确的,除了这一行:
Mapper.Map<ItemViewModel, Item>(viewModel, item);
该行应为
item = Mapper.Map<ItemViewModel, Item>(viewModel, item);
然后在某些时候你需要将它传递给存储库:
db.Update(item);
db.SaveChanges();