asp.net MVC与MVVM通过淘汰,将模型传递给javascript

asp.net MVC与MVVM通过淘汰,将模型传递给javascript,javascript,asp.net-mvc,json,knockout.js,Javascript,Asp.net Mvc,Json,Knockout.js,我正在编写一个MVC应用程序,我决定Knockout.js将有助于解决我的许多问题,但在这个过程中,它产生了一个新问题,我正在解决这个问题 我将所有MVC端点转换为仅返回视图,然后创建了几个其他端点来返回JSON对象。当用户浏览网站时,网站将加载基本的UI框架。之后,Knockout.js通过AJAX调用加载模型。这导致每个页面都被加载,然后再次“加载”,就像使用MVC一样,页面被加载,所有数据都存在 我一直在寻找让两者同时加载的方法,但我没有发现任何不需要我完全重构站点的方法。最佳选择是:

我正在编写一个MVC应用程序,我决定Knockout.js将有助于解决我的许多问题,但在这个过程中,它产生了一个新问题,我正在解决这个问题

我将所有MVC端点转换为仅返回视图,然后创建了几个其他端点来返回JSON对象。当用户浏览网站时,网站将加载基本的UI框架。之后,Knockout.js通过AJAX调用加载模型。这导致每个页面都被加载,然后再次“加载”,就像使用MVC一样,页面被加载,所有数据都存在

我一直在寻找让两者同时加载的方法,但我没有发现任何不需要我完全重构站点的方法。最佳选择是:

  • 将JSON端点合并到视图端点中,并使用
    @Html.Raw(JSON.Encode(object))
但是,我必须使用所有纯JSON端点


我还可以做些什么来将JSON端点数据传递到服务器端的视图吗?或者以任何方式同时加载模型和视图?

您的体系结构是正确的,但您希望初始加载使用模型中的数据预填充视图。在仅返回视图的控制器操作中,应将要填充的数据放入ViewData中。然后,视图最初加载模型值,每个UI元素都可以有一个AJAX更新,该更新调用该特定字段的控制器操作


这也将是一个挑战。这可能会有所帮助。

我也同意,让初始视图生成将初始数据直接渲染到视图中是一个好主意。一般来说,这确实比单独的AJAX调用+JavaScript填充数据产生更好的性能


但我也认为这实际上取决于你正在加载的页面类型。如果你的应用程序主要是基于AJAX的(SPA风格的模型),那么第一次加载可能并不那么重要,因为它只发生一次,而且可能需要一些额外的时间。通过AJAX或传统的视图操作以一种方式加载所有数据会更容易、更一致。当客户端代码要求您重新加载列表或记录的整个数据集时,您不会复制模板/视图逻辑来生成该输出

谢谢你的回答!为了确保我在同一个页面上,我应该调用视图中的JSON端点?类似于:var model=@Html.Action(“数据”、“项目”),其中模型位于js中?只调用JSON端点进行更新。如果创建一个ViewModel对象并在Javascript中与之交互,则应该只让视图与该对象交互,并让方法封装AJAX请求(以控制器端点为例)。这将使您能够执行智能操作,如定期缓存或更新。好的,那么我的视图端点应该返回一个转换为JavaScript的模型,我应该有一个json端点,返回该模型的更新版本?在这种情况下,我该如何消除代码重复?您可以将更新封装在方法调用中(可能在服务层中),然后在初始操作和ajax更新选项中调用该方法。DRY是一件好事,但在多个位置调用方法也没关系。:)