ASP.NET MVC5 - Nullable模型属性在编辑模型时总是丢失其值(null)

时间:2014-04-08 18:14:08

标签: c# asp.net-mvc entity-framework viewmodel

当我编辑模型时,除了可以在过程中丢失其值的可空属性外,所有属性都被正确保存。

我试图在我的视图中隐藏属性:

@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中处理这些内容(我为不同的属性设置了不同类型的编辑事件,并且在我的代码中没有注释掉这行代码即使没有任何改变,控制器似乎也会对我的所有编辑事件进行调整。)

请注意,此属性也是外键(不确定它是否真的重要)

2 个答案:

答案 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();