我正在尝试使用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# - Objects
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" });
}
数据作为序列化的post数据到达服务器。自动化的模型绑定器试图绑定IEnumerable<LineItem> incoming
,令人惊讶的是,结果得到的IEnumerable
具有正确的LineItems
数量-它只是没有用数据填充它们。
解决方案
使用来自许多来源的答案,主要是另一个stackoverflow帖子上的djch
和下面的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.
}
客户端
它使用了json.org的stringify方法,可以在这个依赖的https://github.com/douglascrockford/JSON-js/blob/master/json2.js中找到(缩小后是2.5kb )
$.ajax({
type: 'POST',
url: '/Controller/Action',
data: { 'items': JSON.stringify(lineItems), 'id': documentId }
});
https://stackoverflow.com/questions/4164114
复制相似问题