Sharepoint Online:创建&使用提供商托管应用程序中的列表(C#)

时间:2016-01-14 11:00:53

标签: visual-studio sharepoint sharepoint-apps

我是SharePoint编程的新手,遇到以下问题:

我在我的Visual Studio SP项目(SampleAddInList)中添加了一个List。现在我想在我的程序中获取列表以填写示例项。

以下是我的Visual Studio项目的屏幕截图,其中包含以下列表: enter image description here

这是我的代码,我尝试在列表中添加项目:

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'.

这里的错误截图: enter image description here

似乎应用程序试图从SP测试站点获取列表,但是那里缺少列表(如果不存在,项目应该自己创建列表,不应该吗?)。

当我尝试使用我在SP Web UI上通过“添加应用程序”创建的列表(另一个列表名称!)时,访问工作正常。

有人可以提供线索吗?

这与我使用的上下文网址有关吗??? 另见我的另一个问题:Sharepoint Online: Difference between SPAppWebUrl & SPHostUrl

1 个答案:

答案 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);