将数组作为 JSON 发布到 MVC 控制器

Posted

技术标签:

【中文标题】将数组作为 JSON 发布到 MVC 控制器【英文标题】:Post Array as JSON to MVC Controller 【发布时间】:2012-04-17 23:03:10 【问题描述】:

我一直在努力寻找解决这个问题的方法。

在我的代码中,我正在构建一个对象数组;

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<Mark> 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<Mark> 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 弄错了吗?如何将发布的这些数据转换为强类型对象?

非常感谢

【问题讨论】:

你在 MVC 中的 Mark-class 是什么样子的? @Pbirkoff 我已经用班级更新了问题 查看这个问题,尤其是第一个答案:***.com/questions/4789481/… 【参考方案1】:

$.post() 不允许您设置 AJAX 调用的内容类型 - 您可能会发现(如果您使用 Fiddler)您的 Json 字符串正在发送的内容类型为“application/x-www- form-urlencoded”(默认设置),这会导致 Asp.Net MVC 错误地解释您的数据包。

您可以尝试改用$.ajax(),并将内容类型设置为“application/json”吗?

http://api.jquery.com/jQuery.ajax/

【讨论】:

啊,你打败了我,和我有同样的想法 谢谢!在所有的头痛之后,我知道这将是一件简单的事情!将我的代码也更改为使用$.ajax(),将数据作为JSON.stringify($marks) 非常感谢。就我而言,这是内容类型。【参考方案2】:

@SteveHobbs 在这里有正确的答案。另一方面,您应该像您一样JSON.stringify JavaScript 有效负载。如果以另一种方式执行此操作,则会在反序列化传入的数据时收到一个异常,告诉您“无效的 JSON 原语”

这是您的示例的完整解决方案:

$.ajax(

    url: '/home/index',
    type: 'POST',
    data: JSON.stringify($marks),
    dataType: 'json',
    contentType: 'application/json',
    success: function (data, textStatus, jqXHR) 
        console.log(data);
    
);

【讨论】:

【参考方案3】:

这段代码解决了我的问题:

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<MediaAccountContent> 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) 



        
    );

根据场景进行所需的更改并尽情享受! :)

【讨论】:

这段代码只发布json对象而不是对象数组

以上是关于将数组作为 JSON 发布到 MVC 控制器的主要内容,如果未能解决你的问题,请参考以下文章

通过 JSON 将数组发送到 MVC 控制器?

如何将带有 JSON、jQuery 的复杂对象数组发布到 ASP.NET MVC 控制器?

将 JSON 从视图发送到控制器 ASP.NET MVC 会给出空值

将 JSON 字符串发送到 MVC 控制器失败

如何将两个数组作为 POST 请求参数从 AJAX 发送到 MVC 控制器(ASP .NET Core 3.1 剃须刀)?

在 Spring MVC 中使用 curl 将字符串值数组作为请求正文发布