2012-10-11 63 views
13

即時通訊使用與MVC淘汰賽。我試圖將可觀察的對象數組從knockout傳回到我的MVC控制器操作以保存到數據庫。如果我通過ko.toJSON(viewModel.ArrayName)將數組從knockout傳遞給我的控制器操作,它會在我的控制器參數中返回爲null。如果我嘗試通過ko.toJS(viewModel.ArrayName)將它傳遞給MVC,它具有正確數量的項目,但由於某些原因數據爲空。如何做到這一點的任何幫助將受到高度讚賞。謝謝!將knockout.js的observablearray對象傳遞給MVC Controller Action?

我JQuery的數據檢索方法:

var dataService = {}; 
var viewModel; 

$(document).ready(function() { 
    dataService.getAccessLevelList(); 
}) 

dataService.getAccessLevelList = function() { 
    $.post('/DataService/GetAccessLevelList', null, function (data) { 
     viewModel = ko.mapping.fromJS(data); 
     ko.applyBindings(viewModel); 
    }); 
} 

這是問題的方法:

updateAccessLevels = function() { 
    $.post('/DataService/UpdateAccessLevels', { accessLevels: ko.toJSON(viewModel.AccessLevels) }, function (status) { 
     alert(status); 
    }); 
} 

我的MVC控制器數據檢索動作:

[HttpPost] 
    public ActionResult GetAccessLevelList() 
    { 
     FacilityAccessViewModel viewModel = new FacilityAccessViewModel(); 
     viewModel.AccessLevels = unitOfWork.AccessLevelRepository.Get().ToList(); 
     return Json(viewModel); 
    } 

當嘗試從此控制器方法的Knockout中傳遞參數時,參數將返回NULL或帶有NULL數據。

[HttpPost] 
    public ActionResult UpdateAccessLevels(List<AccessLevel> accessLevels) 
    { 
     try 
     { 
      foreach (AccessLevel record in accessLevels) 
      { 
       unitOfWork.AccessLevelRepository.Update(record); 
      } 

      unitOfWork.Save(); 
      return Json("SUCCESS"); 
     } 
     catch (Exception ex) 
     { 
      return Json(ex.ToString()); 
     } 
    } 

下面是經由提琴手這就是所示的JSON數據被貼到我的MVC控制器動作,當我在傳遞{accessLevels:ko.toJSON(viewModel.AccessLevels)}控制器參數是使用在此空未來

[{"Access":[],"Id":1,"AccessLevelDesc":"TEST222"},{"Access":[],"Id":2,"AccessLevelDesc":"TEST222"}] 

下面經由提琴手示出這就是被張貼到我的MVC控制器動作的JS數據,當我在傳遞{accessLevels:ko.toJS(viewModel.AccessLevels)},在此情況下,列表中有兩個成員如預期的那樣,但專家中的數據全爲空perties

accessLevels[0][Id] 1 
accessLevels[0][AccessLevelDesc] TEST222 
accessLevels[1][Id] 2 
accessLevels[1][AccessLevelDesc] TEST222 

如果我通過在一個單一的對象,以我的控制器,它工作得很好,但我似乎無法找出正確的方法從obervablearray發佈對象的數組到我的控制器回POCO實體。

+1

什麼是JSON的形狀被張貼?要麼使用調試器來獲取此信息,要麼使用[Fiddler](http://www.fiddler2.com/fiddler2/version.asp)來捕獲它,然後使用此信息更新您的信息。謝謝! –

+0

用請求的信息編輯我的問題。 – ccorrin

+0

我不知道ASP.net如何處理映射,但你傳遞一個字符串到你的文章('ko.toJSON()'返回一個字符串)。這不應該是一個數組?你不應該使用'ko.toJS()'嗎? –

回答

9

嘗試通過指定正確的請求Content-Type頭髮送它作爲一個JSON請求:

updateAccessLevels = function() { 
    $.ajax({ 
     url: '/DataService/UpdateAccessLevels', 
     type: 'POST', 
     contentType: 'application/json; charset=utf-8', 
     data: ko.toJSON(viewModel.AccessLevels), 
     success: function(status) { 
      alert(status); 
     } 
    }); 
}; 
+0

這工作完美。謝謝。所以試圖理解這一點,爲什麼它沒有手動指定內容類型爲空? – ccorrin

+0

因爲您正在發送JSON字符串並且未指定內容類型。默認的模型綁定器完全不知道如何綁定它。您可以在不調用任何'ko.toJSON'的情況下傳遞'{accessLevels:viewModel.AccessLevels}',但這隻適用於數組中的基本類型。使用更復雜的類型時,最好使用JSON請求。 –

+0

這很有道理,因爲當我發送一個項目而不是數組時,它工作正常。謝謝Darin。 – ccorrin

相關問題