将复杂的结构从客户端传递到webservice

时间:2011-04-02 23:39:01

标签: c# jquery .net web-services json

我的网络服务获取一个项目,应该存储它和它的字段:

[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
}

我不喜欢这个解决方案,因为我需要在添加新字段类型时更改web服务。此外 - 项目是订单的一部分,因此存在另一个存储订单的Web服务。那么如何为订单中的每个项目传递字段?

有没有解决方案?

3 个答案:

答案 0 :(得分:0)

您需要将所有相关信息设为公共属性,并确保所有这些信息都是xml可序列化的(或通过IXmlSerializable接口提供自定义序列化)。

答案 1 :(得分:0)

我的工作是将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字符串作为模板。根据需要进行修改。

答案 2 :(得分:0)

我的回答: 我创建了一个名为“TransitionItem”的转换对象,它包含4个属性,其中每个属性都是一个类型为字段类型之一的数组。 在这个转换对象中,我创建了一个名为ToItem的方法,它将TransitionItem“转换”为具有所有接口和东西的“普通”项。 所以我的网络服务现在看起来像:

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

这就是我解决它的方法。