2012-10-11 64 views
13

Im sử dụng loại trực tiếp với MVC. Im cố gắng để vượt qua một mảng quan sát của các đối tượng từ knockout trở lại hành động điều khiển MVC của tôi để tiết kiệm cho cơ sở dữ liệu. Nếu tôi vượt qua Array từ knockout trên để hành động điều khiển của tôi thông qua ko.toJSON (viewModel.ArrayName) nó trở lại như null trong tham số điều khiển của tôi. Nếu tôi cố gắng chuyển nó cho MVC qua ko.toJS (viewModel.ArrayName), nó có số lượng đúng các mục nhưng dữ liệu là null vì một lý do nào đó. Bất kỳ sự giúp đỡ nào về cách thực hiện điều này sẽ được đánh giá cao greeatly. Cảm ơn!Truyền đối tượng knockout.js observablearray tới MVC Controller Action?

My JQuery liệu Retrieval Phương pháp:

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); 
    }); 
} 

Đây là phương pháp vấn đề:

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

My MVC điều khiển dữ liệu Retrieval hành động:

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

Tham số đang trở lại NULL hoặc với dữ liệu NULL khi cố chuyển nó từ Knockout trên phương thức bộ điều khiển này.

[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()); 
     } 
    } 

Dưới đây là các dữ liệu JSON hiển thị qua thats cáy được đưa lên controller action MVC của tôi khi tôi vượt qua trong {accessLevels: ko.toJSON (viewModel.AccessLevels)} tham số điều khiển được sắp tới trong rỗng sử dụng này

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

Dưới đây là dữ liệu JS hiển thị qua cáy thats được đưa lên controller action MVC của tôi khi tôi vượt qua trong {accessLevels: ko.toJS (viewModel.AccessLevels)}, trong trường hợp này danh sách có hai thành viên như mong đợi, nhưng dữ liệu là tất cả null trong pro perties

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

Nếu tôi vượt qua trong một đối tượng duy nhất để điều khiển của tôi nó làm việc tốt, nhưng tôi không thể dường như tìm ra cách thích hợp để gửi một mảng của các đối tượng để điều khiển của tôi từ một obervablearray trở lại một POCO thực thể.

+1

gì được hình dạng của JSON đang được đăng tải? Sử dụng trình gỡ lỗi để nhận được thông tin này hoặc sử dụng [Fiddler] (http://www.fiddler2.com/fiddler2/version.asp) để nắm bắt nó, sau đó cập nhật bài đăng của bạn với thông tin này. Cảm ơn! –

+0

Đã chỉnh sửa câu hỏi của tôi ở trên với thông tin được yêu cầu. – ccorrin

+0

Tôi không biết làm thế nào ASP.net xử lý ánh xạ nhưng bạn đang đi qua trong một chuỗi để bài viết của bạn ('ko.toJSON()' trả về một chuỗi). Đó không phải là một mảng sao? Bạn không nên sử dụng 'ko.toJS()'? –

Trả lời

9

Hãy thử gửi nó như là một yêu cầu JSON bằng cách xác định yêu cầu Content-Type tiêu đề chính xác:

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

Điều này làm việc hoàn hảo. Cảm ơn bạn. Vì vậy, cố gắng để hiểu điều này, tại sao nó đi qua như là null mà không cần xác định bằng tay kiểu nội dung? – ccorrin

+0

Vì bạn đang gửi chuỗi JSON và chưa chỉ định loại nội dung. Trình kết nối mô hình mặc định hoàn toàn không có đầu mối làm thế nào để ràng buộc nó.Bạn có thể đã thông qua '{accessLevels: viewModel.AccessLevels}' mà không gọi bất kỳ 'ko.toJSON' nhưng điều này sẽ chỉ làm việc với các kiểu nguyên thủy bên trong mảng. Với các kiểu phức tạp hơn, tốt hơn nên sử dụng một yêu cầu JSON. –

+0

Điều đó có ý nghĩa, như khi tôi gửi một mục thay vì một mảng nó hoạt động tốt. Cảm ơn Darin. – ccorrin

Các vấn đề liên quan