2010-11-22 22 views
5

Tôi muốn nhận tất cả các cột hiển thị (Ẩn == sai) cho danh sách cụ thể trong trang web sharePoint, tôi đã cố xem qua SharePointWebService.Lists.GetList(listName), nhưng không thể tìm thấy gì hữu ích, cũng đã kiểm tra các phương thức được cung cấp bởi Danh sách dịch vụ web và cũng không có gì mới,Nhận danh sách các cột có thể nhìn thấy danh sách SharePoint thông qua dịch vụ web bằng cách sử dụng C#

Vui lòng tư vấn.

Trả lời

5

Bạn có thể sử dụng phương pháp GetListAndView của dịch vụ Danh sách web để có được các lược đồ để xem danh sách và một cái nhìn.

Từ tài liệu, nếu bạn để trống tham số viewName, chế độ xem mặc định sẽ được trả lại. Sau đó, bạn có thể đọc nút <ViewFields></ViewFields> cho danh sách các trường.

* Chỉnh sửa *

Hóa ra sử dụng XPath để truy vấn XML trở lại là khó khăn hơn tôi nghĩ ... đây là những gì tôi đã đưa ra:

XmlNode result = webService.GetListAndView("My Pictures", string.Empty); 

XmlNamespaceManager nsmgr = new XmlNamespaceManager(result.OwnerDocument.NameTable); 
nsmgr.AddNamespace("sp", "http://schemas.microsoft.com/sharepoint/soap/"); 

string xpathQuery = "sp:View/sp:ViewFields/sp:FieldRef"; 
XmlNodeList nodes = result.SelectNodes(xpathQuery, nsmgr); 

for (int i = 0; i < nodes.Count; i++) 
{ 
    Console.WriteLine(nodes[i].Attributes["Name"].Value); 
} 

Hình như bạn phải có một XmlNamespaceManager nếu không truy vấn của bạn luôn trả về không có giá trị nào. Một cái gì đó về việc xác định không gian tên ... Đây là a good reference.

+0

có vẻ thú vị, tôi sẽ thử ASAP và đăng lên kết quả –

+0

ViewFields Trả về tên của các trường, vì vậy tôi phải vẽ lại từng trường theo tên của nó để hiển thị tên là và vấn đề thứ hai là ViewFields không hiển thị tất cả các trường được hiển thị trong giao diện mặc định chia sẻ cho danh sách đó (Nếu danh sách là danh sách ảnh)! bất kỳ ý tưởng? –

+0

Tôi đã thử điều này để lấy Fields, System.Xml.XmlNode list = SPListWebService.GetListAndView (xmlnode.Attributes ["Title"]. Value, string.Empty); System.Xml.XmlNodeList visibleColumns = list.SelectNodes ("View/ViewFields/FieldRef"); .... tôi đã sai ở đâu? –

1

Phương thức GetList() trả về đoạn CAML bao gồm định nghĩa trường (danh sách) của danh sách. Bạn có thể muốn thử một XPath expression:

XmlNode list = yourListService.GetList("yourListName"); 
XmlNodeList visibleColumns 
    = list.SelectNodes("Fields/Field[not(@Hidden) or @Hidden='FALSE']"); 
+0

Tôi đã nhìn vào 'Danh sách' innerXml và tôi chỉ nhận thấy rằng không có thuộc tính Hidden = "TRUE": S Tôi sẽ thuật lại câu hỏi của mình: làm cách nào để đọc tất cả các cột xuất hiện cho người dùng trong danh sách khi họ mở danh sách thông qua trang web sharePoint? –

+0

@Rami Shareef: Ý bạn là ở chế độ xem mặc định của danh sách? –

+0

@Kit: chính xác, chế độ xem mặc định trong trang web sharePoint. –

1

Tôi đã sử dụng mã ở trên nhưng, sau một tìm kiếm dài, tôi tìm thấy giải pháp để có được tất cả hoặc cột tùy chỉnh từ danh sách chia sẻ. Mã cho điều đó được chia sẻ trên ..

Custom Columns or ALL Columns

+1

Liên kết đơn lẻ là [được coi là câu trả lời nghèo] (http://stackoverflow.com/faq#deletion) vì nó vô nghĩa bởi chính nó và tài nguyên đích không được đảm bảo sẽ còn sống trong tương lai. [Nó sẽ là thích hợp hơn] (http://meta.stackexchange.com/q/8259) để bao gồm các phần thiết yếu của câu trả lời ở đây, và cung cấp liên kết để tham khảo. – j0k

0

Giải pháp khá đơn giản. Sử dụng GetList() hoặc các chức năng tương tự là cách sai.

Thay vì sử dụng GetListContentTypesAsync() để có được ID nội dung và sau đó nhận được cụ thể ContentType sử dụng GetListContentTypeAsync(), nó sẽ trả về XML trong đó bao gồm tất cả các cột hiển thị trong danh sách SharePoint:

var Contents = await soapListClient.GetListContentTypesAsync(list.Title, "0x01"); // 0x01 is kind of a root element for sharepoint. 
String ContentID = Contents.Body.GetListContentTypesResult.Descendants().FirstOrDefault().Attribute("ID").Value.ToString(); 
var ContentType = await soapListClient.GetListContentTypeAsync(list.Title, ContentID); 
XElement xmll = XElement.Parse(ContentType.Body.GetListContentTypeResult.ToString()); 
Các vấn đề liên quan