asp.net-mvc-3 - 使用 knockout.js 映射插件映射 JSON 数组,并且 View 渲染不起作用

标签 asp.net-mvc-3 knockout.js

我在将 .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/

相关文章:

asp.net - 如何在 ASP.NET MVC 中获取对 HttpResponse 的引用?

c# - 如何在 MVC3 上禁止返回 403 上的正确消息?

asp.net - 如何拒绝访问直接 URL 到我的部分 View ?

javascript - 使用 jQuery 的 ajax 调用速度慢得令人痛苦

asp.net-mvc-3 - 使用新的代码安全模型保护网站程序集

javascript - 交替文本行的背景颜色

javascript - 在一个数据绑定(bind)中应用 knockout if 和选项绑定(bind)在一起

css - 表格 td 中的图像占据了所有宽度

javascript - knockout : cascade write to multiple observables if no value yet?

javascript - knockout.js 更新选择列表不会在第一次更改时触发