2015-10-13 140 views
1

我试图在Sharepoint在线列表中创建一个文件夹结构。 我创建根据这篇文章名为Shared1列表:在Sharepoint在线列表中创建文件夹结构

http://blogs.technet.com/b/catastrophic_failure_joannav/archive/2013/10/23/how-to-create-a-custom-list-in-sharepoint-online-quot-w15-quot.aspx

而且我使用此代码试图创建一个底层结构:

using (var clientContext = new ClientContext("https://myEnv.sharepoint.com")) 
{ 
    var passWord = new SecureString(); 
    foreach (char c in "myPSW".ToCharArray()) passWord.AppendChar(c); 

    clientContext.Credentials = new SharePointOnlineCredentials("[email protected]", passWord); 
    Web web = clientContext.Web; 
    clientContext.Load(web); 
    clientContext.ExecuteQuery(); 
    var folder = CreateFolder(clientContext.Web, "Shared1", "FolderA/SubFolderA/SubSubFolderA"); 
} 

/// <summary> 
/// Create Folder client object 
/// </summary> 
/// <param name="web"></param> 
/// <param name="listTitle"></param> 
/// <param name="fullFolderUrl"></param> 
/// <returns></returns> 
public static Folder CreateFolder(Web web, string listTitle, string fullFolderUrl) 
{ 
    if (string.IsNullOrEmpty(fullFolderUrl)) 
     throw new ArgumentNullException("fullFolderUrl"); 
    var list = web.Lists.GetByTitle(listTitle); 
    return CreateFolderInternal(web, list.RootFolder, fullFolderUrl); 
} 

private static Folder CreateFolderInternal(Web web, Folder parentFolder, string fullFolderUrl) 
{ 
    var folderUrls = fullFolderUrl.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); 
    string folderUrl = folderUrls[0]; 
    var curFolder = parentFolder.Folders.Add(folderUrl); 
    web.Context.Load(curFolder); 
    web.Context.ExecuteQuery(); 

    if (folderUrls.Length > 1) 
    { 
     var subFolderUrl = string.Join("/", folderUrls, 1, folderUrls.Length - 1); 
     return CreateFolderInternal(web, curFolder, subFolderUrl); 
    } 
    return curFolder; 
} 

public static Folder GetFolder(Web web, string fullFolderUrl) 
{ 
    if (string.IsNullOrEmpty(fullFolderUrl)) 
     throw new ArgumentNullException("fullFolderUrl"); 

    if (!web.IsPropertyAvailable("ServerRelativeUrl")) 
    { 
     web.Context.Load(web, w => w.ServerRelativeUrl); 
     web.Context.ExecuteQuery(); 
    } 
    var folder = web.GetFolderByServerRelativeUrl(web.ServerRelativeUrl + fullFolderUrl); 
    web.Context.Load(folder); 
    web.Context.ExecuteQuery(); 
    return folder; 
} 

并且在执行我得到这个错误:

Unhandled Exception: Microsoft.SharePoint.Client.ServerException: List 'Shared1' 
does not exist at site with URL 'https://myEnv.sharepoint.com'. 
    at Microsoft.SharePoint.Client.ClientRequest.ProcessResponseStream(Stream res 
ponseStream) 
    at Microsoft.SharePoint.Client.ClientRequest.ProcessResponse() 
    at SharepointFolderRename.Program.CreateFolderInternal(Web web, Folder parent 
Folder, String fullFolderUrl) in \\vmware-host\shared folders\Documents\Visual S 
tudio 2012\Projects\Trunk2015\SharepointFolderRename\Program.cs:line 84 
    at SharepointFolderRename.Program.Main(String[] args) in \\vmware-host\shared 
folders\Documents\Visual Studio 2012\Projects\Trunk2015\SharepointFolderRename\ 
Program.cs:line 49 

这是SP列表的打印。 Print of the list

我错过了什么?

+1

显示您的列表创建代码。 –

+0

SharePoint ** 2015 **?我猜这是一个错字.. –

+1

是的。修改它 – MaPi

回答

1

