2009-10-02 2 views
0

Поскольку Microsoft не включила способ иметь уникальные ограничения в sharepoint, это нужно сделать вручную.Sharepoint через веб-службу: проверка наличия элемента в списке

Я вставляю элементы в список sharepoint через метод веб-службы.

Как проверить, существует ли уже существующий элемент списка с тем же значением идентификатора поля?

Я узнал, что должен использовать метод веб-службы wsLists.getListitems, но это не совсем «удобный». Документация MSDN снова не очень хороша в объяснении того, что должно быть легко сделать.

ответ

5
private bool itemDoesntExist() 
{ 
    XmlDocument doc = new XmlDocument(); 
    doc.LoadXml("<Document><Query><Where><Contains><FieldRef Name=\"ID\" /><Value Type=\"Text\">" + this.ID + "</Value></Contains></Where></Query><ViewFields /><QueryOptions /></Document>"); 
    XmlNode listQuery = doc.SelectSingleNode("//Query"); 
    XmlNode listViewFields = doc.SelectSingleNode("//ViewFields"); 
    XmlNode listQueryOptions = doc.SelectSingleNode("//QueryOptions"); 
    XmlNode items = this.wsLists.GetListItems(this.ListName , string.Empty, listQuery, listViewFields, string.Empty, listQueryOptions, null); 
    if (items.ChildNodes[1].Attributes["ItemCount"].Value == "0") 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 
+2

Пожалуйста, используйте имена отрицательных методов, например ItemExist(). Это гораздо легче читать. –

+0

Я согласен с Магнусом в вопросе именования, но мне нравится сжатость вашего решения с использованием XML для получения необходимой вам информации. Еще один голос, и вы можете получить значок для ответа на свой вопрос с 3 + голосами. – Mayo

2

Вот процедура, которую я написал 2 года назад, которая вытаскивает идентификатор документа с заданным именем файла ... Я думаю, вы можете легко пересмотреть его, чтобы вернуть true/false, если данный идентификатор существует в списке.

protected string GetDocumentID(Lists.Lists ls, string ListGUID, string FileName) 
{ 
    string strDocumentID = "-1"; 

    string strViewGUID = ""; 
    string strRowLimit = "50000"; 

    XmlDocument xmlDoc = new XmlDocument(); 
    XmlNode query = xmlDoc.CreateNode(XmlNodeType.Element, "Query", ""); 
    XmlNode viewFields = xmlDoc.CreateNode(XmlNodeType.Element, "ViewFields", ""); 
    XmlNode queryOptions = xmlDoc.CreateNode(XmlNodeType.Element, "QueryOptions", ""); 

    query.InnerXml = ""; 
    viewFields.InnerXml = ""; 
    queryOptions.InnerXml = "<IncludeAttachmentUrls>TRUE</IncludeAttachmentUrls>"; 

    System.Xml.XmlNode nodeListItems = ls.GetListItems(ListGUID, strViewGUID, query, viewFields, strRowLimit, queryOptions, null); 

    XmlDocument doc = new XmlDocument(); 
    doc.LoadXml(nodeListItems.InnerXml); 
    XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); 
    nsmgr.AddNamespace("z", "#RowsetSchema"); 
    nsmgr.AddNamespace("rs", "urn:schemas-microsoft-com:rowset"); 

    foreach (XmlNode node in doc.SelectNodes("/rs:data/z:row", nsmgr)) 
    { 
     if (node.Attributes["ows_LinkFilename"].Value == FileName) 
     { 
      strDocumentID = node.Attributes["ows_ID"].Value; 
      break; 
     } 
    } 

    return strDocumentID; 
} 

Вот код, который называет его ...

Lists.Lists ls = new Lists.Lists(); 
ls.PreAuthenticate = true; 
ls.Credentials = System.Net.CredentialCache.DefaultCredentials; 
ls.Url = SharePointSiteURL + @"/_vti_bin/lists.asmx"; 

string DocID = GetDocumentID(ls, ListGUID, FileName); 
+0

+1 для усилий работоспособного блока кода. Я понял, что работа будет опубликовать еще один простой способ. –

+0

Я понял, что есть способ быть более чистым с XML, но проект был брошен без всяких на то оснований, и это была разовая сделка (копировать данные из репозитория не SharePoint SharePoint) - это было «заставить работать». :) – Mayo

Смежные вопросы