【问题标题】:How do I return multiple generic Lists in one Web Call?如何在一次 Web 调用中返回多个通用列表?
【发布时间】:2009-06-25 12:06:44
【问题描述】:

我认为返回数据集、在前端应用程序中使用数据集和数据表是一个相当糟糕的主意。因此,凭借泛型的魔力,我通过 Web 服务调用返回了一个泛型列表(不是 WCF,只是普通的 ol'asmx)。只要您需要在每次调用您的网络服务时返回一个列表,这就很有效。

我遇到的情况是我有一个更复杂的屏幕,其中有一些下拉菜单等等。我需要将这些下拉列表绑定到一个通用列表。问题是我不想打几个网络电话,每个下拉一个,来获取我的数据。在过去,我只会返回一个数据集并将下拉列表绑定到数据集中的特定表。

因此,在一次网络调用中返回多个通用列表会非常棒。

我尝试过的事情:

  1. 使用列表列表
  2. 使用通用列表集合
  3. 创建一个基类并使用List<Base> 的集合,在尝试将对象填充到该List<Base> 时会出现转换问题。
  4. 创建一个具有返回List<MyOneObject>List<MySecondObject> 等属性的类。这行得通,但有点乱...我在应用程序中有很多类和屏幕会发生这种情况。我可以创建一个这样的类,每个类的属性为 List<MyType>,但就像我说的那样,我认为这可能会失控。

所以此时我有两个选择,上面列表中的#4,或者只返回一个我不想做的数据集:0)

以前有人遇到过这种情况吗?

【问题讨论】:

    标签: .net generics return


    【解决方案1】:

    嗯,我不认为返回多个列表是一个好主意,但如果你打算这样做,我会创建一个包装类,每个列表都作为该类中的一个属性公开。

    类似

    class Wrapper
    {
       public List<object1> Object1List {get;set;}
       public List<object1> Object2List {get;set;}
    
    }
    

    【讨论】:

    • +1 - 这只是模型/视图/控制器模式中的“模型”对象。
    • 我最终使用了这样的 Wrapper。那是我上面列表中的选项#4。它最终工作得很好。如果其中一个属性,比如 Object2List 为空,则甚至不会生成 XML 以传递回客户端。 (是的,我知道我是一个效率纳粹)。另一种选择是在客户端序列化和压缩成字符串和反序列化......但这听起来工作量太大。任何人,感谢您的回答/确认:0)
    【解决方案2】:

    答案是#4,通过一个类,无论是那个调用还是多个调用,你都不想这样做

    【讨论】:

      【解决方案3】:

      看来我今天所有的答案都是从一个问题开始的? 你为什么不想在幕后打多个电话?

      如果您使用一个异步调用 på 下拉/控件,您需要绑定您将获得更流畅的用户体验。 (对于大型独立列表尤其如此)仅仅是因为如果您只调用一次,所有下拉列表/控件都需要等待所有其他控件数据返回。

      话虽如此: 如果您返回的列表的长度彼此接近,您可以使用字典,使用键来表示“属性名称”,使用值来很好地表示值。需要很少的代码,并且使用 .ToDictionary() 将源代码转换为字典非常简单(如果源不是 IEnumerable,则为该源实现 .ToDictionary() 通常是直接的)

      【讨论】:

        【解决方案4】:

        鉴于您的情况,我会说以 XML 格式返回结果将是最好的方法。您不仅可以返回任意数量的列表,还可以以任何方式组织它们,最重要的是,这将是一个与语言无关的通用解决方案。您还可以将结果集直接转换为 xml。

        如果您返回一个 .NET 类,则您只能使用 .NET 语言调用该服务,如果发生更改,您必须重新编写包装类等。使用 XML,您可以从任何语言调用该服务。因此,如果您尝试将前端应用程序与数据/模型层分离,这将是一个不错的选择。

        如果您愿意,您仍然可以将 XML 结果反序列化为 .NET 类,或者直接提取数据。 LINQ to XML 快速且易于使用,并且允许您在需要时转换结果。

        <result>
          <dropdownA_item>
             <Value/>
          </dropdownA_item>
          <dropdownA_item>
          <dropdownA_item>
          <dropdownB_item>
          <dropdownB_item>
          <dropdwonC_item>
          // return as many different lists for as many different drop downs
        </result>
        
        // manually extract the data or deserialize into .net class
        XElement result = GetResult();
        dropdownBox[x].Items = result // you could even have an array of dropDownBoxes[x] and bind to all of them in one loop
            .Where(o => o.Name == "dropdown" + x)
            .Select(o => o.Element("Value").Value) );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-24
          • 1970-01-01
          • 1970-01-01
          • 2013-04-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多