Прежде всего данные
{ PersonList: [ { FirstName: 'Max', LastName: 'Gershkovich' }, { FirstName: 'Test1', LastName: 'Test2' } ] }
, которые вы отправляете в веб-сервис, являются неверными данными JSON . Вы можете проверить данные на http://www.jsonlint.com/. Правильные данные JSON будут
{"PersonList":[{"FirstName":"Max","LastName":"Gershkovich"},{"FirstName":"Test1","LastName":"Test2"}]}
Более того, я рекомендую вам никогда не создавать JSON вручную . Вместо этого вы должны использовать JSON.stringify . В большинстве случаев функция даже изначально поддерживается в веб-браузерах (иногда после таких обновлений, как здесь ). Правильная сериализация параметров веб-сервиса может быть
$.ajax({
data: {PersonList:JSON.stringify(t)}
// other parameters
});
(см. здесь для более подробной информации) или
$.ajax({
data: JSON.stringify({ PersonList: t })
// other parameters
});
, где
var t = [ { FirstName: 'Max', LastName: 'Gershkovich' },
{ FirstName: 'Test1', LastName: 'Test2' } ];
Какая версия представления данных JSON.stringify({ PersonList: t })
или {PersonList:JSON.stringify(t)}
является правильной, зависит от других вещей. Легко проверить, какие из них работают в вашей среде.
Следующая небольшая проблема: лучше использовать List(Of Person)
непосредственно в параметрах AddPersonList
вместо использования типов PersonList
, унаследованных от List(Of Person)
.
ОБНОВЛЕНО : Только сейчас я читаю ваши комментарии о List(Of Person)
или PersonList
к другому ответу. Чтобы не допустить такого же обсуждения, я решил написать свое мнение по этому поводу. Не важно, какие классы вы используете внутри вашего веб-сервиса. Вам следует разработать интерфейс веб-службы таким образом, чтобы он был простым и понятным для каждого, кто ничего не знает о вашей реализации. Входные данные метода (по крайней мере, что вы включили в вопрос) могут быть отлично описаны с помощью List(Of Person)
. Более того List(Of Person)
это хорошо для передачи данных. Внутри реализации метода вы можете преобразовать List(Of Person)
в любые другие классы, которые хороши для внутренних методов метода. Например, очень просто построить PersonList
из List(Of Person)
. Поэтому я рекомендую вам действовать следующим образом: не допускать детали реализации интерфейса веб-службы.
ОБНОВЛЕНО 2 : Это не проблема, если объект, который является входным параметром веб-метода, имеет в качестве свойства другие объекты, такие как List(Of EmailAddress)
. Например, если вы определили EmailAddress
из вашего последнего примера как
Public Class EmailAddress
Public Property Type As String
Public Property Address As String
End Class
и Customer
как
Public Class Customer
'Public CustomerID As Guid
Public Property FirstName As String
Public Property LastName As String
Public Property EmailAddresses As List(Of EmailAddress)
End Class
тогда у вас не будет проблем с AddPersonList
веб-методом, определенным следующим образом
<WebMethod()> _
Public Function AddPersonList(ByVal PersonList As List(Of Customer)) As String
Таким же образом вы можете использовать
<WebMethod()> _
Public Function AddPersonList1(ByVal input As InputData) As String
с
Public Class InputData
Public Property PersonList As List(Of Customer)
End Class
или многие другие версии объекта для отправки информации на веб-сервер с использованием $.ajax
.
На стороне клиента вы можете определить myData
следующим образом
var myData = [
{ FirstName: 'Max', LastName: 'Gershkovich',
EmailAddresses: [
{ Type: 'SMTP', Address: 'Max.Gershkovich@googlemail.com' },
{ Type: 'SMTP', Address: 'Max.Gershkovich@mail.ru' },
]
},
{ FirstName: 'Test1', LastName: 'Test2' }
];
и затем отправьте данные на веб-сервер с помощью
$.ajax({
type: "POST",
url: "WebService1.asmx/AddPersonList",
data: JSON.stringify({ PersonList: myData }),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
alert(data.d);
},
error: function (xhr, textStatus, errorThrown) {
alert("Error Occured!" + " | " + xhr.responseText + " | " +
textStatus + " | " + errorThrown);
}
});
или
$.ajax({
type: "POST",
url: "WebService1.asmx/AddPersonList1",
data: JSON.stringify({ input: {PersonList: myData} }),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
alert(data.d);
},
error: function (xhr, textStatus, errorThrown) {
alert("Error Occured!" + " | " + xhr.responseText + " | " +
textStatus + " | " + errorThrown);
}
});
Все вышеперечисленное работает без проблем. Вы можете скачать тестовый пример , который делает это (должен быть запущен Default.htm. Чтобы вызвать метод, вы должны нажать на первую или вторую кнопку).
Если вы посмотрите на объект myData
, определенный в коде клиента, а затем посмотрите на использование JSON.stringify
выше, вы увидите, что у вас не возникнет проблем при отправке любых сложных объектов, включая массивы и свойства . На стороне сервера вы можете использовать List(Of Customer)
, List(Of EmailAddress)
или список других объектов в качестве представлений массивов JavaScript. Все будет работать. Только ваш оригинальный пример с наследованием объектов - плохой.
Если вы попытаетесь спроектировать интерфейс веб-службы , глядя со стороны клиента, а не из внутренних серверных структур , вы легко создадите классы для соответствующих входных параметров веб-методов. И все сразу заработает. Если вам нужно будет инициализировать свои внутренние классы с информацией, вы сможете сделать это очень просто. Преобразование данных такого типа будет очень простым, и вам не нужно будет писать какой-либо CustomTypeResolver, который фактически делает то же самое.