1

我目前正在尝试将我的 MVC 视图模型映射到淘汰视图模型中。我正在使用映射扩展来自动执行此操作。

当 javascript 在视图中时,我可以工作它,因为我可以像这样使用剃刀代码直接引用视图模型......

var model = @Html.Raw(Json.Encode(Model))
indexViewModel.serverViewModel = ko.mapping.fromJS(model);

但是,当 javascript 在单独的文件中时,我不确定该怎么做。

我决定将 MVC 视图模型放入一个隐藏变量中(不确定我是否打算这样做)。

@Html.Hidden("Model", @Html.Raw(Json.Encode(Model)))

然后像这样在我的JS中引用它

var model = $('#Model').val();   
indexViewModel.serverViewModel = ko.mapping.fromJS(model);

现在的问题是它似乎没有映射。

我在 JS-in-View 和单独的 JS 文件版本中查看了模型的内容,它们都输出

{"companies":[{"Key":1,"Value":"BHP       "}]}

这是我所追求的 JSON。

只是由于某种原因,在单独的 JS 文件中,ko.mapping.fromJS(model) 返回一个字符串,而 JS-in-View 版本将其作为 observables() 的层次结构返回。

4

2 回答 2

1

在您的第一个示例中:

var model = @Html.Raw(Json.Encode(Model))
indexViewModel.serverViewModel = ko.mapping.fromJS(model);

model变量包含一个 JS 对象,可以用ko.mapping.fromJS(model).

但是在您的第二个示例中:

var model = $('#Model').val();   

现在model包含一个 JSON 字符串,需要使用ko.mapping.fromJSON方法映射差异:

所以以下应该工作:

var model = $('#Model').val();   
indexViewModel.serverViewModel = ko.mapping.fromJSON(model);

另请参阅文档,使用 JSON 字符串部分。

于 2013-06-23T07:05:55.977 回答
1

这条线

var model = $('#Model').val();  

正在返回一个stringwhileko.mapping.fromJS期待一个 JavaScript 对象 ( "fromJS")。

尝试:

var model = JSON.parse($('#Model').val());
于 2013-06-23T07:06:14.457 回答