3

我正在使用 Sharepoint 2010 的 Web 服务界面来尝试获取给定列表的列。使用 GetList() 调用获取所有列没有问题,但问题是我只需要获取用户可以在 Sharepoint UI 的“列表设置”视图中看到的列。

我目前使用的代码如下:

rootNode = serviceReference.GetList(List_id.ToString());
Element element = XElement.Parse(rootNode.OuterXml);
var fields = from e in element.Descendants()
             where e.Name.LocalName == "Field" && e.Attribute("ID") != null &&
             !(e.Attribute("Name").Value.StartsWith("_") && e.Attribute("SourceID").Value == "http://schemas.microsoft.com/sharepoint/v3")            
             select e;

其中 serviceReference 是 Sharepoint 列表服务的一个实例,List_id 是表示 Sharepoint 内部列表的 GUID。

这确实过滤掉了一些我不想要的列,但它并没有摆脱一切。

有谁知道我正在寻找哪些属性来将其缩小到用户可以选择添加到视图中的属性?或者我会以完全错误的方式解决这个问题?

非常感谢您的帮助。

4

1 回答 1

2

答案是我确实在错误的地方寻找我需要的信息。正如 user823959 指出的那样,我需要获取内容类型定义并使用其中的字段而不是列表本身。

要做到这一点是一个两阶段的过程,首先我们需要使用 Lists.GetListContentTypes 方法获取内容类型的列表(虽然这需要一个内容类型 id 参数,但实际上我们在这里放什么似乎并不重要)

    XmlNode rootNode = serviceReference.GetListContentTypes(List_id.ToString(), "0×01");

返回的 CAML 包含列表中可用的每种内容类型的定义 - 返回的第一个内容类型是默认内容类型(在我的情况下,是我之后的内容类型)

    String contentType = rootNode.ChildNodes[0].Attributes["ID"].Value;

一旦我们获得了我们想要的内容类型,我们就可以使用适当的列表内容类型 id 调用 GetListContentType 来获取内容类型的完整定义:

    XmlNode contentTypeNode = serviceReference.GetListContentType(List_id.ToString(), contentType);

此调用返回的 CAML 将包含一个字段元素列表,这些元素可以正确显示 SharePoint UI 的视图配置中可用的字段。可以在 LINQ 查询中选择它们,如下所示:

    XElement contentTypesElement = XElement.Parse(contentTypeNode.OuterXml);

    var fields = from e in contentTypesElement.Descendants()
                 where e.Name.LocalName == "Field"
                 select e;

至此,我们得到了一个包含有关显示名称、静态名称、内容类型等信息的 Field XML 元素列表。有关每个字段返回的信息范围的详细信息,请参阅Microsoft 在 Lists.GetListContentType 页面上的文档。

非常感谢 user823959 为我指明了正确的方向。

于 2012-10-02T09:45:37.287 回答