Sharepoint Online: создание и использование списка в приложении, размещенном у поставщика (C#)

Я новичок в программировании SharePoint и столкнулся со следующей проблемой:

Я добавил список в свой проект Visual Studio SP (SampleAddInList). Теперь я хочу получить список в своей программе, чтобы заполнить пример элемента.

Вот скриншот моего проекта 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 через «Добавить приложение», доступ работает нормально.

Может кто подскажет???

Имеет ли это какое-то отношение к контекстному URL-адресу, который я использую??? см. также мой другой вопрос: Sharepoint Online: разница между SPAppWebUrl и SPHostUrl


person D. Müller    schedule 14.01.2016    source источник
comment
Попробуйте использовать SPAppWebUrl вместо SPHostUrl.   -  person STORM    schedule 18.01.2016


Ответы (1)


Похоже, что приложение пытается получить список с тестового сайта SP, но списка там нет (проект должен создать список сам, если он не существует, не так ли??).

Правильно, ошибка возникает, поскольку ListCollection.GetByTitle method генерирует исключение, если список не существует.

Вы можете рассмотреть следующий метод расширения для получения или создания списка, если он не существует:

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);
person Vadim Gremyachev    schedule 14.01.2016
comment
Но у меня есть следующая проблема: я уже создал список в части SP моего приложения, где столбцы уже определены. Есть ли способ изменить ваш код, чтобы он использовал этот список? - person D. Müller; 14.01.2016
comment
на самом деле указанный метод не создает список, если список уже существует, он возвращает существующий. - person Vadim Gremyachev; 14.01.2016
comment
Да, я только что попробовал это. Но моя проблема в том, что я добавил список через часть проекта SP (добавить -> Список), но не могу его использовать. Я получаю исключение «Список не существует», как описано выше. Я хочу использовать список, который я уже добавил в проект (см. первый скриншот) - person D. Müller; 14.01.2016