2011-10-28 25 views
14

Khi tôi gửi một danh sách các int với jQuery như thế này:Làm thế nào để gửi một danh sách các int với jQuery để ASP.net MVC Mặc định Mẫu Binder

$.ajax('@Url.Action("Execute")', { 
    type: 'POST', 
    data: { 
     pkList: [1,2,3] 
    } 
}); 

Sau đó, jQuery sẽ làm thay đổi đối tượng pkList và gửi nó bằng cách gửi như thế này:

pkList[]:1 
pkList[]:2 
pkList[]:3 

nào sẽ là tốt nếu máy chủ là PHP nhưng tôi sử dụng Asp.NET MVC3 và cố gắng để có được những giá trị này với mô hình mặc định binder:

public ActionResult Execute(ICollection<int> pkList) 

Nhưng pkList luôn luôn là null, có vẻ như các mô hình mặc định chất kết dính không thể ràng buộc nó.

Làm cách nào để giải quyết vấn đề này một cách chính xác?


THÊMSOLUTION

tôi đã sử dụng giải pháp từ Darin Dimitrov với thiết lập các tùy chọn trong traditional jQuery:

$.ajax('@Url.Action("Execute")', { 
    type: 'POST', 
    traditional: true, 
    data: { 
     pkList: [1,2,3] 
    } 
}); 

Bây giờ jQuery không thêm [] các thông số và chúng được gửi như sau:

pkList:1 
pkList:2 
pkList:3 

Và trình kết nối mô hình mặc định MVC nhận giá trị chính xác.

Hy vọng điều này sẽ giúp ai đó.

Trả lời

16

Bạn có thể sử dụng một yêu cầu JSON vì nó sẽ cho phép bạn gửi bất kỳ đối tượng phức tạp mà bạn muốn:

$.ajax({ 
    url: '@Url.Action("Execute")', 
    type: 'POST', 
    contentType: 'application/json; charset=utf-8', 
    data: JSON.stringify({ pkList: [1, 2, 3] }), // you could throw any javascript object you like here 
    success: function(result) { 
     // process the results 
    } 
}); 

Phương pháp JSON.stringify được xây dựng trong các trình duyệt hiện đại và nếu bạn muốn hỗ trợ di sản các trình duyệt bạn có thể bao gồm tập lệnh json2.js vào trang web của mình.

Và để trả lời câu hỏi của bạn, bạn có thể sử dụng thiết lập các tùy chọn traditional: true để chỉ cho jQuery để dự phòng để truyền thống serialization các thông số từ này đã thay đổi trong jQuery 1.4 và nếu bạn đang sử dụng một phiên bản sau này bạn có khả năng chuyển đổi trở lại các thông số cách là serialized:

$.ajax({ 
    url: '@Url.Action("Execute")', 
    type: 'POST', 
    data: { 
     pkList: [1, 2, 3] 
    }, 
    traditional: true 
}); 
+0

Sẽ không có người mẫu binder mặc định cũng xử lý danh sách phân tách bằng dấu phẩy của dữ liệu được mã hóa biểu mẫu? Một cái gì đó như 'dữ liệu: {pkList: '1,2,3'}'? Nhưng nếu không tôi sử dụng phương pháp này cho tất cả các serialization mô hình của tôi, con đường để đi cho các đối tượng phức tạp hơn trong JS. –

+0

@PaulT., Không, trình kết nối mô hình mặc định sẽ không chấp nhận 'dữ liệu: {pkList: '1,2,3'}'. Nếu bạn muốn xử lý các yêu cầu như vậy, một bộ mô hình tùy chỉnh sẽ là cần thiết, nơi bạn sẽ cần phải phân chia các mục và sau đó phân tích mỗi một trở lại một số nguyên.Sẽ không cần thiết phải trải qua nỗi đau này nếu mục đích là gửi một mảng các số nguyên đến một hành động điều khiển. –

+0

ah vâng tôi thấy ý của bạn bây giờ, chỉ cần kiểm tra nó, mặc dù nó là lạ bởi vì nếu bạn có hai đầu vào với cùng tên nó thực sự deserialize đó vào một danh sách, chỉ cần serialization của jQuery để hình thành dữ liệu bài không xử lý đó (tức là pkList = 1 & pkList = 2 works) –

0

Phil Haack có một bài viết tuyệt vời trên blog của mình nên chỉ cho bạn ở bên phải trực tiếp.

Model Binding To A List

+0

Thanks mate, tôi đọc mà trước đó, nhưng nó không giúp tôi, vấn đề là nhiều hơn ở phía bên jQuery :) – Marc

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