2009-07-07 92 views
11

這一直使我瘋了。MVC模型沒有成功更新,但無法找到原因

我不斷收到以下異常

System.InvalidOperationException:類型Models.Expense「的模式沒有成功更新。 在System.Web.Mvc.Controller.UpdateModel [TModel的](TModel的模型,字符串前綴,字符串[] includeProperties,字符串[] excludeProperties,IDictionary`2 valueProvider) 在System.Web.Mvc.Controller.UpdateModel [TModel的] (TModel的模型) atMVC.Controllers.BaseExpenseController.Edit(字符型,收集的FormCollection)在C:\項目\ Expenses.MVC \ \控制器BaseExpenseController.cs:線109

但我不能追查爲什麼沒有更新,沒有例外說明它爲什麼沒有更新。

任何指針?

+0

你能後的代碼不應該有一個條目,這是很難追查離不開它。 – Lazarus 2009-07-07 14:54:44

回答

15

捕獲異常或調用TryUpdateModel代替。如果TryUpdateModel無法更新模型,它不會引發異常,它只會返回false。您可以按照Craig的建議在ModelState中找到錯誤的詳細信息。 事實上,UpdateModel只是調用TryUpdateModel,如果它返回false則拋出。

+2

你是個神奇的人。謝謝。 – SquidScareMe 2011-04-27 18:59:10

12

檢查controller.ModelState並查找條目與錯誤> 0

2

很難說沒有看到任何代碼,但每次看到這種類型的例外時,99%的時間與數據庫相關。不是說根本原因不在代碼中,但很可能你錯過了一些東西並試圖將無效數據傳遞給數據庫。其他需要尋找的問題是任何需要進行的關係處理。

0

我一般檢查3件事。

  1. 做每個模型成員 有getter和setter
  2. 我是否履行的 模型的要求。即:是否要求所有 數據存在且正確?
  3. 我是否違反了某個關係?我需要在嵌套對象上使用默認值嗎?

如果仍然失敗,然後我恢復;

class MyClass(FormCollection collection) 
{ 
    string a = collection["MyField"]; 

它通常起作用。

0

在生成的網絡表單上,檢查是否有隱藏字段,可能是某種無法更新的ID。

1

我有同樣的問題,問題是因爲我在模型中使用IValidatableObject接口與我更新的一個有關係。真正的問題是在數據庫中,因爲驗證收益率,我已經複製了獨特的列條目:)

事情是。您應該使用UpdateModel或TryUpdateModel,這兩個方法都會更新ModelState.IsValid。現在,有時可能很難找到造成錯誤的原因。查看ModelState的調試器。ErrorKeys並檢查是否有:)

乾杯

相關問題