如何将我的Knockout代码移出我的视图并仍能映射ViewModel?

时间:2013-06-23 06:54:53

标签: c# .net asp.net-mvc-4 knockout.js

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

当javascript在视图中时,我可以正常工作,因为我可以直接用razor代码直接引用viewmodel ......

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()的层次结构返回。

2 个答案:

答案 0 :(得分:1)

在你的第一个samaple:

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

model变量包含一个可以与ko.mapping.fromJS(model)映射的JS对象。

然而在你的第二个例子中:

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

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

所以以下内容应该有效:

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

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

答案 1 :(得分:1)

这一行

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

返回string,而ko.mapping.fromJS期待JavaScript对象("fromJS")。

尝试:

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