2015-08-20 117 views
0

这是mvc EF和淘汰赛中的车队管理应用程序,其中有车辆,驾驶员和司机旅行的特定路线。将嵌套式挖空视图模型传递给控制器​​

我有一种情况,我想从我的视图模型中嵌套的三个模型中收集字段值到单个对象中,并通过ajax将其发布到我的后端。我希望通过点击一个按钮来触发它。

有一个问题是我的populateFleetInformation函数。当我从各种模型中收集字段值时,一些可观察值正在丢失其值并显示为空。

试图使AJAX调用

function FleetViewModel() { 
    var vvm = this; 
    vvm.regNumber = ko.observable(0); 
    vvm.make = ko.observable(""); 
    vvm.model = ko.observable(""); 
    vvm.RouteDetail = new RouteViewModel(); 
    vvm.SaveFleetInfo = function(item){ 
     if (!pageViewModel.isAuthenticated()) return; 
     populateFleetInformation(item); 
     $.when(postSecureData("/api/Fleet/", ko.toJSON(pageViewModel.FleetViewModel.RouteViewModel.RouteDriverViewModel))) 
      .done(function() { 
       document.getElementById("save-Fleet-btn").innerHTML = "Saving..."; 
       setTimeout(function() { document.getElementById("save-fleet-btn").innerHTML = "Save" }, 2500); 
       $.msgGrowl({ 
        type: 'info', 
        title: 'Fleet Information', 
        text: 'fleet information succesfully saved', 
        position: 'bottom-right', 
        lifetime: 3000 
       }); 

      }) 

    } 

} 

函数收集数据

function PopulateFleetInformation(item) 
{ 
    pageViewModel.fleetVM.regNumber(item.regNumber); 
    pageViewModel.fleetVM.make(item.make); 
    pageViewModel.fleetVM.model.(item.model); 
    pageViewModel.fleetVM.routeDetail.routeID(item.routeId); 
    pageViewModel.fleetVM.routeDetail.routeName(item.routeName); 
    pageViewModel.fleetVM.routeDriver.nationalId(item.nationalId); 
    pageViewModel.fleetVM.individualMsisdn.licenseId(item.licenseId); 
    pageViewModel.fleetVM.individualMsisdn.driverName(item.driverName); 

} 

触发按钮视图模型

<button type="submit" id="save-fleet-btn" class="btn"data-bind="click: $root.fleetVM.sensorDetail.SaveFleetInfo"></button> 
+0

在哪里你期待'PopulateFleetInformation'中的'item'来自UI,还是来自Ajax调用的结果? –

+0

@Anish Patel从用户界面,然后我想将这些值(项目)传递给控制器​​,这就是为什么填充方法在post方法之前 – anchor

+1

ajax调用在哪里,它是'postSecureData'? ajax调用返回什么? –

回答

1

此功能:

function PopulateFleetInformation(item) 
{ 
    pageViewModel.fleetVM.regNumber(item.regNumber); 
    pageViewModel.fleetVM.make(item.make); 
    pageViewModel.fleetVM.model.(item.model); 
    pageViewModel.fleetVM.routeDetail.routeID(item.routeId); 
    pageViewModel.fleetVM.routeDetail.routeName(item.routeName); 
    pageViewModel.fleetVM.routeDriver.nationalId(item.nationalId); 
    pageViewModel.fleetVM.individualMsisdn.licenseId(item.licenseId); 
    pageViewModel.fleetVM.individualMsisdn.driverName(item.driverName); 

} 

做什么,你认为它是在所有。

item来自传入SaveFleetInfo的上下文,当点击按钮时被敲除。然后该函数将您试图检索的字段的值设置为item;我猜你在这里遇到各种各样的undefined例外。

你想要做的是这样的:

function PopulateFleetInformation() 
{ 
    return { 
     regNumber: pageViewModel.fleetVM.regNumber(); 
     make: pageViewModel.fleetVM.make(); 
     model: pageViewModel.fleetVM.model.(); 
     routeId: pageViewModel.fleetVM.routeDetail.routeID(); 
     routeName: pageViewModel.fleetVM.routeDetail.routeName(); 
     nationalId: pageViewModel.fleetVM.routeDriver.nationalId(); 
     licenseId: pageViewModel.fleetVM.individualMsisdn.licenseId(); 
     driverName: pageViewModel.fleetVM.individualMsisdn.driverName(); 
    } 
} 

这个函数返回你以后为对象的值,那么你可以发布这个数据是这样的:

var data = populateFleetInformation(); 
    $.when(postSecureData("/api/Fleet/", ko.toJSON(data))) 
相关问题