KnockoutJS,在ajax调用后更新ViewModel
我正在使用Knockout和Knockout Mapping插件。
- 我的MVC3 Action直接返回一个View而不是JSON,我将我的Model转换为JSON。
- 这是一个数据输入表单,由于系统validation的性质,所有这些都在服务层中完成,并在ViewModel中的Response对象中返回警告。
- 初始绑定和更新正确地处理了导致我出现问题的“更新后”行为。
我的问题是在调用AJAX POST并且接收我的JSON响应后,敲除不会更新我的所有绑定…就像observable / mappings已经下降一样
如果我包含一个额外的ko.applyBindings(viewModel); 在成功的事情确实有效…但是多个绑定会出现问题,并且我确定这不是正确的解决方案。
这是HTML / Template / Bindings
这就是Knockout / Script
@{ var jsonData = new HtmlString(new JavaScriptSerializer().Serialize(Model)); } var initialData = @jsonData; var viewModel = ko.mapping.fromJS(initialData); viewModel.save = function () { this.Response = null; var data = ko.toJSON(this); $.ajax({ url: '@Url.Action("Edit")', contentType: 'application/json', type: "POST", data: data, dataType: 'json', success: function (result) { ko.mapping.updateFromJS(viewModel, result); } }); } $(function() { ko.applyBindings(viewModel); });
这是从成功请求返回的响应JSON,包括validation消息。
{ "Id": 440, "Project_Name": "", "Response": { "HasWarning": true, "BusinessWarnings": [ { "ExceptionType": 2, "Message": "Project is invalid." }, { "ExceptionType": 1, "Message": "Project_Name may not be null" } ] } }
UPDATE
Fiddler演示是我正在经历的修剪现场示例。 我使用返回的JSON更新了Project_Name,但是viewModel.Response对象和属性没有通过它们的数据绑定进行更新。 特别是Response.HasWarning()。
我已经改回ko.mapping.updateFromJS,因为在我的控制器中我特意返回Json(viewModel)。
清理了我的初始代码/问题以匹配演示。
我想响应是保留的,当我将“响应”更改为“resp”时,一切都很顺利。 见http://jsfiddle.net/BBzVm/
你不应该在成功活动中使用ko.mapping.updateFromJSON吗? 章节在Knockout Mapping站点上使用JSON字符串说:
如果您的Ajax调用返回JSON字符串(并且不将其反序列化为JavaScript对象),则可以使用函数ko.mapping.fromJSON和ko.mapping.updateFromJSON来创建和更新视图模型。