ASP.NET MVC通过Knockout实现MVVM,如何将模型传递到JavaScript?

4
我正在编写一个MVC应用程序,并决定使用Knockout.js来解决我的很多问题,但在此过程中,它却引发了一个新的问题,我无法解决。
我将所有的MVC端点转换为只返回视图,然后创建了几个其他端点来返回JSON对象。当用户浏览网站时,网站加载基本的UI框架。之后,Knockout.js通过AJAX调用加载模型。这导致每个页面都会加载,然后再次“加载”,而仅使用MVC时,页面加载并且所有数据都已经存在。
我一直在寻找同时加载两者的方法,但没有找到任何不需要我完全重构网站的方法。最好的选择是:
- 将JSON端点合并到视图端点中,并在代码后台中使用@Html.Raw(Json.Encode(object))将模型转换为JSON
但这样就必须放弃所有纯JSON端点。
有没有其他方法可以在服务器端将JSON端点数据传递给视图?或者有没有办法让模型和视图同时加载?
2个回答

3
你的架构是正确的,但你希望初始加载时使用模型中的数据预填充视图。在仅返回视图的控制器操作中,应将要填充的数据放入ViewData中。然后,视图最初将使用模型值进行加载,并且每个UI元素都可以具有一个AJAX更新,该更新调用特定字段的控制器操作。
这也是ViewModel的理想情况。这也可能有所帮助

谢谢您的回答!只是为了确保我和您在同一页面上,我应该在视图中调用JSON端点吗?像这样:var model = @Html.Action("Data","Items"),其中model在js中? - joe_coolish
只调用JSON端点进行更新。如果您创建了一个ViewModel对象并在Javascript中与其交互,那么您应该只让视图与该对象交互,并具有封装AJAX请求的方法(与Controller端点一起)。这将使您能够执行智能操作,如缓存或定期更新。 - Visionary Software Solutions
好的,所以我的视图端点应该返回一个被转换成JavaScript的模型,我应该有JSON端点来返回该模型的更新版本?在这种情况下,我该怎么消除代码重复呢? - joe_coolish
你可以将更新封装在一个方法调用中(可能是在服务层中),然后在初始操作和ajax更新选项中调用该方法。DRY原则很好,但在多个地方调用一个方法也是可以的。 :) - Visionary Software Solutions

1

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接