将数组作为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 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 Marks){ // handle here }
我的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完全错了吗? 如何将此数据转换为强类型对象?
非常感谢
$.post()
不允许您设置AJAX调用的内容类型 – 您可能会发现(如果您使用Fiddler)您的Json字符串正在使用内容类型“application / x-www-form”发送-urlencoded“(默认设置),然后导致Asp.Net MVC错误地解释您的数据包。
你可以尝试使用$.ajax()
,并将内容类型设置为“application / json”吗?
@SteveHobbs在这里有正确的答案。 另一方面,你应该像你一样JSON.stringify
JavaScript有效负载。 如果以另一种方式执行此操作,则会在反序列化进入的数据时收到类似“无效JSON原语”的exception。
以下是您的样本的完整解决方案:
$.ajax({ url: '/home/index', type: 'POST', data: JSON.stringify($marks), dataType: 'json', contentType: 'application/json', success: function (data, textStatus, jqXHR) { console.log(data); } });
这段代码解决了我的问题:
C#类:
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 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) { } });
进行场景所需的更改并享受! 🙂