设为首页 收藏本站
查看: 803|回复: 0

[经验分享] 有关SharePoint Client Object应用的笔记

[复制链接]

尚未签到

发表于 2015-9-25 08:46:41 | 显示全部楼层 |阅读模式
  记录一些平常用SharePoint Client Object访问并管理SharePoint List或Library的例子。
  首先,所有使用SharePoint Client Object的.NET工程都需要引用Microsoft.SharePoint.Client.dllMicrosoft.SharePoint.Client.Runtime.dll这两个类库。这里提供一个下载:Microsoft.SharePoint.Client.zip
  下面是一些例子:
  1. 从指定的List或Library中找出Folder

DSC0000.gif DSC0001.gif GetFolderInList

/// <summary>
/// Get folder in the specific SharePoint List.
/// </summary>
/// <param name="clientContext"></param>
/// <param name="listName"></param>
/// <param name="folderServerRelativeUrl"></param>
/// <returns> If the folder does not exist in the specific SharePoint List return null, else return the folder object.</returns>
public static Folder GetFolderInList(ClientContext clientContext, String listName, String folderServerRelativeUrl)
{
    Folder existingFolder = null;
    Web web = clientContext.Web;
    ListCollection lists = web.Lists;
    existingFolder = web.GetFolderByServerRelativeUrl(folderServerRelativeUrl);
    clientContext.Load(existingFolder);
    try
    {
        clientContext.ExecuteQuery();
    }
    catch
    {
        existingFolder = null;
    }
    return existingFolder;
}  listName为所要查询的List或Library的名称,不带路径URL。folderServerRelativeUrl为所要查询的Folder的相对路径,如“/sitename/library/folder/subfolder/”。使用的时候需要传入ClientContext对象。如果待查询的Folder存在则返回对应的Microsoft.SharePoint.Client.Folder对象,否则返回null。
  
  2. 从指定的URL中确定已存在的Folder

FindExistFolder

/// <summary>
/// Find the exist folder in the given URL.
/// </summary>
/// <param name="clientContext"></param>
/// <param name="listName"></param>
/// <param name="folderServerRelativeUrl"></param>
/// <returns>Returns the existed SharePoint Folder object.</returns>
private static Folder FindExistFolder(ClientContext clientContext, string listName, string folderServerRelativeUrl)
{
    Web web = clientContext.Web;
    List list = web.Lists.GetByTitle(listName);
    Folder folder = GetFolderInList(clientContext, listName, folderServerRelativeUrl);
    if (folder == null)
    {
        int iLastSlashPos = folderServerRelativeUrl.LastIndexOf("/");
        if (iLastSlashPos > 0)
        {
            // if current folder does not exist, back to the parent folder.
            string parentFolderUrl = folderServerRelativeUrl.Substring(0, iLastSlashPos);
            return FindExistFolder(clientContext, listName, parentFolderUrl);
        }
    }
    return folder;
}  listName为所要查询的List或Library的名称,不带路径URL。folderServerRelativeUrl为所要查询的Folder的相对路径,如“/sitename/library/folder/subfolder/”。使用的时候需要传入ClientContext对象。该方法通过递归调用的方式从给定的URL中找出从哪一级开始的Folder在List或Library中是存在的。例如,给定一个Folder的相对地址“/sitename/library/folder/subfolder1/subfolder1_1/subfolder1_1_1/”,该方法将从最后一个folder开始进行递归,返回存在的那个Folder对象。如果所有的folder均不存在,则返回null。
  
  3. 通过给定的URL在List或Library中创建Folder

EnsureFolderExist

/// <summary>
/// Check if the folder exists in the target list, if it does not, create the folders level by level.
/// </summary>
/// <param name="clientContext"></param>
/// <param name="listName"></param>
/// <param name="folderServerRelativeUrl"></param>
public static void EnsureFolderExist(ClientContext clientContext, string listName, string folderServerRelativeUrl)
{
    // Remove the last character '/' from the string folderServerRelativeUrl.
    if (folderServerRelativeUrl.Length > 0 && folderServerRelativeUrl.Last().Equals('/'))
    {
        folderServerRelativeUrl = folderServerRelativeUrl.Substring(0, folderServerRelativeUrl.Length - 1);
    }
    Web web = clientContext.Web;
    List list = web.Lists.GetByTitle(listName);
    Folder folder = FindExistFolder(clientContext, listName, folderServerRelativeUrl);
    if (folder != null)
    {
        // Get the new folders path string part.
        string s = folderServerRelativeUrl.Replace(folder.ServerRelativeUrl, string.Empty);
        if (s.Length > 0 && s.First().Equals('/'))
        {
            s = s.Substring(1, s.Length - 1);
        }
        string[] arr = s.Split('/');
        if (arr.Length > 0)
        {
            string tmp = string.Empty;
            // Create new folders level by level.
            for (int i = 0; i < arr.Length; i++)
            {
                if (arr.Trim().Length > 0)
                {
                    tmp += "/" + arr;
                    folder.Folders.Add(folder.ServerRelativeUrl + tmp);
                    clientContext.Load(folder);
                    clientContext.ExecuteQuery();
                }
            }
        }
    }
}  顾名思义,该方法借助于FindExistFolder方法首先从给定的folder相对路径中找出已存在的folder,然后逐级创建folder。
  
  4. 使用Microsoft.SharePoint.Client.FileCollection.Add方法向目标Library中创建或修改文件

