Я пытаюсь получить список позиций на веб-странице с помощью 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 }
});
С# - Объекты
public class LineItem{
public string reference;
public int quantity;
public decimal amount;
}
С# - контроллер
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" });
}
Данные поступают на сервер в виде последовательных данных. Автоматическое связующее устройство пытается привязать IEnumerable<LineItem> incoming
и, как неожиданно, получает в результате IEnumerable
правильное количество LineItems
- оно просто не заполняет их данными.
Решение
Используя ответы от нескольких источников, в первую очередь djch
на другой записи stackoverflow и BeRecursive
ниже, я решил свою проблему, используя два основных метода.
Сторона сервера
Для десериализатора ниже требуется ссылка на System.Runtime.Serialization
и using 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.
}
Клиентская сторона
Он использует метод jonn.org stringify, доступный в этом dependecy 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 }
});