使用 KnockoutJS 在 Web API 2 中序列化集合困难



我有一个 knockoutjs 网页在 VB .net Web API 上发帖。 出于某种原因,我的集合总是在控制器上不显示任何内容。

在帖子的网页上,这里是我的数据。

 data: ko.toJSON({
                        ShpmntCntrlNbr: self.ShpmntCntrlNbr,
                        MstrBillNbr: self.MstrBillNbr,
                        accesorialChangesHaveBeenMade:      self.accesorialChangesHaveBeenMade,
                        DB2ACTCollection: actCollection
                    }),

这在控制台(Chrome 开发者工具)中显示如下。

{
  "ShpmntCntrlNbr":"11019813",
  "MstrBillNbr":"          ",
  "accesorialChangesHaveBeenMade":true,
  "DB2ACTCollection":[
                      {"ShpmntCntrlNbr":"11019813"}
                     ]
 }

这是.net VB控制器

Public Function Post(data As VMFreightReleaseSaveDB2ChangesInput) As IHttpActionResult 
        Return Ok()
    End Function

不幸的是,当我在这里放置停止标志并检查数据时。我得到

DB2ACTCollection  Nothing
MstrBillNbr "         "
ShpmntCntrlNbr "1101983"
accesorialChangesHaveBeenMade True

不知道为什么我的DBACTCollection显示为什么都没有。 有什么想法吗?

这是课程。

Public Class VMFreightReleaseSaveDB2ChangesInput
    Public Property ShpmntCntrlNbr() As String
        Get
            Return m_ShpmntCntrlNbr
        End Get
        Set(value As String)
            m_ShpmntCntrlNbr = value
        End Set
    End Property
    Private m_ShpmntCntrlNbr As String
    Public Property MstrBillNbr() As String
        Get
            Return m_MstrBillNbr
        End Get
        Set(value As String)
            m_MstrBillNbr = value
        End Set
    End Property
    Private m_MstrBillNbr As String
    Public Property accesorialChangesHaveBeenMade() As Boolean
        Get
            Return m_accesorialChangesHaveBeenMade
        End Get
        Set(value As Boolean)
            m_accesorialChangesHaveBeenMade = value
        End Set
    End Property
    Private m_accesorialChangesHaveBeenMade
    Public Property DB2ACTCollection() As List(Of DB2_ACT2)
        Get
            Return m_DB2ACTCollection
        End Get
        Set(value As List(Of DB2_ACT2))
            value = m_DB2ACTCollection
        End Set
    End Property
    Private m_DB2ACTCollection As List(Of DB2_ACT2)

Public Class DB2_ACT2
    Public Property ShpmntCntrlNbr() As String
        Get
            Return m_ShpmntCntrlNbr
        End Get
        Set(value As String)
            m_ShpmntCntrlNbr = value
        End Set
    End Property
    Private m_ShpmntCntrlNbr As String
End Class
到目前为止,这只是

我的解决方案,对它并不满意,但它似乎正在工作。 而不是数据作为VMFreightReleaseSaveDB2ChangesInput我有数据作为JToken。 然后我只是循环遍历它,尽管我仍然不知道为什么本机 .NET Web API 序列化程序不这样做。

 Dim inner As JArray = data("DB2ACTCollection")
        Dim ACTCollection = New List(Of DB2_ACT)
        For Each item As JObject In inner
            Dim ACT As New DB2_ACT
            ACT.ShpmntCntrlNbr = item("ShpmntCntrlNbr")
            ACTCollection.Add(ACT)
        Next

基于 JSON 并查看模型是 POCO,尝试使用自动属性并将 DB2ACTCollection 作为数组,看看它是否正确反序列化

Public Class DB2_ACT2
    Public Property ShpmntCntrlNbr As String
End Class
Public Class VMFreightReleaseSaveDB2ChangesInput
    Public Property ShpmntCntrlNbr As String
    Public Property MstrBillNbr As String
    Public Property accesorialChangesHaveBeenMade As Boolean
    Public Property DB2ACTCollection As DB2_ACT2()
End Class

最新更新