Я использую нокаут и плагин для нокаута.
- My MVC3 Action возвращает вид, а не JSON напрямую, поскольку я конвертирую свою модель в JSON.
- Это форма ввода данных и из-за характера проверки системы выполняется на уровне обслуживания с предупреждениями, возвращаемыми объектом Response в ViewModel.
- Исходные привязки и обновления корректно обрабатывают поведение post-update, которое вызывает у меня проблему.
Моя проблема заключается в том, что после вызова AJAX POST и получения моего ответа JSON-ответа новичок не обновляет все мои привязки... как если бы наблюдаемые/сопоставления выпадали
Если я включаю дополнительные ko.applyBindings(viewModel); в успехе все работает. Однако проблемы возникают после нескольких привязок, и я уверен, что это не правильное решение.
Это HTML/Template/Bindings
<!-- 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
<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"
}
]
}
}
UPDATE
Демоверсия Fiddler Является ли обрезанный живой пример того, что я испытываю. У меня есть обновление Project_Name с возвращенным JSON, но объект и свойства viewModel.Response не обновляются через привязки данных. В частности, Response.HasWarning().
Я вернулся к ko.mapping.updateFromJS, потому что в моем контроллере я специально возвращаю Json (viewModel).
Убрал мой исходный код/вопрос в соответствии с демонстрацией.