我一直在處理這個問題。事實證明,the code for TryUpdateModel
沒有任何問題,但它完全取決於ValueProvider
給出的內容。
至於AJAX(我的情況也一樣),它是真正可能的是JsonValueProviderFactory
是一個解析響應並執行該TryUpdateModel
方法,誰永遠不會發現這些價值觀哪裏有控制器給出的值。由於TryUpdateModel
僅基於值提供程序提供的屬性更新目標模型,因此它不會觸摸清空的集合,因爲提供者根本不會發送這些屬性。
發生這種情況的代碼是this line in JsonValueProviderFactory
,其中零大小的數組永遠不會獲得添加到後備存儲的值,從而使屬性「dissapear」。
我在2012年1月的ASP.NET Codeplex站點(Json Request with empty array)中發現了此錯誤的報告,wallymathieu(提交者)提供了一個修補程序來處理此問題。這是該補丁的相關部分:
//BEGIN CHANGE
if (l.Count == 0) {
AddToBackingStore(backingStore, prefix, null);
}
else for (int i = 0; i < l.Count; i++) {
//END CHANGE
他正在做的是在數組發送爲空時添加具有空值的屬性。
可以與同時暴露在那裏,並通過在Global.asax
文件中這樣把它掛到你的應用程序的代碼,Application_Start
方法使自己ValueProviderFactory
:
ValueProviderFactories.Factories.Remove(ValueProviderFactories.Factories.OfType<JsonValueProviderFactory>().FirstOrDefault());
ValueProviderFactories.Factories.Add(new YourOwnJsonValueProviderFactory());
這沒有解決我的問題,我希望它爲你的未來和未來做了它TryUpdateModel'ers。
如果通過ajax刪除收集項目,爲什麼TryUpdateModel會執行任何操作(關於收集)?還有什麼要清除的? – 2012-04-06 14:19:08
是的,我使用部分視圖通過AJAX添加/刪除項目,該部分視圖將呈現刪除項目或添加新項目的列表。但是我現在不保存更改,只是在刪除/添加項目的情況下更新視圖。然後,我點擊我的保存按鈕,它會回傳所有內容,然後將整個對象圖保存在我的數據庫中。 – Vincent 2012-04-06 14:24:54