2012-04-04 43 views
16

Tôi đã phải vật lộn để tìm ra giải pháp cho vấn đề này.Đăng mảng dưới dạng JSON tới Bộ điều khiển MVC

Trong mã của tôi, tôi đang xây dựng một mảng của một đối tượng;

var $marks = []; 

var mark = function (x, y, counter){ 
    this.x = x; 
    this.y = y; 
    this.counter = counter; 
} 

$marks.push(new mark(1, 2, 0)); 
$marks.push(new mark(1, 2, 1)); 
$marks.push(new mark(1, 2, 2)); 

Bây giờ tôi muốn gửi dữ liệu này để một bộ điều khiển MVC, vì vậy tôi sẽ nghĩ rằng kiểu dữ liệu trong bộ điều khiển sẽ là một List<Mark> Marks hoặc một mảng của Marks.

Để đăng dữ liệu, tôi đã thử;

var json = JSON.stringify($marks); 
$.post('url', json).done(function(data){ /* handle */ }); 

HOẶC

var json = { Marks: $marks }; 
$.post('url', json).done(function(data){ /* handle */ }); 

Cách thứ hai, khi nhìn vào các dữ liệu đăng, trông như thế này

Marks[0][x]: 1 
Marks[0][y]: 2 
Marks[0][counter]: 0 
Marks[0][x]: 1 
Marks[0][y]: 2 
Marks[0][counter]: 1 
Marks[0][x]: 1 
Marks[0][y]: 2 
Marks[0][counter]: 2 

Nhưng tôi không chắc chắn làm thế nào để dịch này vào một đối tượng mạnh mẽ gõ trong bộ điều khiển?

Trình điều khiển của tôi trông như thế này;

[HttpPost] 
public ActionResult JsonSaveMarks(List<Mark> Marks){ 
    // handle here 
} 

Lớp Mark của tôi trông như thế này;

public class Mark{ 
    public string x { get; set; } 
    public string y { get; set; } 
    public string counter { get; set; } 
} 

Tôi đã đọc qua những vấn đề tương tự khác về việc tạo ra một phong tục JsonFilterAttribute, hoặc bằng cách sử dụng lớp System.Web.Script.Serialization.JavaScriptSerializer, nhưng tôi không thể nhận được bất cứ điều gì để làm việc

Có một cái gì đó rõ ràng tôi đang thiếu ở đây? Tôi đã nhận DataType trong bộ điều khiển hoàn toàn sai? Làm cách nào để chuyển đổi dữ liệu này được đăng thành đối tượng được nhập mạnh?

Nhiều Cảm ơn

+0

Lớp Mark của bạn trong MVC trông như thế nào? – Pbirkoff

+0

@Pbirkoff Tôi đã cập nhật câu hỏi với lớp học –

+1

kiểm tra câu hỏi này, đặc biệt là câu trả lời đầu tiên: http://stackoverflow.com/questions/4789481/post-an-array-of-objects-via-json-to-asp -net-mvc3 – Pbirkoff

Trả lời

14

$.post() không cho phép bạn thiết lập kiểu nội dung của cuộc gọi AJAX của bạn - bạn có thể tìm thấy (nếu bạn sử dụng Fiddler) rằng chuỗi Json của bạn đang được gửi đi với một content-type của ứng dụng "/x-www-form-urlencoded "(các thiết lập mặc định) mà sau đó nguyên nhân Asp.Net MVC để giải thích sai gói dữ liệu của bạn.

Thay vào đó, bạn có thể thử sử dụng $.ajax() và đặt loại nội dung thành "application/json"?

http://api.jquery.com/jQuery.ajax/

+0

Ah, bạn đánh tôi với nó, có cùng ý tưởng – Pbirkoff

+1

Cảm ơn! Sau tất cả những đau đầu đó tôi biết nó sẽ là một cái gì đó đơn giản! đã thay đổi mã của tôi bằng cách sử dụng '$ .ajax()' cũng đã chuyển dữ liệu thông qua dưới dạng 'JSON.stringify ($ marks)' –

+0

Cảm ơn rất nhiều. Đó là loại nội dung trong trường hợp của tôi. – Jelling

13

@SteveHobbs có câu trả lời đúng ở đây. Mặt khác, bạn nên JSON.stringify tải trọng JavaScript như bạn đã làm. Nếu bạn làm điều đó theo cách khác, bạn sẽ nhận được một ngoại lệ nói điều gì đó như "Nguyên thủy JSON không hợp lệ" trong khi deserializing dữ liệu đến.

Đây là giải pháp hoàn chỉnh để mẫu của bạn:

$.ajax({ 

    url: '/home/index', 
    type: 'POST', 
    data: JSON.stringify($marks), 
    dataType: 'json', 
    contentType: 'application/json', 
    success: function (data, textStatus, jqXHR) { 
     console.log(data); 
    } 
}); 
1

Mã này cố định vấn đề của tôi:

lớp

C#:

public class MediaAccountContent 
{ 
    public Guid IdMedia { get; set; } 
    public string Value { get; set; } 

} 

public class User 
{ 
    public string Firstname { get; set; } 
    public string Lastname { get; set; } 
    public List<MediaAccountContent> MediaAccountContents { get; set; } 
} 

MVC hành động:

public ActionResult SavePlace(User user) 
{ 

    return Content("OK"); 
} 

Javascript:

var mediaAccountsJson = []; 

    for (var i = 0; i < 10; i++) 
    { 
     mediaAccountsJson.push({ 
      IdMedia: i, 
      Value: "AAA" + i 
     }); 

    } 

    var datatItem = 
    { 
     Firstname: "Test Firstname", 
     Lastname: "Test Lastname", 
     MediaAccountContents: mediaAccountsJson 
    }; 

    $.ajax({ 
     type: "POST", 
     contentType: 'application/json; charset=utf-8', 
     data: JSON.stringify(datatItem), 
     url: urlAction, 
     success: function (status) { 



     } 
    }); 

Thực hiện các thay đổi bạn cần cho kịch bản của mình và tận hưởng! :)

+0

mã này chỉ đăng đối tượng json chứ không phải mảng đối tượng – mzonerz

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