2012-09-23 52 views
3

我正在使用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; 

如果服務引用是SharePoint的一個實例,列出服務和LIST_ID是代表名單內到SharePoint中的GUID。

這可以過濾掉一些我不想要的列,但它並沒有擺脫所有的東西。

有沒有人知道我在尋找什麼樣的屬性來縮小它的範圍,直到用戶可以選擇添加到視圖中的屬性?或者我是否完全用錯誤的方式來解決這個問題?

非常感謝您的幫助。

+0

您應該首先獲取列表的內容類型,然後獲取內容類型的列。 – user823959

+0

非常感謝 - 我可以看到如何工作,但你能告訴我如何獲得列表的內容類型嗎? Lists.GetContentType需要一個內容類型ID,然後它會爲我返回任何東西。抱歉,我可以看到如何使用Google Searching的Sharepoint對象模型來做到這一點,但我無法看到它是如何使用Web服務界面完成的。 –

+0

查看本網站:http://www.novolocus。com/2007/12/08/the-circular-logic-of-the-wss-lists-webservice-getlistcontenttypes-call/ 此外,如果您找到答案,請回答您的問題並提供完整答案。 – user823959

回答

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; 

在這一點上,我們已經得到了包含有關顯示名稱,靜態的名稱,內容類型和一大堆更多的信息字段的XML元素的列表。有關每個字段返回的信息範圍的更多信息,請參閱Microsoft's documentation on the Lists.GetListContentType頁面。

很多感謝user823959爲我指出正確的方向。