2012-04-06 26 views
0

我正在使用asp.net mvc 3,並在發佈更改時使用tryUpdateModel時遇到問題。當屏幕上的所有項目被刪除時,TryUpdateModel不會清空項目的集合

我有一個模型,其中包含多個項目列表,我的視圖可以通過Ajax添加或刪除項目,我可以使用保存按鈕保存更改。

當我將項目添加到集合時,TryUpdateModel工作得很好,但是當我刪除集合中的所有項目時,此集合不會再發布到表單值中,而TryUpdateModel也不會完成任何操作而不會清除我的集合。

我該如何處理這種情況?有人找到了解決辦法嗎?我必須重寫DefaultModelBinder嗎?

感謝

+0

如果通過ajax刪除收集項目,爲什麼TryUpdateModel會執行任何操作(關於收集)?還有什麼要清除的? – 2012-04-06 14:19:08

+0

是的,我使用部分視圖通過AJAX添加/刪除項目,該部分視圖將呈現刪除項目或添加新項目的列表。但是我現在不保存更改,只是在刪除/添加項目的情況下更新視圖。然後,我點擊我的保存按鈕,它會回傳所有內容,然後將整個對象圖保存在我的數據庫中。 – Vincent 2012-04-06 14:24:54

回答

1

好吧,我不知道爲什麼它不會清除集合,而是一個解決方法可能是隻檢測時,相關表格值缺失,並手動刪除的項目。例如:

public ActionResult Edit(SomeEntity obj) 
{ 
    if(Request.Form["expectedFormValue"] == null) 
    { 
     obj.YourCollection.Clear(); 
    } 
    TryUpdateModel(obj); 
} 
+0

就我而言,我在對象圖中有很多列表,如果我可以避免必須測試每個集合是否爲空,它將會很棒。 如果我沒有其他的解決方案,我會去找你的竅門。 謝謝 – Vincent 2012-04-10 07:30:08

0

我一直在處理這個問題。事實證明,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

相關問題