你得到这些错误的原因与指定的不正确的网址有关。而在子网站Shared1存在于您的列表中,您要访问它的根站点,下面的图片说明了它

enter image description here

因此,解决办法是初始化客户端上下文正确的网站的话,更换:

using (var clientContext = new ClientContext("https://myEnv.sharepoint.com/")) 
{ 
    //... 
} 

using (var clientContext = new ClientContext("https://myEnv.sharepoint.com/Shared1")) 
{ 
    //... 
} 

It is assumed that you want to ctreate folders for list located on Shared1 sub site

实施例下面

的示例演示了如何在Documents库创建下News子站点的文件夹层次结构:(https://contoso.sharepoint.com/news

Archive 
    | 
    2009 
     | 
     09 

用法

using (var ctx = GetContext("https://contoso.sharepoint.com/news", userName, password)) 
{ 
     var list = ctx.Web.Lists.GetByTitle("Documents"); 
     var folder = list.CreateFolder("Archive/2015/09"); 
     Console.WriteLine(folder.ServerRelativeUrl); 
} 

其中

public static ClientContext GetContext(Uri webUri, string userName, string password) 
{ 
    var securePassword = new SecureString(); 
    foreach (var ch in password) securePassword.AppendChar(ch); 
    return new ClientContext(webUri) { Credentials = new SharePointOnlineCredentials(userName, securePassword) }; 
} 

ListExtensions.cs文件:

using System; 
using Microsoft.SharePoint.Client; 

namespace SharePoint.ClientExtensions 
{ 
    public static class ListExtensions 
    { 


     /// <summary> 
     /// Create Folder in List 
     /// </summary> 
     /// <param name="list"></param> 
     /// <param name="folderUrl"></param> 
     /// <returns></returns> 
     public static Folder CreateFolder(this List list, string folderUrl) 
     { 
      if (string.IsNullOrEmpty(folderUrl)) 
       throw new ArgumentNullException("folderUrl"); 
      if (!list.IsPropertyAvailable("RootFolder")) 
      { 
       list.Context.Load(list.RootFolder); 
       list.Context.ExecuteQuery(); 
      } 
      return CreateFolderInternal(list.RootFolder,folderUrl); 
     } 

     private static Folder CreateFolderInternal(Folder parentFolder, string folderUrl) 
     { 
      var folderUrlParts = folderUrl.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries); 
      var curFolder = parentFolder.Folders.Add(folderUrlParts[0]); 
      parentFolder.Context.Load(curFolder); 
      parentFolder.Context.ExecuteQuery(); 
      if (folderUrlParts.Length > 1) 
      { 
       var subFolderUrl = string.Join("/", folderUrlParts, 1, folderUrlParts.Length - 1); 
       return CreateFolderInternal(curFolder, subFolderUrl); 
      } 
      return curFolder; 
     } 
    } 
} 
+0

上添加了它我试过这个,我得到这个消息:未处理的异常:Microsoft.SharePoint.Client.ClientRequestException:不能 联系站点在指定的URL https://xyz.sharepoint.com/Shared1。没有名为“/Shared1/_vti_bin/sites.asmx”的网站。 – MaPi

+1

我正在使用List而不是文档库。创建正确的应用程序允许代码运行。你的回答指向了正确的方向,所以我会接受它作为答案 – MaPi

1

您需要在CreateFolder方法中加载列表。

public static Folder CreateFolder(Web web, string listTitle, string fullFolderUrl) 
{ 
    if (string.IsNullOrEmpty(fullFolderUrl)) 
     throw new ArgumentNullException("fullFolderUrl"); 
    var list = web.Lists.GetByTitle(listTitle); 
    clientContext.Load(list); 
    clientCOntext.Execute(); 
    return CreateFolderInternal(web, list.RootFolder, fullFolderUrl); 
} 
+0

感谢您的答复。我添加了这些行clientContext.Load(list); clientContext.ExecuteQuery();但我得到相同的错误信息 – MaPi

+0

您确定“Shared1”是您的列表的名称吗?你可以发布一份列表吗? – Diogo

+0

我在帖子 – MaPi

相关问题