Я пытаюсь получить список позиций на веб-странице, используя 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" });
}
Данные поступают на сервер в виде сериализованных данных.Автоматическое связывание модели пытается связать 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.
}
Клиентская сторона
Используется метод stringify json.org, доступныйв этой зависимости 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 }
});