2012-04-11 51 views
8

Tôi có vấn đề sau:MVC 3 AJAX Post, Danh sách đầy các đối tượng, nhưng các thuộc tính đối tượng là trống

Khi bấm nút I POST một số dữ liệu đến máy chủ. điều khiển hành động của tôi trông như thế này:

public ActionResult Accept(List<MyViewModel> entries) 
{ 
    //here entries HAS 2 MyViewModel-Instances in it. 
    //The entries are not null, but the values of the instances are! 
    //entries[0].ParamA is null 
} 

Trường hợp MyViewModel trông như thế này:

public class MyViewModel 
{ 
    public string ParamA { get; set; } 
    public string ParamB { get; set; } 
} 

Và AJAX-Gọi là follwing:

var myEntries = { entries: [{ ParamA: "A", ParamB: "B" }, { ParamA: "C", ParamB: "D" }] }; 

$.ajax({ 
    type: 'POST', 
    url: url, 
    cache: false, 
    data: myEntries, 
    dataType: 'text' }); 

gì tôi đã cố gắng phải làm:

  • Thay đổi datatype để 'json'
  • sử dụng: truyền thống: true
  • thử var myEntries = JSON.stringify (...);
  • đã thử var myEntries = {entries: [JSON.stringify ({...}), JSON.stringify ({...})]};
  • giống như trên, nhưng với jQuery.param (..., true);
  • Sử dụng IEnumerable hoặc MyViewModel [] thay vì danh sách.
  • BẤT K combination sự kết hợp nào ở trên

Tôi đang làm gì sai ở đây?

Cảm ơn bạn rất, rất nhiều trước vì đã giúp tôi!

EDIT

của tôi (Razor) View là không thú vị tại thời điểm này vì nó không có gì để làm với bất cứ điều gì. Tôi KHÔNG sử dụng bất kỳ phương thức HTML.TextBoxFor (hoặc tương tự) nào để điền vào biến myEntries. Nó thực sự được điền động (vì có nhiều điều kiện). Vì lợi ích của câu hỏi (và thử nghiệm của riêng tôi) tôi đã mã hóa cứng biến đó. :)

+0

Bạn có thể gửi mã số (Razor) xem của bạn? –

+0

Chế độ xem của tôi không có gì thú vị trong đó. Tôi đã giải thích nó trong câu hỏi của mình. Xem phần EDIT – Shion

+0

Tôi có câu trả lời! Tôi sẽ đăng bài sớm nhất có thể (phải đợi 8 giờ ...) – Shion

Trả lời

12

Với câu trả lời của bạn và việc sử dụng các phương pháp JSON.stringify nó làm việc cho tôi

var myEntries = { entries: [{ ParamA: "A", ParamB: "B" }, 
          { ParamA: "C", ParamB: "D" }] }; 

$.ajax({ 
     type: 'POST', 
     url: '/{controller}/{action}', 
     cache: false, 
     data: JSON.stringify(myEntries), 
     dataType: 'json', 
     contentType: 'application/json; charset=utf-8' 
    }); 
+0

Có vẻ như tôi quên nói rằng tôi đã sử dụng JSON.stringify quá. Cảm ơn bạn đã chỉ ra điều đó. – Shion

+0

Cảm ơn, tôi đã có cùng một vấn đề trong danh sách của tôi đang được phổ biến nhưng tất cả tài sản của họ đều trống. Tôi đã sử dụng $ .Post (..) mà tôi nghĩ sẽ chỉ là một wrapper quanh $ .ajax (type: 'POST', ...), nhưng phải có một số khác biệt khi sử dụng ví dụ $ .ajax ở trên hoạt động tuyệt vời . –

+0

Tôi chỉ muốn nhấn mạnh, việc thiết lập contentType thành 'application/json' là rất quan trọng. Trong trường hợp của tôi nó chỉ không làm việc mà không có điều này! –

5

Tôi đã nhận được câu trả lời!

jQuery đôi lúc có thể gây nhầm lẫn.

dataType là tham số chỉ định những gì bạn muốn nhận được BACK từ máy chủ. contentType là paremeter chỉ định những gì bạn gửi đến máy chủ.

Vì vậy, từ ví dụ trên, nó hoạt động nếu bạn thêm:

contentType: 'application/json; charset = utf-8 ',

trong cuộc gọi AJAX.

1

Chỉ cần để khen câu trả lời về cách tạo danh sách đó sẽ là bài trở lại với bộ điều khiển. Đó là bởi vì bạn không cần phải bọc mảng với tên của danh sách.Nó trông xấu xí và không thể quản lý được bằng các chức năng dựng sẵn. Ví dụ này là ở đây để hiển thị cách đăng lại JSON mà MVC sẽ hiểu và diễn giải như một Danh sách. (Nhưng ngay cả khi Array được gói nó vẫn hoạt động nhưng đó là nội dung tĩnh và khó quản lý)

Ví dụ này sử dụng plugin có thể sắp xếp của jQuery. Tôi muốn đăng toàn bộ mô hình danh sách trở lại với các chỉ mục đặt hàng mới để lưu trong cơ sở dữ liệu.

update: function (event, ui) { 

img = { key: 0, order: 0, url: '' }; //Single image model on server 
imgs = new Array(); //An array to hold the image models. 

//Iterate through all the List Items and build my model based on the data. 
$('#UploaderThumbnails li').each(function (e) { 
     img.key = $(this).data('key'); //Primary Key 
     img.order = $(this).index(); //Order index 
     imgs.push(img); //put into "list" array 
}); 

//And what is in the answer - this works really great 
$.ajax({ 
    url: '/Image/UpdateOrder', 
    data: JSON.stringify(imgs), 
    type: 'POST', 
    contentType: 'application/json; charset=utf-8' 
    }); 

} 

Và điều khiển MVC của tôi cũng đơn giản như ...

[HttpPost] 
    public ActionResult UpdateOrder(List<Models.Image> images) 
    { 
    //Images at this point is a proper C# List of Images! :) Easy! 

     return Content(""); 
    } 
+0

Điều này làm việc cho tôi. Và chỉ để nhắc lại, đừng quên rằng ứng dụng/kiểu nội dung json! – K0D4

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