2

我计划在客户端为单页应用程序使用 knockout.js 和 MVVM 模式。所以模型,视图模型将在客户端定义。我对我们必须如何在服务器端进行结构感到困惑。

  1. 现在,控制器会返回域模型本身吗?从域模型到 ViewModel 的所有映射是否只发生在客户端?

  2. 在我的解决方案中,域模型和视图模型之间存在很大差距。所以上述方法会导致大量数据不必要地返回到客户端。虽然看起来有点矫枉过正,但我​​正在考虑在服务器端重复 ViewModel 和 InputViewModel 定义(前者代表呈现的数据,后者代表要回发到控制器操作的数据),并且还有一个映射层(基于 automapper)来映射域模型到服务器端的 ViewModels。这有意义吗?还是有更好的方法?

4

3 回答 3

2

我建议您计算出您的视图模型实际需要哪些数据,然后让控制器构建一个包含该数据的服务器端视图模型,并将其以 JSON 格式发送到客户端。

这样您就不会将不必要的数据发送到客户端(或返回),您仍然可以在服务器上完成大部分繁重的工作,并且淘汰视图模型可以完成它们的用途:呈现要使用的数据由视图。

于 2012-05-03T15:56:15.370 回答
1

您在第 2 点中描述的实际上是我使用最多的解决方案,这对我来说很有意义:我在服务器端使用 Automapper 在特定于 View 且仅包含数据的域模型和 ViewModels(.Net 对象)之间进行映射查看需求。负责第一次加载 View 的 Controller Action 会将 View 数据绑定到 ViewModel 上,从而使页面快速初始化,无需进行 Ajax 调用。在视图本身中,我创建了淘汰视图模型,通过 Json 编码有界视图模型(例如,使用 Asp.Net MVC 我会做类似的事情)分配任何初始值(如果需要)

var boundedViewModel = @Html.Raw(Json.Encode(Model));
于 2012-05-04T08:23:08.647 回答
0

这正是我处理这个问题的方式。如果这是一个直接的 MVC 应用程序,您仍然会创建视图模型。

有时对于复杂的数据集,我可以看到使用 Knockback 之类的用例,它采用了主干.js 的丰富数据模型并将其与 knockout.js 相结合 http://kmalakoff.github.com/knockback/

于 2012-05-03T15:51:20.410 回答