Как можно вернуть данные JSON для данных JQUERY? - PullRequest
0 голосов
/ 29 ноября 2018

Как я могу сгенерировать данные JSON для привязки таблицы данных JQUERY?

Я использую приведенный ниже код в веб-службе ASP.net (.asmx)

<WebMethod()> _
Public Function Getcdata() As String
    Dim dt As New DataTable()
    Using con As New SqlConnection(IDvar.Constr)
        Using cmd As New SqlCommand("Select * from COMPLAINTTYPE", con)

            con.Open()
            Dim da As New SqlDataAdapter(cmd)
            da.Fill(dt)
            Dim serializer As New System.Web.Script.Serialization.JavaScriptSerializer()
            Dim rows As New List(Of Dictionary(Of String, Object))()
            Dim row As Dictionary(Of String, Object)
            For Each dr As DataRow In dt.Rows
                row = New Dictionary(Of String, Object)()
                rows.Add(row)
            Next
            Context.Response.Write(serializer.Serialize(dt))

            con.Close()
            cmd.Dispose()
            dt.Clear()
        End Using
    End Using
End Function

Но это возвращаетошибка.Пожалуйста, проверьте, где я ошибаюсь

Ошибка, которую я получаю при вызове веб-метода, как показано ниже:

System.InvalidOperationException: A circular reference was detected while serializing an object of type &#39;System.Reflection.RuntimeModule&#39;.
   at System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)
   at System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)
   at System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat)

1 Ответ

0 голосов
/ 29 ноября 2018

Проблема возникла в этой строке:

Context.Response.Write(serializer.Serialize(dt))

Вы пытаетесь сериализовать экземпляр DataTable непосредственно в экземпляр JavaScriptSerializer, который принимает объекты коллекции, такие как IEnumerable или Dictionary(Of TKey, TValue).Обычно вам нужно использовать методы AsEnumerable() и [Select]() LINQ для преобразования в IEnumerable:

Dim list = dt.AsEnumerable().[Select](Function(row) New With { Key
    .id = row("COMPLAINTID"), Key
    .name = row("COMPLAINTNAME"), 

    ' other DataTable columns here
}).ToList()

Context.Response.Write(serializer.Serialize(list))

Но поскольку у вас есть список Dictionary(Of String, Object), содержащий объекты для сериализации, просто передайтесловарь в сериализатор вместо передачи DataTable:

Dim rows As New List(Of Dictionary(Of String, Object))()
Dim row As Dictionary(Of String, Object)
For Each dr As DataRow In dt.Rows
    row = New Dictionary(Of String, Object)()
    rows.Add(row)
Next

' pass the list of dictionary here
Context.Response.Write(serializer.Serialize(rows))

Примечание:

Вы можете попробовать JsonConvert.SerializeObject () методиз JSON.NET для сериализации списка, содержащего Dictionary(Of TKey, TValue) объектов, который имеет лучшую способность обрабатывать словарь, чем метод JavaScriptSerializer.Serialize().Обратите внимание, что вы должны проверить вывод, чтобы убедиться, что строка JSON правильно отформатирована.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...