使用json传递一个对象数组给mvc控制器

Passing an array of objects to mvc controller using json

本文关键字:mvc 控制器 数组 一个对象 json 使用      更新时间:2023-09-26

我试图将Json数据模型绑定到MVC中的属性类。对象2被传递到控制器OK。对象3是列表的列表,我不确定我的数据结构在javascript中是否正确。

我正在接收BlockEntrances数据(数组的大小),但不是BlockEntranceButtons数据。

"BlockEntranceButtons"不出现在Json字符串,当我认为它应该在那里。

谁能告诉我正确的方向?编辑:

将step3 in改为2个对象。Json字符串看起来更像我想要的,但我的控制器仍然接收一个空值。

Javascript:

Step2 = {};
Step2.MainEntranceButtons = [0, 1, 2, 3, 4, 5, 6, 7, 8]
Step3 = {};
Step3.BlockEntrances = {};
Step3.BlockEntrances.BlockEntranceButtons = [];
Step3.BlockEntrances.BlockEntranceButtons[0] = [1, 2, 3, 4, 5, 6, 7, 8];
Step3.BlockEntrances.BlockEntranceButtons[1] = [8, 7, 6, 5, 4, 3, 2, 1];
Step3.BlockEntrances.BlockEntranceButtons[2] = [5, 5, 5, 5, 5, 5, 5, 5];

var StringToPost = JSON.stringify({ Step2Object: Step2, Step3Object: Step3 });
$.ajax({
        url: "/Home/CollectJson1/",
        type: 'POST',
        contentType: "application/json",
        dataType: 'html',
        data: StringToPost,
        success: function (data) {
        console.log(data);      
        }
      });

控制器:

<HttpPost>
    Function CollectJson1(ByVal Step2Object As Step2Data, ByVal Step3Object As Step3Data) As JsonResult
        Return Json(Step3Object)
    End Function

类:

Public Class Step2Data
    Public Property MainEntranceButtons As List(Of String)
End Class
Public Class Step3Data
        Public Property BlockEntrances As List(Of Step3SubData)
End Class

Public Class Step3SubData
        Public Property BlockEntranceButtons As List(Of String) 
End Class

Object3的Json数据:

{"Step3Object":{"BlockEntrances":{"BlockEntranceButtons":[[1,2,3,4,5,6,7,8],[8,7,6,5,4,3,2,1],[5,5,5,5,5,5,5,5]]}}}

数组索引没有名称,因此它不像您在问题的原始版本中期望的那样工作。如果有,你会有3个叫做BlockEntranceButtons。你如何区分它们?

你现在得到的与我认为更合适的相似:

Step3.BlockEntrances =  [  
  { EntranceID: 1, BlockEntranceButtons: [1,2,3,4,5,6,7,8] }, 
  { EntranceID: 2, BlockEntranceButtons: [8,7,6,5,4,3,2,1] }, 
  { EntranceID:3, BlockEntranceButtons: [5,5,5,5,5,5,5,5] }
];

你想做的事情与服务器端的代码结构并不匹配,在我看来,这个结构有点混乱。

如果是我,我会把所有的入口都当作相同的,只是有一个旗帜来说明它是主入口还是块入口。这样就不需要为每一种数据结构单独设置了。也许可以这样写(考虑到我不知道你的确切要求):

JS:

var Entrances =  [  
  { EntranceID: 1, BlockID: "main", EntranceButtons: [0,1,2,3,4,5,6,7,8] }, 
  { EntranceID: 2, BlockID: "A", EntranceButtons: [8,7,6,5,4,3,2,1] }, 
  { EntranceID: 3, BlockID: "A", EntranceButtons: [9,5,1,7,3,4,2,1] }, 
  { EntranceID: 4, BlockID: "B", EntranceButtons: [5,5,5,5,5,5,5,5] }
];
VB:

Public Class Entrance
  public Property EntranceID As Int
  public Property BlockID As String
  public Property EntranceButtons As Int()
End Class
<HttpPost>
Function CollectJson1(ByVal Entrances As List(Of Entrance)) As JsonResult
    Return Json(Entrances)
End Function

如果有必要的话,您可能还会使用一个名为Block的类来表示不同的Block,并带有ID和Description。