1

我有这段代码,它工作得很好:

<script>
   $(function() {
      var modelAsString = @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model));

      myProject.initialize(ko.mapping.fromJS(modelAsString));
   });
</script>

请注意,此脚本直接在我的视图中(例如 MyPage.cshtml)

我只是想知道为什么我必须使用函数fromJS而不是fromJSON

如果我使用fromJSON,则没有错误,但似乎我的视图模型没有正确创建。

如果可能的话,如果有一个示例,我可以在相同的上下文中使用 fromJSON ,将不胜感激;我直接从视图中获取模型而不是从 ajax 查询中获取它的情况。

4

1 回答 1

2

ko.mapping.fromJSON获取一个 JSON字符串,然后对其进行解析并ko.mapping.fromJS使用解析后的 JavaScript 对象在内部调用。但是,如果您调用ko.mapping.fromJSON的不是字符串,它会返回null,因此不会发生映射。

因此,在您的情况下,您需要更改modelAsString要保存的 JavaScript 字符串,并Html.Raw用撇号包装调用结果,然后您可以ko.mapping.fromJSON在其上使用:

var modelAsString = '@(Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model)))';

myProject.initialize(ko.mapping.fromJSON(modelAsString));

还形成映射插件文档(我添加的重点):

使用 JSON 字符串

如果您的 Ajax 调用返回一个JSON 字符串(并且没有将其反序列化为 JavaScript 对象),那么您可以使用该函数 ko.mapping.fromJSON来创建和更新您的视图模型。要取消映射,您可以使用ko.mapping.toJSON.

除了它们使用 JSON 字符串而不是 JS 对象这一事实之外,这些函数与它们的 *JS 对应物完全相同。

于 2013-05-29T21:28:03.357 回答