我正在使用Sharepoint 2010的Web服务接口来尝试获取给定列表的列。我使用GetList()调用获取所有列没有问题,但问题是我只需要获取用户可以在Sharepoint UI的List Settings视图中看到的列。
我目前使用的代码如下:
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 Lists Service的一个实例,List_id是表示Sharepoint内部列表的GUID。
这会过滤掉我不想要的一些列,但它并没有消除所有内容。
是否有人知道我正在寻找什么属性来缩小它只是用户可以选择添加到视图的属性?或者我完全以错误的方式解决这个问题?
非常感谢您的帮助。
答案 0 :(得分: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's documentation on the Lists.GetListContentType页面。
非常感谢用户823959指出我正确的方向。