Model view controller 使用ko.mapping.fromJS和服务器数据时,视图模型未得到更新

Model view controller 使用ko.mapping.fromJS和服务器数据时,视图模型未得到更新,model-view-controller,knockout.js,mapping,Model View Controller,Knockout.js,Mapping,我正在将.Net对象序列化为javascript对象,以便与Knockout一起使用。我正在尝试使用Knockout的映射插件来构建视图模型,而不必指定Knockout视图模型的所有observable和observableArray属性。该页面将构建视图模型、加载数据并构建基本表 这很有效。我已将单击事件绑定到其中一列,单击该列时会将整个视图模型连同所选客户端一起发送到控制器。代码的结果是从ProbactionOfficeWideQueueItems集合中删除了一条记录,我可以通过检查ajax

我正在将.Net对象序列化为javascript对象,以便与Knockout一起使用。我正在尝试使用Knockout的映射插件来构建视图模型,而不必指定Knockout视图模型的所有observable和observableArray属性。该页面将构建视图模型、加载数据并构建基本表

这很有效。我已将单击事件绑定到其中一列,单击该列时会将整个视图模型连同所选客户端一起发送到控制器。代码的结果是从ProbactionOfficeWideQueueItems集合中删除了一条记录,我可以通过检查ajax调用中返回的值来验证这一点

我遇到的问题是视图模型似乎没有通过ko.mapping.fromJS调用得到更新。我检查了文档和多个其他堆栈溢出帖子,没有发现任何错误:

以下是整个页面,包括HTML和Javascript:

<div id="probationOfficeWideQueue-@ViewData("UniqueID")">
<table id="data-grid-@ViewData("UniqueID")" class="data-grid-@ViewData("UniqueID")">
    <thead>
        <tr>
            <th>Client Number</th>
            <th>Client Name</th>
            <th>Officer</th>
            <th>Check In</th>
            <th>Send To</th>
        </tr>
    </thead>
    <tbody data-bind="foreach: ProbationOfficeWideQueueItems">
        <tr>
            <td data-bind="text: ClientNumber"></td>
            <td data-bind="text: ClientName"></td>
            <td data-bind="text: Officer"></td>
            <td data-bind="click: $root.checkInClient"></td>
            <td><input data-bind="value: SendToOfficer, text: Officer" /></td>
        </tr>
    </tbody>
</table>

客户号
客户名称
官员
登记入住
寄往


var viewModel=@Html.Raw(新的JavaScriptSerializer().Serialize(Model));
功能试用OfficeWideQueueViewModel(数据){
var self=这个;
fromJS(数据,{},self);
self.checkInClient=函数(行){
openLoadScreen();
self.SelectedClientPIN=row.ClientPIN;
$.ajax({
类型:“POST”,
url:getRoot()+“试用/试用办公室宽带队列/CheckInClient”,
数据:ko.toJSON(self),
contentType:“应用程序/json”,
成功:功能(结果){
ko.mapping.fromJS(结果,自我)
closeLoadScreen();
},
错误:函数(错误){
closeLoadScreen();
}
});
}
};
函数EnhanceDataTable(){
$('.datagrid-@ViewData(“UniqueID”)).dataTable({
“bPaginate”:错误,
“bLengthChange”:false,
“自动排序”:[[1,'asc'],[2,'asc'],
“语言”:{
“sSearch”:“筛选器:”
},
“fnDrawCallback”:函数(){
$('table.data-grid td').bind('mouseenter',function(){$(this.parent().children().each(function(){$(this.addClass('dataTableRowHighlight');});});
$('table.data-grid td').bind('mouseleave',function(){$(this.parent().children().each(function(){$(this.removeClass('dataTableRowHighlight');});});
}
});
};
ko.applyBindings(新的试用OfficeWideQueueViewModel(viewModel),$(“#试用OfficeWideQueue-@ViewData(“UniqueID”)”)[0]);
EnhanceDataTable();

如果我在没有mapper插件的情况下使用knockout,定义并填充可观察的属性和数组,那么表行将正确更新,这是我的后备计划。请告诉我哪里出了问题

编辑:在最初的反馈之后,我想说我已经尝试在ajax调用的success函数中的ko.mapping.fromJS(results,self)行中使用分号。我还尝试在我的成功方法中对行进行以下更改:

  • self=ko.mapping.fromJS(结果)
  • self=ko.mapping.fromJS(结果,{},self)
  • fromJS(results,{},self)
  • fromJSON(结果,{},self)
我还尝试将其指定给模型属性,如以下示例之一:

  • self.Model=ko.mapping.fromJS(结果,{},self)

在禁用表上的DataTables.net插件后,我也尝试过这样做。

您没有将映射结果捕获到komodel中:

ko.mapping.fromJS(results, self)
根据它看来应该是这样的

ko.mapping.fromJS(data, {}, contract_model);

当敲除更改某些内容时,jQuery数据表不会自动神奇地更新

它们似乎是使以下功能得以实现的代码:

$('.data-grid-123').dataTable('refresh');

这条线上还有一个分号。这个答案表明中间的{}不是可选的:我更新了我的问题,包括我能记住的所有排列。问题不在于数据没有绑定,而是数据项。NET没有正确更新。谢谢
$('.data-grid-123').dataTable('refresh');