Я думаю, что решение вашей проблемы приходит от неправильного представления о модели представления.Модель представления - это не только то, что доставляет данные в представление, но и заполнитель для отправки данных обратно.
То, как я обычно работаю с нокаутом, никогда не заканчивается отправкой пустого представлениямодель на вид.Модель представления обычно имеет все поля, к которым я привязываю.Хотя они могут быть пустыми строками или инициализированными объектами без отображаемых значений, фактические объекты по-прежнему завершаются с правильным представлением каждого объекта в полях, к которым я привязан.
Возможно, вы захотите просто посмотретьотправка пустых объектов вместо ничего в представление.
РЕДАКТИРОВАТЬ: Пример un ASP.NET MVC
Итак, я на стороне сервера создаю объект модели представления, который содержитвсе данные, которые должны быть отображены, а также все данные, которые должны быть собраны.Для упрощения проверки кода я обычно помещаю собираемые данные в свой собственный подкласс, но это все зависит от потребностей вашего кода.
В любом случае, любой объект, идущий в представление, наследуется от класса vmBaseкоторый в основном предоставляет метод toJSON (), который генерирует сериализацию объекта JSON.На мой взгляд, это вызывается механизмом просмотра.Как показано в коде ниже.
<script type='text/javascript'>
var viewModel = ko.mapping.fromJS(<%= Model.ToJson() %>);
$(document).ready( function () {
ko.applyBindings(viewModel);
});
</script>
Когда я готов отправить код обратно, я просто удаляю версию JS модели представления.
<script type='text/javascript'>
var dataToSendToServer = ko.toJS(viewModel);
</script>
В некоторых sanarios, где меняется только часть модели представления (это если вы выполняете обновления AJAX), вы можете делать некоторые интересные вещи, такие как переключение шаблонов, чтобы можно было использовать различные привязки.применены.В этом случае мы используем # ID_of_Container в качестве контейнера исходных данных / шаблона и заменяем шаблон (который может содержать элементы data-bind = "") новым шаблоном ID_of_Template
<script type='text/javascript'>
ko.cleanNode($("#ID_of_Container"));
delete (viewModel.Some_Element_To_Be_Updated);
viewModel = ko.mapping.updateFromJS(viewModel, New_Data_For_That_Element);
// Use ko.toJS(viewModel) because standard template plugin doesn't understand
// knockout observables
$("#ID_of_Container").html($("#ID_of_Template").tmpl(ko.toJS(viewModel)))
ko.applyBindings(viewModel, $("#ID_of_Container")[0]);
</script>