UploadFileToList

/// <summary>
/// Upload a document to the specific SharePoint List.
/// </summary>
/// <param name="clientContext"></param>
/// <param name="listName"></param>
/// <param name="documentUrl">The target document path, e.g. /site/library/folder/word1.docx.</param>
/// <param name="documentStream"></param>
/// <param name="contentType">ContentType string</param>
public static void UploadFileToList(ClientContext clientContext, string listName, string documentUrl, byte[] documentStream, string contentType)
{
    Web web = clientContext.Web;
    List list = web.Lists.GetByTitle(listName);
    bool bTarFileExist = true;
    // Try to load the target document.
    Microsoft.SharePoint.Client.File targetFile = web.GetFileByServerRelativeUrl(documentUrl);
    targetFile.RefreshLoad();
    clientContext.Load(targetFile);
    try
    {
        clientContext.ExecuteQuery();
    }
    catch
    {
        bTarFileExist = false;
    }
    // If the target document does exist.
    if (bTarFileExist)
    {
        // If the target document is checked out by another user, execute UndoCheckOut.
        if (targetFile.CheckOutType != CheckOutType.None)
        {
            targetFile.UndoCheckOut();
        }
        // Check out the target document before uploading.
        targetFile.CheckOut();
    }
    // Construct the target document object.
    FileCreationInformation newItemInfo = new FileCreationInformation();
    newItemInfo.Content = documentStream;
    newItemInfo.Overwrite = true;
    newItemInfo.Url = documentUrl;
    Microsoft.SharePoint.Client.File uploadFile = list.RootFolder.Files.Add(newItemInfo);
    // Get target file ContentType.
    ContentType newFileContentType = null;
    if (!defaultContentTypes.Contains(contentType))
    {
        ContentTypeCollection listContentTypes = list.ContentTypes;
        clientContext.Load(listContentTypes, types => types.Include(type => type.Id, type => type.Name, type => type.Parent));
        var result = clientContext.LoadQuery(listContentTypes.Where(c => c.Name == contentType));
        clientContext.ExecuteQuery();
        newFileContentType = result.FirstOrDefault();
    }
    // Set target file ContentType with the correct value.
    clientContext.Load(uploadFile.ListItemAllFields);
    if (newFileContentType != null)
    {
        uploadFile.ListItemAllFields["ContentTypeId"] = newFileContentType.Id.ToString();
    }
    uploadFile.ListItemAllFields.Update();
   
    // Check in the docuemnt with a draft version.
    uploadFile.CheckIn(string.Empty, CheckinType.MinorCheckIn);
    // Excute the document upload.
    clientContext.ExecuteQuery();
}  该方法首先根据传入的documentUrl判断文件是否已经存在,如果存在则需要先将文件check out或undo check out,然后通过Microsoft.SharePoint.Client.FileCollection.Add的方式上传文件。如果目标library中有ContextType的限制,则还需要指定文件的ContentType,defaultContentTypes是一个存放指定ContentType的静态String数组,如果传入的contentType字符串不在defaultContentTypes数组中,则需要给文件指定新的ContentType。
  
  5. 使用Microsoft.SharePoint.Client.File.SaveBinaryDirect方法向目标Library中创建或修改文件

UploadFileToListByFileStream

