передача сложной структуры от клиента к веб-сервису - PullRequest
0 голосов
/ 03 апреля 2011

Мой веб-сервис получает элемент и должен хранить его и его поля:

[WebMethod]
public void StoreItem(Item item)
{
    item.Store();
}

Существует 4 типа полей, но когда клиент передает объект Item - поля не будут проходить правильно, так как этоинтерфейс, а не реализация.Одно из возможных решений - , которое мне совсем не помогает - использовать вместо этого следующий веб-сервис:

[WebMethod]
public void StoreItem(Item item, frstTypeField[] fields12, scndTypeField[] fields,
    thrdTypeField[] fields3, frthTypeField[] fields4)
{
    //append fields to item and then store
}

Мне не нравится это решение, потому что мне нужно изменить веб-сервис при добавленииновый тип поля.Кроме того, Item является частью заказа, поэтому существует еще один веб-сервис, в котором хранится заказ.Так как я могу передать поля для каждого элемента в заказе?

Есть ли какое-то решение для этого?

Ответы [ 3 ]

0 голосов
/ 03 апреля 2011

Я получил это, отправив объект JSON в мой WebMethod со свойством __type, равным квалифицированному классу (например, {item:{'__type':'MyNamespace.Item'}}.

Но это может быть немного утомительно, если ваш Item объект несколько сложен.

Для начала я опубликовал WebMethod, который не принимает параметров и просто возвращает недавно созданный экземпляр объекта любого типа, который я хотел передать, моему реальному WebMethod.

[WebMethod]
public static Item GetItem () {
    return new Item {
        // set properties, whatever
    };
}

Вызовите это из вашего jQuery и используйте что-то вроде JSON2 для проверки возвращенного объекта.

$(function() {

    $.ajax({
        url : 'default.aspx/GetItem',
        data : '{}',
        // blah
        success : function (m) {
            alert (JSON.stringify(m.d));
        }
    });

});

... затем просто используйте полученную строку JSON в качестве шаблона. Изменить по необходимости.

0 голосов
/ 04 апреля 2011

Мой ответ: я создал объект перехода с именем «TransitionItem», который содержит 4 свойства, где каждое свойство является массивом с типом одного из типов полей.В этом объекте перехода я создал метод ToItem, который «переводит» TransitionItem в «обычный» элемент со всеми интерфейсами и прочим.Итак, мой веб-сервис теперь выглядит так:

[WebMethod]
public void StoreItem(TransitionItem tItem)
{
    IItem item=tItem.ToItem();
    item.Store();
}

Вот как я это решил.

0 голосов
/ 03 апреля 2011

Вам необходимо сделать все соответствующие данные общедоступными свойствами, а также убедиться, что все они сериализуемы в формате xml (или обеспечить настраиваемую сериализацию через интерфейс IXmlSerializable).

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