2015-08-20 146 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))) 
相關問題