WebMethod返回通用列表

时间:2010-11-04 03:48:13

标签: c# asp.net web-services soap

我有两个简单的类:一个Order对象,它包含一个OrderLine对象列表:

public class Order  
{  
    public string OrderNo { get; set; }  
    public string CustomerName { get; set; }  

    public List<OrderLine> Lines { get; set; }  
}  

public class OrderLine
{
    public string ItemNo { get; set; }
    public int Qty { get; set; }
    public decimal Price { get; set; }
}

[WebMethod]
public Order GetOrder(string orderNo)
{
    return null;
}

[WebMethod]
public List<Order> GetOrderList(string orderNo)
{
    return null;
}

问题是订单中的OrderLine对象的详细信息(属性)不会由第二个WebMethod呈现(它可以与第一个WebMethod一起使用):

第一个WebMethod(返回订单),呈现此XML(正确地,每个OrderLine的ItemNo,Qty和Price):

<GetOrderResult>  
  <OrderNo>string</OrderNo>  
  <CustomerName>string</CustomerName>  
  <Lines>  
    <OrderLine>  
      <ItemNo>string</ItemNo>  
      <Qty>int</Qty>  
      <Price>decimal</Price>  
    </OrderLine>  
    <OrderLine>  
      <ItemNo>string</ItemNo>  
      <Qty>int</Qty>  
      <Price>decimal</Price>  
    </OrderLine>  
  </Lines>  
</GetOrderResult>

第二个WebMethod(返回List)呈现此XML(请注意不再使用详细信息呈现OrderLines):

<GetOrderListResult>  
  <Order>  
    <OrderNo>string</OrderNo>  
    <CustomerName>string</CustomerName>  
    <Lines>  
      <OrderLine xsi:nil="true" />  
      <OrderLine xsi:nil="true" />  
    </Lines>  
  </Order>  
  <Order>  
    <OrderNo>string</OrderNo>  
    <CustomerName>string</CustomerName>  
    <Lines>  
      <OrderLine xsi:nil="true" />  
      <OrderLine xsi:nil="true" />  
    </Lines>  
  </Order>  
</GetOrderListResult>  

如何使用详细信息而不是xsi来呈现OrderLines:nil =“true”??

感谢。


感谢您的回复,但这没有帮助。我发布的代码尽可能简化;真正的代码当然会实例化列表等,但仍然有同样的问题。但我仍然在样本中尝试了你的建议:

public class Order
{
    public string OrderNo { get; set; }
    public string CustomerName { get; set; }

    public List<OrderLine> Lines { get; set; }

    public Order()
    {
        Lines = new List<OrderLine>();
        Lines.Add(new OrderLine());
        Lines.Add(new OrderLine());
    }
}

WebMethod仍然会返回:

<GetOrderListResult>
    <Order>
      <OrderNo>string</OrderNo>
      <CustomerName>string</CustomerName>
      <Lines>
        <OrderLine xsi:nil="true" />
        <OrderLine xsi:nil="true" />
      </Lines>
    </Order>
    <Order>
      <OrderNo>string</OrderNo>
      <CustomerName>string</CustomerName>
      <Lines>
        <OrderLine xsi:nil="true" />
        <OrderLine xsi:nil="true" />
      </Lines>
    </Order>
</GetOrderListResult>

2 个答案:

答案 0 :(得分:2)

您遇到的问题是List不是XMLSerializable(请参阅here)。您需要将其转换为诸如数组之类的东西。

您可以只使用数组,也可以继续使用List,但在返回值时使用.ToArray()方法。

如果你真的想序列化它而不使用数组,请参见this

答案 1 :(得分:-1)

您需要制作通用List的实例。

您可以在构造函数

中执行此操作
public class Order  
{  
    public string OrderNo { get; set; }  
    public string CustomerName { get; set; }  

    public List<OrderLine> Lines { get; set; }  

    public Order()
    {
         this.Lines = new List<OrderLine>();
    }
}