/// <summary>
/// Upload a document to the specific SharePoint List.
/// </summary>
/// <param name="clientContext"></param>
/// <param name="listName"></param>
/// <param name="documentUrl">The target document path, e.g. /site/library/folder/word1.docx.</param>
/// <param name="fs"></param>
/// <param name="contentType"></param>
public static void UploadFileToListByFileStream(ClientContext clientContext, string listName, string documentUrl, FileStream fs, string contentType)
{
    Web web = clientContext.Web;
    List list = web.Lists.GetByTitle(listName);
    bool bTarFileExist = true;
    // Try to load the target document.
    Microsoft.SharePoint.Client.File targetFile = web.GetFileByServerRelativeUrl(documentUrl);
    targetFile.RefreshLoad();
    clientContext.Load(targetFile);
    try
    {
        clientContext.ExecuteQuery();
    }
    catch
    {
        bTarFileExist = false;
    }
    // If the target document does exist.
    if (bTarFileExist)
    {
        // If the target document is checked out by another user, execute UndoCheckOut.
        if (targetFile.CheckOutType != CheckOutType.None)
        {
            targetFile.UndoCheckOut();
        }
        // Check out the target document before uploading.
        targetFile.CheckOut();
        clientContext.ExecuteQuery();
    }
    // Upload file.
    Microsoft.SharePoint.Client.File.SaveBinaryDirect(clientContext, documentUrl, fs, true);
   
    // Get the new file.
    Microsoft.SharePoint.Client.File newFile = web.GetFileByServerRelativeUrl(documentUrl);
    newFile.RefreshLoad();
    clientContext.Load(newFile);
    clientContext.ExecuteQuery();
    // Get target file ContentType.
    ContentType newFileContentType = null;
    if (!defaultContentTypes.Contains(contentType))
    {
        ContentTypeCollection listContentTypes = list.ContentTypes;
        clientContext.Load(listContentTypes, types => types.Include(type => type.Id, type => type.Name, type => type.Parent));
        var result = clientContext.LoadQuery(listContentTypes.Where(c => c.Name == contentType));
        clientContext.ExecuteQuery();
        newFileContentType = result.FirstOrDefault();
        // Set new file ContentType with the correct value.
        clientContext.Load(newFile.ListItemAllFields);
        newFile.ListItemAllFields["ContentTypeId"] = newFileContentType.Id.ToString();
        newFile.ListItemAllFields.Update();
    }
    // Check in the docuemnt with a draft version.
    newFile.CheckIn(string.Empty, CheckinType.MinorCheckIn);
    // Excute the document upload.
    clientContext.ExecuteQuery();
}  与UploadFileToList方法类似,该方法通过Microsoft.SharePoint.Client.File.SaveBinaryDirect方法向目标Library中上传文件,接收FileStream而不是文件的字节数组。
  
  6. 读取List或Library中的数据并返回指定格式的XML文档对象

GetXmlFromLibrary

public static XDocument GetXmlFromLibrary(string siteUrl, string listName)
{
    string host = (new Uri(siteUrl)).Host;
    XElement root = new XElement("Items");
    using (ClientContext clientContext = new ClientContext(siteUrl))
    {
        Web web = clientContext.Web;
        List list = web.Lists.GetByTitle(listName);
        CamlQuery camlQuery = new CamlQuery();
        camlQuery.ViewXml = @"<View>
                                <ViewFields>
                                  <FieldRef Name='Title'/>
                                  <FieldRef Name='InsideTrackCategories'/>
                                </ViewFields>
                                <RowLimit>0</RowLimit>
                              </View>";
        ListItemCollection listItems = list.GetItems(camlQuery);
        clientContext.Load(list);
        //clientContext.Load(listItems);
        clientContext.Load(listItems, s => s.Include(c => c.Id, c => c.DisplayName, c => c.FieldValuesAsText, c => c.FieldValuesForEdit));
        clientContext.ExecuteQuery();               
        foreach (ListItem item in listItems)
        {
            XElement eleTitle = new XElement("Title", item.FieldValuesAsText["Title"].ToString());
            XElement eleUrl = new XElement("Url", string.Concat("http://", host, item.FieldValuesAsText["FileRef"].ToString()));
            XElement eleInsideCategories = new XElement("InsideCategories");
            string s = item.FieldValuesAsText["InsideTrackCategories"];
            if (!string.IsNullOrEmpty(s))
            {
                string[] arr = s.Split(';');
                foreach (string tmp in arr)
                {
                    XElement eleCategory = new XElement("Category", tmp);
                    eleInsideCategories.Add(eleCategory);
                }
            }
            XElement eleItem = new XElement("Item", eleTitle, eleUrl, eleInsideCategories);
            root.Add(eleItem);
        }
    }
    XDocument doc = new XDocument();
    doc.Add(root);
    return doc;
}  该方法比较简单,通过指定的siteUrl和listName从List或Library中读取指定字段的数据,然后按照一定的格式返回XML文档对象。下面是所返回的XML文档对象的结构:


<?xml version="1.0" encoding="utf-8"?>
<Items>
  <Item>
    <Title></Title>
    <Url></Url>
    <InsideCategories>
      <Category></Category>
      <Category></Category>
      <Category></Category>
    </InsideCategories>
  </Item>
  <Item>
    <Title></Title>
    <Url></Url>
    <InsideCategories>
      <Category></Category>
    </InsideCategories>
  </Item>
</Items>  字段InsideTrackCategories是Lookup类型,并且允许有多个值,当有多个值存在时,SharePoint中用分号进行分隔。
  
  这里记录一些有关SharePoint客户端对象模型应用方面的文章,方便以后查阅:
  http://msdn.microsoft.com/zh-cn/library/ee857094.aspx
  http://msdn.microsoft.com/en-us/library/ee956524.aspx
  http://blog.iyunv.com/lgm97/article/details/6455361
  http://ranaictiu-technicalblog.blogspot.com/2010/03/sharepoint-2010-manage.html
  http://www.cnblogs.com/Sunmoonfire/archive/2011/01/18/1937884.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-118422-1-1.html 上篇帖子: Sharepoint学习笔记---SPList--使用Linq to Sharepoint间接查询External List(3.使用Linq to Share 下篇帖子: 在Sharepoint中如何共享其他网站中的列表 之补充1
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表