Asp.net mvc 4 MVC4视图淘汰绑定未在ajax调用时更新

Asp.net mvc 4 MVC4视图淘汰绑定未在ajax调用时更新,asp.net-mvc-4,knockout.js,knockout-mapping-plugin,Asp.net Mvc 4,Knockout.js,Knockout Mapping Plugin,在这里,我已经尽可能多地问了很多问题,并尝试了所有不同的建议,但都无法实现。我有一个使用mapping插件绑定了Knockout的视图,它可以正常工作,但只有当我做了“错误的事情”时。我读过的所有内容都说,每个视图只需调用ko.applyBindings(),然后所有内容都应该使用ko.mapping.fromJS()进行更新。我似乎无法让它工作,我能够让视图刷新的唯一方法是在从.ajax()调用返回的成功调用中再次调用ko.applyBindings()。这是违规代码 <script t

在这里,我已经尽可能多地问了很多问题,并尝试了所有不同的建议,但都无法实现。我有一个使用mapping插件绑定了Knockout的视图,它可以正常工作,但只有当我做了“错误的事情”时。我读过的所有内容都说,每个视图只需调用ko.applyBindings(),然后所有内容都应该使用ko.mapping.fromJS()进行更新。我似乎无法让它工作,我能够让视图刷新的唯一方法是在从.ajax()调用返回的成功调用中再次调用ko.applyBindings()。这是违规代码

<script type="text/javascript">
    var viewModel;

    $(document).ready(function() {
        $("#panelbar").kendoPanelBar({
            expandMode: "multiple"
        });

        $.ajax({
            type: 'GET',
            url: '/Home/IsUserMarketingManager',
            success: function (data) {
                if (data == true) {
                    $('#submitNewCase').hide();
                    $('#approveCase').show();
                    $('#disapproveCase').show();
                }
            }
        });

        // Generate client View Model from Server View Model
        viewModel = new ViewModel();
        ko.mapping.fromJS(@Html.Raw(Json.Encode(Model)),{}, viewModel);
        ko.applyBindings(viewModel);
    });

    function ViewModel () {
        var self = this;

        self.addLocation = function() {
            self.AdditionalLocations.push({ GaNumber: "" });
        };
    }
</script>

var模型;
$(文档).ready(函数(){
$(“#panelbar”)。肯多帕内巴尔({
扩展模式:“多个”
});
$.ajax({
键入:“GET”,
url:“/Home/IsUserMarketingManager”,
成功:功能(数据){
如果(数据==true){
$('#submitNewCase').hide();
$(“#approveCase”).show();
$(“#不赞成”).show();
}
}
});
//从服务器视图模型生成客户端视图模型
viewModel=新的viewModel();
fromJS(@Html.Raw(Json.Encode(Model)),{},viewModel);
应用绑定(视图模型);
});
函数视图模型(){
var self=这个;
self.addLocation=函数(){
self.AdditionalLocations.push({GaNumber:});
};
}
稍后,将使用检索到的数据更新表单:

<script type="text/javascript">
    $('#btnImport').click(function () {
    $.blockUI({ message: '<h2>Importing Client Information...</h2> <img src="/Images/ajax-loader.gif"><br />' });
    $.ajax({
        type: 'post',
        url: '/Home/ImportClientCrmInfoJson',
        dataType: "json",
        data: ko.mapping.toJS(viewModel),
        success: function (data) {
            $.unblockUI();
            if (!data.AccountNull) {
                ko.mapping.fromJS(data, {}, viewModel);
            } else {
                alert("Could not find account for this GA Number, please try again.");
            }
        }
    });
});
</script>

$('#btnImport')。单击(函数(){
$.blockUI({消息:'导入客户端信息…
}); $.ajax({ 键入:“post”, url:“/Home/ImportClientCrmInfoJson”, 数据类型:“json”, 数据:ko.mapping.toJS(viewModel), 成功:功能(数据){ $.unbui(); 如果(!data.AccountNull){ fromJS(数据,{},viewModel); }否则{ 警报(“找不到此GA编号的帐户,请重试。”); } } }); });
将表单提交给控制器时,所有数据都在那里,并正确映射到服务器端视图模型,但视图中的表单不会使用从$.ajax调用返回的数据进行更新。如果我做了以下操作,我会更新表单,但我知道这不是正确的方法,也给我带来了其他问题

 <script type="text/javascript">
    $('#btnImport').click(function () {
    $.blockUI({ message: '<h2>Importing Client Information...</h2> <img src="/Images/ajax-loader.gif"><br />' });
    $.ajax({
        type: 'post',
        url: '/Home/ImportClientCrmInfoJson',
        dataType: "json",
        data: ko.mapping.toJS(viewModel),
        success: function (data) {
            $.unblockUI();
            if (!data.AccountNull) {
                viewModel = ko.mapping.fromJS(data);
                                ko.applyBindings(viewModel); // This works but isn't the right way...
            } else {
                alert("Could not find account for this GA Number, please try again.");
            }
        }
    });
});
</script>

$('#btnImport')。单击(函数(){
$.blockUI({消息:'导入客户端信息…
}); $.ajax({ 键入:“post”, url:“/Home/ImportClientCrmInfoJson”, 数据类型:“json”, 数据:ko.mapping.toJS(viewModel), 成功:功能(数据){ $.unbui(); 如果(!data.AccountNull){ viewModel=ko.mapping.fromJS(数据); ko.applyBindings(viewModel);//这是可行的,但不是正确的方法。。。 }否则{ 警报(“找不到此GA编号的帐户,请重试。”); } } }); });

如果有任何帮助,我们将不胜感激。

您是否检查过下面这行代码是否用于创建“新”的viewmodel

viewModel = ko.mapping.fromJS(data);
执行此操作时,新的viewModel和旧绑定将被销毁。这就是为什么您必须再次调用ApplyBindings。无论如何,我认为上面这行代码是问题的根源


您是否有办法在viewModel上创建一个可观察属性,并允许viewModel反映此对象中的数据?这可能是更新过程中更实用的方法。

在ajax调用的成功回调中,使用此方法
ko.applyBindings(viewModel)
但将要更新的DOM部分作为第二个参数传递,如下所示

ko.applyBindings(viewModel,$(“#mydiv”)[0])


不要使用jquery对象,而是真正的DOM对象。

您确认这不是因为
!data.AccountNull
的计算结果为false,这将跳过调用
ko.mapping.fromJS()
吗?是的,我尝试过删除它,但结果没有改变。是的,我意识到这是在创建一个新的viewModel,这就是为什么我知道这样做是错误的。我不明白的是,为什么即使数据从ajax调用中恢复良好,并且客户端viewModel数据似乎更新良好,但绑定控件中没有一个显示绑定数据。在回调中,所有的JS对象在检查中看起来都很好,但是我在视图中没有得到更新。对此我很抱歉。这似乎不是一个孤立的问题。查看本文:ko.mapping似乎正在破坏viewModel并创建一个新的viewModel,从而破坏了绑定。FWIW我已经避开了ko.mapping插件,转而通过代码生成创建自己的代理类。映射对于相当简单的转换来说似乎很好,但当您开始使用它执行复杂的任务时,它就会崩溃。此解决方案的问题是,我不必再次调用
ko.applyBindings
来更新视图,至少根据ko文档。