2

在创建交互式表单或其他类型的网页时,knockoutjs 有几个选项。可以创建一个强类型视图并将模型从控制器传递给它。另一方面,可以很容易地从一个普通的旧 html 文档开始,并在初始加载后通过调用操作方法(JsonResult 或其他方式)使其自身初始化。

此外,当将页面作为 MVC 视图启动时,您可以使用 HtmlHelpers 以及普通的旧 html 标记来初始化视图。另一种选择是将模型状态作为 json 序列化为隐藏字段,并使用它来初始化视图。

根据我的经验,在第一次加载期间,当您让 ko 初始化视图时可能会有延迟。无论您是通过从序列化的隐藏字段传递 json 来构造视图模型,还是依靠它来调用各种服务来加载数据,页面“准备就绪”之前都有一段时间。这些延迟可以通过使用 HtmlHelpers 等初始化页面来避免,但这种初始化也会产生额外的成本(控制器中的额外初始化逻辑、视图中的默认内容等)。

哪种初始化页面的方式最 MVVM?在视图中使用 HtmlHelpers 或根本使用 cshtml 是一个坏主意吗?如果没有,你在哪里画出视图和视图模型之间的界限?

4

1 回答 1

2

“最 MVVM”是一个很难回答的问题,尤其是考虑到我们已经将模式与 MVC 和 Knockout 混合在一起。

我认为让 Knockout 完成所有初始化工作将是“最 MVVM”,但是当您遇到问题时严格遵守模式并不是一个好主意。如果在 DOM 准备好之后 KO 设置值会导致问题,您可以通过让HtmlHelpers页面初始化来解决这些问题,然后执行可行的方法。既然HtmlHelpers会让你data-bind同时设置属性,这感觉是个不错的解决方案,我之前也做过,效果很好。

我会说将 JSON 存储在隐藏字段中并不是一个好主意。您可以在 javascript 中使用它直接将模型编码为 JSON:

var initialData = @Html.Raw(Json.Encode(Model));

这是一个很好的解决方案,因为页面从控制器发送的数据开始,不需要第二次请求。

您可能必须考虑要做出哪些权衡。如果你想要纯度和没有代码重复,你可能不得不接受 KO 需要一些时间来初始化页面的问题。如果你想要一个完美的用户体验,你可能不得不牺牲一点纯度。

于 2012-07-12T22:56:37.973 回答