Post Array как контроллер JSON для MVC - программирование
Подтвердить что ты не робот

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 или массив 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 в контроллере? Как преобразовать эти данные в строго типизированный объект?

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

4b9b3361

Ответ 1

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

Можете ли вы попробовать использовать $.ajax() вместо этого и установить тип содержимого в "application/json"?

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

Ответ 2

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

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

$.ajax({

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

Ответ 3

Этот код исправил мою проблему:

Классы С#:

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



        }
    });

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