2012-03-20 27 views
6

Tôi đã mảng của tôi dân cư như vậy:Vượt qua danh sách các int từ JavaScript đến C# - Tôi nhận được danh sách, nhưng nó trống; dữ liệu biểu mẫu không được cấu trúc đúng cách?

updateLabels: function() { 
    var diagrams = _stage.diagramLayer.getChildren(); 

    var componentIDs = new Array(); 

    for (var index = 0; index < diagrams.length; index++) { 
     componentIDs.push(diagrams[index].componentID); 
    } 

    var self = this; 
    $.ajax({ 
     url: '../PlanView/UpdateDiagrams', 
     type: 'POST', 
     data: { ComponentIDs: JSON.stringify(componentIDs), RackInfo: $('#RackInfoSelect').val() }, 
     success: function (data) { 
      console.log('success'); 
     }, 
     error: function() { 
      console.log("error"); 
     } 
    }); 
    }, 

phía máy chủ tôi có phương pháp này:

[CompressionFilterAttribute] 
public JsonResult UpdateDiagrams(List<int> componentIDs, string rackInfo) 
{ 
    List<object> diagramInformation = new List<object>(componentIDs.Count()); 
} 

dữ liệu của tôi vì nó đã được thông qua trên mạng:

ComponentIDs:[74,445,732,351,348,347,1123,599,600,1053,350,601,602,603,332,99,877,919,349,348,347,347,349,348] 
RackInfo:Equipment Weight 

tôi thành công có được RackInfo, nếu tôi thay đổi UpdateDiagrams để mong đợi List<string> sau đó tôi nhận được một danh sách với một mục trong đó, toàn bộ chuỗi ComponentID.

Tôi đang làm gì không chính xác ở đây?

EDIT: Tôi đang làm việc theo MVC3. Tôi sẽ có thể tận dụng một số loại deserialization tự động khi đi qua bộ điều khiển của tôi, tôi chỉ không chắc chắn như thế nào.

GIẢI PHÁP: Giải pháp là để bọc đối tượng dữ liệu của tôi trong JSON.stringify, không chỉ các thành phầnID. Mặc dù tôi có thể nhận được phía máy chủ biến RackInfo mà không chuyển đổi nó thành JSON.

+0

lẽ 'componentIDs.push (parseInt (sơ đồ [index] .componentID)); '? – MiMo

Trả lời

4

Nếu bạn muốn dữ liệu đã đăng của mình ở định dạng JSON thì hãy thử một cái gì đó như thế này. MVC sau đó có thể tự động deserialise nó ở phía máy chủ.

$.ajax({ 
    url: '../PlanView/UpdateDiagrams', 
    type: 'POST', 
    contentType: 'application/json', 
    data: JSON.stringify({ 
     componentIDs: componentIDs, 
     rackInfo: $('#RackInfoSelect').val() 
    }), 
    success: function (data) { 
     console.log('success'); 
    }, 
    error: function() { 
     console.log("error"); 
    } 
}); 

(Tôi không thể kiểm tra nó vào lúc này, nhưng hy vọng sẽ được dọc theo dòng đúng ngay cả khi nó không phải là hoàn toàn lỗi miễn phí.)

+0

Điều này làm việc thẳng ra khỏi hộp giống như một nhà vô địch. Tôi tự hỏi tại sao tôi không cần phải gọi JSON.stringify. –

+0

Mã này sẽ bị ngắt khi có sự cố nào đó không được thêm vào chuỗi. Bạn nên khử trùng TẤT CẢ các đầu vào của bạn và phân tích các giá trị của bạn thành int thay vì dựa vào các quy trình tự động không thành công khi bạn mong đợi chúng đến, cuối cùng. Và, nó làm cho ứng dụng của bạn kém an toàn hơn. Tất cả điều này để tránh một dòng mã? Mã cho chất lượng! – frenchie

1

Bạn đang gửi một chuỗi chứa danh sách các chuỗi. Khi nó đến máy chủ, chuỗi cần phải được deserialized.

[CompressionFilterAttribute] 
public JsonResult UpdateDiagrams(string ListcomponentIDs, string rackInfo) 
{ 
    List<int> componentIDs = (from string s in ListcomponentIDs.Split(',') 
          select Convert.ToInt32(s)).ToList<int>(); 
} 

Tôi đã thay đổi tham số thành chuỗi. Khi bạn đã có nó như là một danh sách của int, nó là một danh sách trống kể từ khi bạn không đi qua một danh sách các ints.

Ngoài ra, trong JS, bạn không cần phải serialize mảng, chỉ cần gọi ToString vào nó:

data: { ComponentIDs: componentIDs.toString() ... 

Vì vậy mà các dữ liệu không bao gồm dấu ngoặc [].

Hãy cho tôi biết cách hoạt động của tính năng này.

+0

Làm thế nào tôi có thể vượt qua một danh sách các int mà không cần phải được/rõ ràng/deserialized, sau đó? Tôi biết nó có thể được thực hiện - Tôi đã thấy các ví dụ về nó được thực hiện với các đối tượng phức tạp hơn ints. –

+0

Toàn bộ điểm của json IS để tuần tự hóa/deserialize dữ liệu. Xem ở trên, tôi đã đơn giản hóa mã một chút. – frenchie

+0

Và điều tôi đang nói là MVC phải làm điều này cho tôi. Xem này: http://uliasz.com/2010/07/passing-list-as-parameter-from-ajax-request-to-mvc-controller/ –

0

Tôi chưa thể thử nghiệm nó với ASP.NET MVC, nhưng nếu bạn loại bỏ JSON.stringify thì mọi thứ sẽ hoạt động chính xác. Đây là dữ liệu mẫu mà không JSON.stringify:

  • ComponentIDs []: 10
  • ComponentIDs []: 20
  • ComponentIDs []: 30
  • RackInfo: Thiết bị Trọng lượng

Đó là cách bình thường mà một mảng được đăng lên máy chủ.

Với JSON.stringify:

  • ComponentIDs: [10,20,30]
  • RackInfo: Rackinfo

Các cuộc gọi đến JSON.stringify chuyển đổi mảng chuỗi "[ 10, 20, 30] "vì vậy bạn đang đăng chuỗi lên bộ điều khiển.

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