【发布时间】:2011-05-30 13:36:39
【问题描述】:
我正在使用 Knockout 和 Knockout Mapping 插件。
- 我的 MVC3 操作直接返回视图而不是 JSON,因此我将模型转换为 JSON。
- 这是一个数据输入表单,由于系统的性质,所有验证都在服务层中完成,并在 ViewModel 内的 Response 对象中返回警告。
- 初始绑定和更新工作正常,这是导致我出现问题的“更新后”行为。
我的问题是在调用 AJAX POST 并接收到我的 JSON 响应敲除后没有更新我的所有绑定...好像可观察/映射已经下降
如果我包含一个额外的 ko.applyBindings(viewModel);在成功的情况下,事情确实有效......但是,多个绑定会出现问题,并且确定这不是正确的解决方案。
这是 HTML/模板/绑定
<!-- Start Form -->
<form action="@Url.Action("Edit")" data-bind="submit: save">
<div id="editListing" data-bind="template: 'editListingTemplate'"></div>
<div id="saveListing" class="end-actions">
<button type="submit">Save Listings</button>
</div>
</form>
<!-- End Form -->
<!-- Templates -->
<script type="text/html" id="editListingTemplate">
<div class="warning message error" data-bind="visible: Response.HasWarning">
<span>Correct the Following to Save</span>
<ul>
{{each(i, warning) Response.BusinessWarnings}}
<li data-bind="text: Message"></li>
{{/each}}
</ul>
</div>
<fieldset>
<legend>Key Information</legend>
<div class="editor-label">
<label>Project Name</label>
</div>
<div class="editor-field">
<input data-bind="value: Project_Name" class="title" />
</div>
</fieldset>
</script>
<!-- End templates -->
这是淘汰赛/脚本
<script type="text/javascript">
@{ 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);
});
</script>
这是成功请求返回的响应 JSON,包括验证消息。
{
"Id": 440,
"Project_Name": "",
"Response": {
"HasWarning": true,
"BusinessWarnings": [
{
"ExceptionType": 2,
"Message": "Project is invalid."
}, {
"ExceptionType": 1,
"Message": "Project_Name may not be null"
}
]
}
}
更新
Fiddler Demo 是我正在经历的一个精简的活生生的例子。我使用返回的 JSON 更新了 Project_Name,但 viewModel.Response 对象和属性没有通过它们的数据绑定进行更新。特别是 Response.HasWarning()。
我已经改回 ko.mapping.updateFromJS 因为在我的控制器中我专门返回 Json(viewModel)。
清理了我的初始代码/问题以匹配演示。
【问题讨论】:
标签: asp.net jquery asp.net-mvc-3 knockout.js