我是SharePoint编程的新手,遇到以下问题:
我在我的Visual Studio SP项目(SampleAddInList)中添加了一个List。现在我想在我的程序中获取列表以填写示例项。
以下是我的Visual Studio项目的屏幕截图,其中包含以下列表:
这是我的代码,我尝试在列表中添加项目:
private void AddUserToList(string accessToken)
{
if (IsPostBack)
{
sharepointUrl = new Uri(Request.QueryString["SPHostUrl"]);
}
ClientContext clientContext =
TokenHelper.GetClientContextWithAccessToken(
sharepointUrl.ToString(), accessToken);
// Load the properties for the web object.
Web web = clientContext.Web;
clientContext.Load(web);
clientContext.ExecuteQuery();
// Get the current user.
clientContext.Load(web.CurrentUser);
clientContext.ExecuteQuery();
currentUser = clientContext.Web.CurrentUser.Email;
// Load the list "SampleAddInUserList"
List userList = web.Lists.GetByTitle("SampleAddInList");
clientContext.Load<List>(userList);
clientContext.ExecuteQuery();
ListItemCreationInformation info = new ListItemCreationInformation();
Microsoft.SharePoint.Client.ListItem newItem = userList.AddItem(info);
newItem.ParseAndSetFieldValue("Title", "Test");
newItem.ParseAndSetFieldValue("Email", currentUser);
newItem.Update();
clientContext.ExecuteQuery();
}
当我运行项目时,出现以下错误:
List 'SampleAddInList' does not exist at site with URL 'https://xxx.sharepoint.com/sites/test'.
似乎应用程序试图从SP测试站点获取列表,但是那里缺少列表(如果不存在,项目应该自己创建列表,不应该吗?)。
当我尝试使用我在SP Web UI上通过“添加应用程序”创建的列表(另一个列表名称!)时,访问工作正常。
有人可以提供线索吗?
这与我使用的上下文网址有关吗??? 另见我的另一个问题:Sharepoint Online: Difference between SPAppWebUrl & SPHostUrl
答案 0 :(得分:1)
似乎应用程序试图从SP测试站点获取列表,但是 那里没有列表(项目应该通过创建列表 本身如果不存在,不应该吗?)。
这是正确的,如果列表不存在,ListCollection.GetByTitle method
抛出异常就会发生错误。
如果不存在,您可以考虑以下扩展方法来获取或创建List:
using System.Linq;
using Microsoft.SharePoint.Client;
namespace SharePoint.Client.Extensions
{
public static class ListCollectionExtensions
{
public static List EnsureList(this ListCollection lists, string listTitle, ListTemplateType listTemplateType)
{
var ctx = lists.Context;
var result = ctx.LoadQuery(lists.Where(l => l.Title == listTitle));
ctx.ExecuteQuery();
if (!result.Any())
{
var lci = new ListCreationInformation();
lci.Title = listTitle;
lci.TemplateType = (int)listTemplateType;
var list = lists.Add(lci);
ctx.Load(list);
ctx.ExecuteQuery();
return list;
}
return result.FirstOrDefault();
}
}
}
用法
var customList = ctx.Web.Lists.EnsureList("Notes", ListTemplateType.GenericList);
var documentsLibrary = ctx.Web.Lists.EnsureList("Documents", ListTemplateType.DocumentLibrary);
var tasksList = ctx.Web.Lists.EnsureList("Tasks",ListTemplateType.TasksWithTimelineAndHierarchy);