2012-04-04 3 views
16

Я изо всех сил пытался найти решение этой проблемы.Post Array как контроллер JSON для MVC

В моем коде я создаю массив объекта;

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

Теперь я хочу, чтобы опубликовать эти данные в контроллер MVC, так что я думаю, что было бы, что тип данных в контроллере будет List<Mark> Marks или массив знаков.

Чтобы отправить данные, я попробовал;

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

ИЛИ

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

Второй способ, при взгляде на данные размещены, выглядит следующим образом

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 

Но я не знаю, как перевести это в строго типизированный объект в контроллере?

Мой контроллер выглядит следующим образом;

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

Класс My Mark выглядит следующим образом;

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

Я прочитал другие подобные проблемы, о создании пользовательских JsonFilterAttribute, или используя System.Web.Script.Serialization.JavaScriptSerializer класс, но я не могу получить что-нибудь работать

Есть ли что-то очевидно, я здесь отсутствует? Неужели я неправильно понял DataType в контроллере? Как преобразовать эти данные в строго типизированный объект?

Большое спасибо

+0

Как выглядит ваш Mark-класс в MVC? – Pbirkoff

+0

@Pbirkoff Я уточнил вопрос с классом –

+1

, этот вопрос, особенно первый ответ: http://stackoverflow.com/questions/4789481/post-an-array-of-objects-via-json-to-asp -net-mvc3 – Pbirkoff

ответ

14

$.post() не позволяет установить тип содержимого вашего вызова AJAX - вы могли бы найти (если вы используете Фидлер), что ваша строка Json посылается с типом содержимого «приложения/x-www-form-urlencoded "(значение по умолчанию), которое затем приводит к тому, что Asp.Net MVC неправильно интерпретирует ваш пакет данных.

Вместо этого вы можете использовать $.ajax() и установить тип контента в «application/json»?

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

+0

А, ты избил меня до этого, имел ту же идею – Pbirkoff

+1

Спасибо! После всей этой головной боли я знал, что это будет что-то простое! изменил мой код на использование '$ .ajax()' также, передал данные через 'JSON.stringify ($ marks)' –

+0

Большое спасибо. Это был тип контента в моем случае. – Jelling

13

@SteveHobbs имеет правильный ответ здесь. С другой стороны, вы должны указать JSON.stringify полезную нагрузку JavaScript, как и вы. Если вы сделаете это другим способом, вы получите исключение, сообщив что-то вроде «Недопустимый примитив JSON» при десериализации входящих данных.

Вот полное решение для вашего образца:

$.ajax({ 

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

Этот код фиксированная моя проблема:

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 действие:

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) { 



     } 
    }); 

Внесите необходимые изменения для своего сценария и наслаждайтесь! :)

+0

этот код только сообщение json object не массив объектов – mzonerz

Смежные вопросы