簡體   English   中英

ASP.NET MVC5-可空模型屬性在編輯模型時始終丟失其值(空)

[英]ASP.NET MVC5 - Nullable model property always losing its value (null) when editing model

當我編輯模型時,所有屬性均正確保存,但可為空的屬性在過程中始終會丟失其值。

我試圖這樣隱藏屬性:

@Html.HiddenFor(model => model.UserId)

在控制器的Edit方法中,我嘗試執行以下操作:

[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。

當我在整個方法中放置斷點時,我可以看到該屬性仍然保留其值,但是當我點擊“保存”后,該屬性就會為空。

請注意,如果我取消對EntityState.Modified行的注釋,我將不再失去屬性值,而是在DbContext中處理這些內容(我對不同的屬性具有不同類型的編輯事件,並且在控制器中取消注釋了這行代碼,觸發我所有的編輯事件,即使沒有任何更改也是如此。

請注意,此屬性也是外鍵(不確定此處是否確實重要)

TryUpdateModel實際上對傳遞給它的項目不做任何事情。 它僅對其運行模型驗證。 無論那里有什么價值,都留在那里。

我知道問題出在哪里,這和AutoMapper有關。 您發布的模型很可能不包含實際的相關用戶對象,而僅包含您為此發布的ID。 當您將模型映射到實體上時,AutoMapper會將相關用戶對象的值替換為null ,因為模型沒有此值。 嘗試將以下內容添加到您的CreateMap

.ForMember(dest => dest.User, opts => opts.Ignore());

我的意思是,除了以下這一行以外,您所有的代碼都是正確的:

 Mapper.Map<ItemViewModel, Item>(viewModel, item);

那條線應該是

 item = Mapper.Map<ItemViewModel, Item>(viewModel, item);

然后,您需要將其傳遞給存儲庫:

 db.Update(item);
 db.SaveChanges();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM