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