如何将对象类型的 json 数组传递给 MVC 控制器类

Posted

技术标签:

【中文标题】如何将对象类型的 json 数组传递给 MVC 控制器类【英文标题】:How to pass a json array of type object to MVC controller class 【发布时间】:2019-06-23 12:20:30 【问题描述】:

我正在尝试将 JSON 数组传递到我的控制器。我希望能够将数据从 JSON 数组发布到数据库,该数组通过客户端的 javascript 填充并传递给控制器​​。但是,它没有在控制器中接收任何内容。我的控制器收到一个空值作为参数。

以下是我的控制器:

  [HttpPost]
    [SiteAuthorize]
    public ActionResult SaveDashboard(List<Dashboard> dashboards)
    
        try
        

            string result = "";
            return Json(new  Result = result, Message = "" , JsonRequestBehavior.AllowGet);
        
        catch (Exception ex)
        
            return Json(new  Result = "Error", Message = ex.Message , JsonRequestBehavior.AllowGet);
        
    

以下是我的javascript:

    var dashboards = 
    "DashboardName": '',
    "Width": '',
    "Height": '',
       "DashboardCell": [
           
               "DashCellId": '',
               "x": '',
               "y": '',
               "DashWidth": '',
               "DashHeight": '',
               "colspan": '',
               "rowspan": '',
               "Active": '',
               "CellValue": '',
               "cellClass": '',
               "previousElementSibling": ''
           
        ]
    ;

    var tablestructure = $("#TableStructure").val();
    var savename = document.getElementById("namedash").value;

    var table = document.getElementById("table");
    var width = table.clientWidth;
    var height = table.clientHeight;
    var DashboardCell = [];
    dashboards.DashboardName = savename;
    dashboards.Width = width;
    dashboards.Height = height;
    for (var i = 0, row; row = table.rows[i]; i++)
    

        //iterate through rows
        //rows would be accessed using the "row" variable assigned in the for loop
        for (var j = 0, col; col = row.cells[j]; j++)
        
            for (var x = 0; x < col.attributes.length; x++)
            
                if (col.attributes[x].localName == "colspan") 
                    var colspan = col.attributes[x].value;
                
                else if (col.attributes[x].localName == "rowspan") 
                    var rowspan = col.attributes[x].value;
                
                else if (col.attributes[x].localName == "class")
                
                    var cellClass = col.attributes[x].value;
                
            

            var res = col.id.split(", ");
            var x = parseInt(res[0]);
            var y = parseInt(res[1]);
            var DashHeight = col.clientHeight;
            var DashWidth = col.clientWidth;
            if (j > 0) 
                var previousElementSibling = col.previousElementSibling.id;
            
            else 
                var previousElementSibling = '';
            
            var DashCellID = col.id;
            var CellValue = col.innerText;
            var DashCell =  DashCellId: DashCellID, x: x, y: y, DashWidth: DashWidth, DashHeight: DashHeight, colspan: colspan, rowspan: rowspan, Active: 1, CellValue: CellValue, cellClass: cellClass, previousElementSibling: previousElementSibling ;
            DashboardCell.push(DashCell);

            //iterate through columns
            //columns would be accessed using the "col" variable assigned in the for loop
        
    
    dashboards.DashboardCell = DashboardCell;

    $.ajax(
        url: '/KPIReportAdmin/SaveDashboard',
        type: "POST",
        dataType: "json",
        contentType: "application/json",
        data:  dashboards: JSON.stringify(dashboards) ,
        success: function (result)
        

        ,
        error: function (result) 
            alert("Failed");
        

    );

以下是我的课:

public class DashboardCell

    public int Width  get; set; 
    public int Height  get; set; 
    public bool Active  get; set; 
    public int colspan  get; set; 
    public int rowspan  get; set; 
    public int x  get; set; 
    public int y  get; set; 
    public string CellValue  get; set; 
    public string DashCellId  get; set; 
    public string cellClass  get; set; 
    public int previousElementSibling  get; set; 


public class Dashboard

    public string Name  get; set; 
    public int Height  get; set; 
    public int Width  get; set; 
    public int UserID  get; set; 
    public List<DashboardCell> DashboardCell  get; set; 

我希望在 SaveDashboard 中收到仪表板列表,但我得到了 null

【问题讨论】:

您的变量名或数据类型可能不匹配。请检查一次。 您将dashboards 作为字符串发送,尝试发送对象本身(无字符串化) 我在尝试访问控制器时收到以下网络错误:Invalid JSON primitive: object.。是什么原因造成的? 【参考方案1】:

使用 AJAX 将 JS 对象作为List&lt;T&gt; 集合传递有两种方式:

1) 将JSON.stringify与对象本身放在一起并设置traditional: true选项,只应设置单个参数:

$.ajax(
    url: '/KPIReportAdmin/SaveDashboard',
    type: "POST",
    dataType: "json",
    contentType: "application/json",
    traditional: true,
    data: JSON.stringify(dashboards),
    success: function (result)
    

    ,
    error: function (result) 
        alert("Failed");
    
);

2) 通过使用带有traditional: true 选项的$.param() 函数传递原始对象而不对其进行字符串化:

$.ajax(
    url: '/KPIReportAdmin/SaveDashboard',
    type: "POST",
    dataType: "json",
    data: $.param( dashboards: dashboards , true),
    success: function (result)
    

    ,
    error: function (result) 
        alert("Failed");
    
);

发生异常是因为您传递了一个 JS 对象,该对象包含带有 data: dashboards: JSON.stringify(dashboards) 的 JSON 字符串,并且控制器操作方法不知道如何将其解析为 List&lt;T&gt; 集合对象作为参数。

相关问题:

Invalid JSON primitive: object

【讨论】:

【参考方案2】:

我看到问题出在您的 JSON 文件中。在您的 JSON 中,您有一个名为“DashboardName”的属性,在 API 中它称为“名称”。高度、宽度、用户 ID 是 INT,但您将字符串传递给它。

尝试如下更改您的值

var dashboards = 
    "Name": "",
    "Width": 0,
    "Height": 0,
    "UserID": 0,
    "DashboardCell": [
    
      "Width": 0,
      "Height": 0,
      "Active": false,
      "colspan": 0,
      "rowspan": 0,
      "x": 0,
      "y": 0,
      "CellValue: "",
      "DashCellId: "",
      "cellClass: "",
      "previousElementSibling": 0
    
  ]
;

【讨论】:

【参考方案3】:

我还发现,在我的控制器中,我正在通过一个仪表板列表,我只需要添加Dashboard dashboards,因为该列表位于仪表板类中。

还按照 Tetsuya Yamamoto 的建议进行操作。

谢谢大家!

【讨论】:

以上是关于如何将对象类型的 json 数组传递给 MVC 控制器类的主要内容,如果未能解决你的问题,请参考以下文章

将JSON数组从javascript传递给spring mvc控制器

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

通过 GET 将 JSON 数组传递给 MVC Web API

如何将 JSON 对象内的 JSON 数组传递给 jQuery 自动完成

使用 jquery.load 将对象数组传递给 MVC 3

java如何接收ajax传递的json类型的数据