ОБНОВЛЕНИЕ: Так что я понял! Все, что мне нужно было сделать, это использовать jQuery.parseJSON();
, и оно преобразовало строку JSON в объект JSON. Вот обновленный код:
$.ajax({
type: "POST",
url: "GetEEs.aspx/GetNextEEs",
data: "{recordID:" + lastItem + "}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg, textStatus, jqXHR) {
var jObject = jQuery.parseJSON(msg.d);
ddl.length = 0;
$.each(jObject.d, function () {
$.each(this, function (index, item) {
addItemToDDL(ddl, item.Display, item.Value);
});
});
},
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
}
});
Хорошо, я написал функцию для запроса таблицы и возврата набора данных, а затем преобразовал его в JSON, чтобы страница могла его использовать. Функция ниже:
<WebMethod()> _
Public Shared Function GetNextEEs(ByVal recordID As Integer) As ArrayList
If Not recordID.Equals(0) Then
Dim sql As String = "SELECT TOP 500 * FROM cbotest WHERE ID > " & recordID
Dim arr As New ArrayList
Using dr As SqlDataReader = Mangrove.SqlHelper.ExecuteReader("...")
While dr.Read()
arr.Add(New ArrayList() From { _
New With { _
Key .Value = dr("code").ToString, _
Key .Display = dr("description").ToString _
}
})
End While
End Using
Return arr
Else
Throw New ApplicationException("Invalid Record ID")
End If
End Function
Функция отлично работает в .Net 4, но я не могу использовать ее с .Net 2. Поэтому я нашел объект JSON.Net с именем Jayrock . Я изменил свою функцию, чтобы использовать его, и все работает. Вот исправленная функция:
<WebMethod()> _
Public Shared Function GetNextEEs(ByVal recordID As Integer) As String
If Not recordID.Equals(0) Then
Dim sql As String = "SELECT TOP 500 * FROM cbotest WHERE ID > " & recordID
Dim json As JsonObject = New JsonObject()
Dim items As JsonArray = New JsonArray()
Using dr As SqlDataReader = Mangrove.SqlHelper.ExecuteReader("...")
While dr.Read()
Dim item As JsonArray = New JsonArray()
Dim itemArr As JsonObject = New JsonObject()
itemArr.Add("Value", dr("code").ToString)
itemArr.Add("Display", dr("description").ToString)
item.Add(itemArr)
items.Add(item)
End While
End Using
json.Add("d", items)
Using writer As JsonWriter = New EmptyJsonWriter()
json.Export(writer)
Return json.ToString
End Using
Else
Throw New ApplicationException("Invalid Record ID")
End If
End Function
Единственная проблема - когда он возвращает JSON, страница не может его проанализировать.
Вот пример выходов из обеих функций:
Первая версия:
[object Object],[object Object],[object Object], ...
Пересмотренная версия:
{"d":[[{"Value":"501","Display":"Record Number 501"}],[{"Value":"502","Display":"Record Number 502"}], ...
Как видите, пересмотренная версия возвращает фактическую строку (которая содержит правильные данные), где в качестве первой версии возвращен объект JSON. Я знаю, что это из-за функции, возвращаемой как String
, но я не могу понять, как вернуть объект JSON, используя исправленный код.
У кого-нибудь есть идея, как это сделать, или лучшее решение? Я в тупике! Также, пожалуйста, помните, что это для .Net 2 (отстой, я знаю: /)
Спасибо, что уделили время!
EDIT
Вот некоторый код на стороне клиента, который я использую:
$.ajax({
type: "POST",
url: "GetEEs.aspx/GetNextEEs",
data: "{recordID:" + lastItem + "}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg, textStatus, jqXHR) {
//alert(msg.d);
document.getElementById('lbl').innerHTML = msg.d;
ddl.length = 0;
$.each(msg.d, function () {
$.each(this, function (index, item) {
addItemToDDL(ddl, item.Display, item.Value);
});
});
},
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
}
});
У меня был alert(item);
внутри самой внутренней петли. Он проходил буква за строкой.