2014-10-17 17 views
0

MVC Knockout.js應用最佳實踐進行同步增加已刪除項目

我有一個書面大多采用ASP.NET/MVC和KnockoutJs的應用程序。現在,在很多情況下,我的視圖模型上有一些集合需要同步到sql數據庫(即添加的集合項需要添加並且需要在數據庫中刪除已刪除的集合項)。我想知道我應該在客戶端,視圖模型和服務器代碼中使用什麼最佳實踐。我已經遇到了這個需求幾次,並希望隔離一個最好的方式來處理它。

單程

我可以啓動項目創建客戶端和服務器視圖模型的列表屬性,添加項目,刪除的項目。我的邏輯在服務器更新上相當簡單;開始的項目將被忽略;添加的項目將被插入;刪除的項目將被刪除。服務器代碼可以簡單地通過添加和刪除的收集項目進行循環,但客戶端將更加複雜,處理列表以及具有更詳細的視圖模型。

換種方式

我可以在我的模型創建一個單獨的列表,然後在更新,我可以比較創造增值,並根據差異去除列表中的原始值。這會使服務器更新邏輯稍微複雜一些,並且服務器/客戶端視圖模型和客戶端腳本不那麼複雜。這個問題是很危險的,如果沒有任何項目被髮布到服務器,所有東西都將被清除。

第三條道路

也許我會需要有髒的物品與列表中添加或刪除標記並提交時,請在服務器上執行相應的操作。然後,問題就變成了我的列表應該成爲服務器上的視圖模型的一部分,還是作爲更新方法的輔助參數集合。

public ActionResult Update(ViewModel viewModel, 
     List<ListTypeViewModel> dirtyItems) { ... } 

我認爲這可能會奏效。雖然,我在識別項目是否先前已從新的和已移除的項目保存到數據庫的模式方面存在一些問題。 I added a fiddle to support this on the client. I should be using this pattern.

另一個答案也許?

如果我失去了一些東西很明顯,將解決這個問題,請讓我知道。在這種情況下,ajax請求立即更新服務器上的列表是沒有意義的,因爲用戶希望通過單擊取消按鈕來回滾對集合的更改。

+0

我只需要刪除,編輯或添加項目的服務器端代碼總是返回項目的最終列表,然後您可以使用它來更新您的前端。這樣,您的前端不必知道您的項目集合後端發生了什麼,並且每次從服務器收到任何響應時都會從頭開始重新構建所有項目。 – 2014-10-17 09:25:09

+0

我可能是錯的,但我不確定這是否解決了挑戰。我不必關心客戶端服務器的功能。雖然,它當然需要照顧客戶。 – jwize 2014-10-17 09:30:44

+1

我可能誤解了你的問題,然後......基本上,從我所知道的爲了同步列表,最好從頭開始創建東西,而不是比較東西。例如,如果用戶刪除了2個項目,請編輯2,最後再添加2個到同一個集合,然後僅將更改提交給服務器,如果可能只刪除整個集合服務器端並重建它,我發現它更方便客戶發送的清單。這當然不總是可能的,在這種情況下,您可能需要在每次列表更新客戶端時採取操作服務器端... – 2014-10-17 09:38:47

回答

0

我們發現試圖管理多個實體這種情況CRUD操作的疼痛管理和我認爲這是不必要的,因爲用戶可以做很多工作,如果事情崩潰或出現錯誤,可能潛在的迷失。

我們分別處理每個CRUD操作,使其更簡單,並使用SignalR推出這些更改,以便所有客戶端的淘汰視圖模型都保持最新並同步。

希望這會有所幫助。