ASP.NET MVC 2 - 使用UpdateModel和LINQ to Entities(.NET 3.5)時,“無法更新類型'XYZ'的模型”

asp.net-mvc-2 c# entity-framework

我使用LINQ to Entities設置了一個模型,並且代碼可以按預期添加到數據庫中。但是,當我使用.NET 3.5時,我無法使UpdateModel工作。

[HttpPost]
public ActionResult Edit(Site.Models.XYZ xyz)
{
    try
    {
        var original = db.XYZ.First(u => u.id == xyz.id);
        UpdateModel(original);
        db.SaveChanges();

        return RedirectToAction("Index");
    }
    catch (Exception ex)
    {
        return View("Error");
    }
}

這導致以下異常:

System.InvalidOperationException was caught
  Message=The model of type 'Site.Models.XYZ' could not be updated.
  Source=System.Web.Mvc
  StackTrace:
       at System.Web.Mvc.Controller.UpdateModel[TModel](TModel model, String prefix, String[] includeProperties, String[] excludeProperties, IValueProvider valueProvider)
       at System.Web.Mvc.Controller.UpdateModel[TModel](TModel model, String prefix)
       at Site.Controllers.XYZController.Edit(Site.Models.XYZ xyz) in D:***.cs:line 81
  InnerException: 

如果我執行UpdateModel(xyz) ,則不會發生異常,但數據也不會保存。

如何讓UpdateModel使用它(不更新到.NET 4.0),為什麼不能更新(由於沒有內部異常,異常沒有幫助)?

一般承認的答案

管理解決問題。可以通過以下兩種方式之一完成:

TryUpdateModel(original)

要么

db.ApplyPropertyChanges(original.EntityKey.EntitySetName, xyz)

不知道為什麼TryUpdateModel會起作用但UpdateModel不會。也許只是.NET 3.5中的一個錯誤。


熱門答案

我在MVC項目中所做的是從Codeplex獲取DefaultModelBinder的源代碼並將其粘貼到項目中的新類中,如MyDefaultModelBinder。然後在global.asax中註冊該模型綁定器:

ModelBinders.Binders.DefaultBinder = new MyDefaultModelBinder();

這允許您在BindModel方法中設置斷點,並且可以找出它無法綁定的原因。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因