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 :(得分:0)
我们发现尝试在多个实体上管理这种CRUD操作的情况很难管理,我认为这是不必要的,因为用户可以做很多工作,如果有什么东西崩溃或出错,可能会丢失。
我们分别处理每个CRUD操作,使其更加简单,并在发生时使用SignalR推出这些更改,以便所有客户端的淘汰视图模型都是最新的并且是同步的。
希望这有帮助。