繁体   English   中英

使用JSON将对象数组传递给MVC控制器

[英]Passing an array of objects to mvc controller using json

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

我正在接收BlockEntrances数据(数组大小),但没有收到BlockEntranceButtons数据。

当我相信“ BlockEntranceButtons”应该出现在Json字符串中时,它不会出现。

有人能指出我正确的方向吗?

编辑:

将step3更改为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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM