2010-09-21 22 views
8

我有一個使用LINQ to Entities設置的模型,到預期的數據庫。但是,當我使用.NET 3.5時,無法使UpdateModel工作。ASP.NET MVC 2 - 「使用UpdateModel和LINQ to Entities時,無法更新類型'XYZ'的模型(.NET 3.5)

[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),爲什麼無法更新(由於沒有內部異常,異常沒有幫助)?

回答

13

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

TryUpdateModel(original) 

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

不知道爲什麼TryUpdateModel工作,但UpdateModel不會。也許只是.NET 3.5中的一個bug。

+3

我剛剛遇到同樣的問題,並且使用TryUpdate可以確定哪些屬性尚未設置,以幫助識別問題。 – 2010-12-18 14:45:57

+1

模型聯編程序無法更新模型上的屬性時引發異常。如果您希望出現異常,就像數據不正確一樣,那麼請使用TryUpdateModel,因爲這不會引發異常。 – Chev 2011-06-21 07:19:24

2

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

ModelBinders.Binders.DefaultBinder = new MyDefaultModelBinder(); 

這可以讓你在BindModel方法中設置斷點,你能弄清楚它爲什麼不能結合。

+0

這不起作用,c時出現一些錯誤ompiling。 「'System.Web.Mvc.DictionaryHelpers'由於其保護級別而無法訪問」和「'System.Web.Mvc.IValueProvider'不包含'TryGetValue'的定義,也沒有接受第一個參數的擴展方法'TryGetValue'鍵入'System.Web.Mvc.IValueProvider'可以找到「 – SamWM 2010-09-24 13:45:57

+0

是的,現在你提到它,我想我必須包括一些其他類,如TypeHelpers和TypeDescriptorHelper。不過,您需要的所有東西都應該放在codeplex項目中。 – 2010-09-24 14:14:22

0

TryUpdateModel()使用代替UpdateModel()功能來解決這個

兩個UpdateModel()TryUpdateModel()功能被用來更新與表單值模型,並執行驗證。如果驗證失敗,那裏的TryUpdateModel()絕不會拋出異常,它返回

差異UpdateModel()

UpdateModel()之間 & TryUpdateModel()

拋出一個異常真或假

相關問題