我正在尝试将我的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()的层次结构返回。
答案 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());