我在将 .NET JavaScriptSerializer
生成的 JSON 数组映射到 knockout.js 时遇到问题。数组是这样生成的(为了方便而缩短):
OrderProposalFacade[] proposals = new OrderProposalFacade[order.OrderProposals.Count];
foreach (OrderProposal proposal in order.OrderProposals)
{
proposals[i++] = new OrderProposalFacade(proposal);
}
ViewBag.OrderProposals = new JavaScriptSerializer().Serialize(proposals);
生成的JSON字符串是这样的:
[{ "ProposalId":1,"ProgrammedWeek":null,
"ProposalValue":120,"ProposalValueCorrected":130,
"ProposalDateSent":"01-12-2011","ProposalDateCorrected":"01-12-2011",
"ServiceId":1,"ServiceDescriptiveId":"OS001","ProposalState":2
},
{//another similar object}
]
在 ASP.NET MVC View 中,我这样做是为了绑定(bind)数组:
var initialData = ko.mapping.fromJSON(<%: new HtmlString(ViewBag.OrderProposals as string) %>);
var viewModel = {
proposals: ko.observableArray(initialData),
//some methods; removed to ease reading
};
ko.applyBindings(viewModel);
问题:proposals
数组应该由 knockout.js 模板呈现,但没有呈现任何内容。使用 Firebug,我在 initialData
数组上看不到任何对象,因此我假设在初始化它时出现错误,因此,proposals
。绑定(bind)到模板是这样的:
<div id="service-orders" data-bind='template: { name: "proposal-template", foreach: proposals }' style="margin:0 -.7em 0 -0.5em;"></div>
如果我删除 ko.mapping.fromJSON()
一切正常,即模板使用 proposals
数组中的值呈现。 但是 当我更新initialData
数组上的一个对象的值时会出现另一个问题。根据我的理解,如果我更新一个可观察的属性,模板会再次呈现(因此是 knockout.js 映射),但如果不映射所有属性,它就不会发生,对吧?
简而言之,我需要将所有属性映射到 initialData
数组上,以便在我更改其中一个值时可以观察到它们以更新我的 View 对象,但它不起作用。
有什么想法吗?提前致谢!
最佳答案
终于解决了!最终的 Javascript 是这样的:
var initialData = <%: new HtmlString(ViewBag.OrderProposals as string) %>;
var viewModel = {
proposals: ko.observableArray(),
//some methods; removed to ease reading
};
viewModel.proposals = ko.mapping.fromJS(initialData);
ko.applyBindings(viewModel);
我所做的 2 处更改:
- 我调用
ko.mapping.fromJS(initialData)
而不是ko.mapping.fromJSON(initialData)
。不确定,但我似乎.fromJSON()
在映射我提出问题的数组时遇到了一些问题; .fromJS()
方法在viewModel
创建后被调用。
关于asp.net-mvc-3 - 使用 knockout.js 映射插件映射 JSON 数组,并且 View 渲染不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8344573/