Публикация данных JSON в ASP.NET MVC

Я пытаюсь получить список элементов строки на веб-страницу с помощью JSON, который затем будет обработан и отправлен обратно на сервер с помощью запроса ajax используя ту же самую структуру JSON, которая была получена (за исключением того, что значения полей были изменены).

Получение данных с сервера очень просто, манипуляции еще проще! но отправка этих данных JSON обратно на сервер для экономии ... времени самоубийства! ПОЖАЛУЙСТА, может кто-нибудь помочь!

Javascript

var lineitems;

// get data from server
$.ajax({
    url: '/Controller/GetData/',
    success: function(data){
        lineitems = data;
    }
});

// post data to server
$.ajax({
    url: '/Controller/SaveData/',
    data: { incoming: lineitems }
});

C # - Объекты

public class LineItem{
    public string reference;
    public int quantity;
    public decimal amount;
}

C # - Контроллер

public JsonResult GetData()
{
    IEnumerable<LineItem> lineItems = ... ; // a whole bunch of line items
    return Json(lineItems);
}

public JsonResult SaveData(IEnumerable<LineItem> incoming){
    foreach(LineItem item in incoming){
        // save some stuff
    }
    return Json(new { success = true, message = "Some message" });
}

Данные поступают на сервер как se риализованные почтовые данные. Автоматическое связывание модели пытается связать IEnumerable входящего и неожиданно получает в результате IEnumerable с правильным числом LineItems - он просто не заполняет их данными .

РЕШЕНИЕ

Используя ответы из ряда источников, в первую очередь djch в другом сообщении stackoverflow и BeRecursive ниже, я решил свою проблему, используя два основных метода.

Серверная сторона

Для десериализатора ниже требуется ссылка на System.Runtime.Serialization и с использованием System.Runtime.Serialization.Json

    private T Deserialise<T>(string json)
    {
        using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
        {
            var serialiser = new DataContractJsonSerializer(typeof(T));
            return (T)serialiser.ReadObject(ms);
        }
    }

    public void Action(int id, string items){
        IEnumerable<LineItem> lineitems = Deserialise<IEnumerable<LineItem>>(items);
        // do whatever needs to be done - create, update, delete etc.
    }

Клиентская сторона

Он использует json.org метод stringify, доступный в этой зависимости https://github.com/douglascrockford/JSON-js/blob/master/json2.js (который составляет 2,5 КБ при минификации)

        $.ajax({
            type: 'POST',
            url: '/Controller/Action',
            data: { 'items': JSON.stringify(lineItems), 'id': documentId }
        });
57
задан Jimbo 16 November 2010 в 06:33
поделиться