Asp.net mvc 3 何时使用MVVM(即Knockout.js)或仅从控制器操作返回EditorTemplate对象

Asp.net mvc 3 何时使用MVVM(即Knockout.js)或仅从控制器操作返回EditorTemplate对象,asp.net-mvc-3,mvvm,knockout.js,mvc-editor-templates,Asp.net Mvc 3,Mvvm,Knockout.js,Mvc Editor Templates,如果需要通过ajax将新项目添加到列表中,那么使用Knockout之类的工具的最大好处是什么 到目前为止,我一直在做的是,在我看来,使用editortemplate(带有关联的viewmodels)来呈现项目列表。然后,为了添加新项,我向加载服务器端viewmodel的操作发出请求,并返回一个EditorTemplate对象,该对象刚刚附加到列表中。像这样: return Json(new { this.RenderPartialViewToString("MyEditorTemplate",

如果需要通过ajax将新项目添加到列表中,那么使用Knockout之类的工具的最大好处是什么

到目前为止,我一直在做的是,在我看来,使用editortemplate(带有关联的viewmodels)来呈现项目列表。然后,为了添加新项,我向加载服务器端viewmodel的操作发出请求,并返回一个EditorTemplate对象,该对象刚刚附加到列表中。像这样:

return Json(new { this.RenderPartialViewToString("MyEditorTemplate", model) });
这种淘汰方式需要实现另一个视图模型来显示项目,然后实现另一个模板来显示项目。但这样做需要重复代码,因为视图模型必须在两个位置表示:在cserver端代码中,然后是淘汰视图模型的视图。这不是一个坏习惯吗


我是否遗漏了什么,或者理解了淘汰赛和MVVM的目的

您将从Knockout中看到的最大好处是,您无需点击服务器即可将新项目添加到列表中—一切都发生在客户端。这有多种好处,包括:

  • 您可以减少服务器上的负载
  • 您可以改善最终用户的体验
  • 您可以使页面上的多个元素与您的模型保持最新,而无需任何服务器交互
在这些淘汰教程中可以找到两个很好的例子:

至于复制代码,如果你看一下这两个教程,你会发现你不需要复制代码。例如:

  • 创建一个视图以显示整个列表
  • 若要向列表中添加新项目,请创建一个局部视图,在向页面添加新项目时加载该局部视图-该局部视图将绑定到敲除
  • 当您提交整个表单时,该列表中的所有内容都将被提交,包括您通过淘汰添加的项目
  • 您的ViewModel将特定于列表项(您不必为所有内容创建整个ViewModel)。并且您的视图特定于单个列表项


    希望这是清楚的。Knockout非常简单,他们提供了一些很好的文档和教程来帮助您前进。

    IMHO,下面是Knockout和asp mvc混合体系结构的最干净的选择

    让你的ASP.net充当一个Web服务,并控制你所有的视图模板和逻辑


    否则,可能会复制viewmodels,并且在需要更改模型时必须重构前端和后端代码。

    谢谢。这些例子很有帮助。我想在从服务器端到客户端(比如示例使用$.map函数时)进行映射是没有办法的。我理解这两者是如何结合在一起的,但担心服务器端定义更改时会发生什么情况是否合理?它会破坏使用它的任何视图上的所有映射。我不确定我是否理解您所说的“服务器端定义更改”是什么意思。典型的方法是:将数据发送到视图(从服务器),使用敲除映射到对象(手动或使用敲除映射器),用户进行任何更新(全部完成客户端),将数据发送回您的服务器,这样您就可以保留更改,显示下一个视图| |您还想做些什么吗?我所说的“服务器端定义更改”的意思是说,我的服务器视图模型得到了一个添加到它的属性,然后我还必须更新从该视图模型中删除映射的任何屏幕。@getit-Ah,对这可能是真的,取决于你如何使用KO。然而,关于KO的一点是,您不一定需要使KO的VM与服务器上的VM保持100%的同步。例如,您可能只使用KO来影响单个动态列表。仅仅因为你将其他项目添加到你的主虚拟机并不意味着你甚至需要触摸KO。这在很大程度上取决于您如何设计解决方案。这不一定是一对一。