none
Программное создание элемента списка RRS feed

  • Вопрос

  • Всем привет!

    SharePoint 2013. Необходимо реализовать добавление элементов в список не со стандартной формы NewForm.aspx, а со своей странички Application page. Т.е. на странице имеются элементы, пользователь их заполняет, нажимает кнопку и происходит создание элемента в определенном списке и заполняются все поля списка теми полями, которые заполнены на Application Page.

    Явно есть руководства в интернете по такому делу (я ранее на 1С писал, проделывал такое не раз, наверняка и в SharePoint это реализуемо). Поделитесь, пожалуйста.

    Премного благодарен!

    17 сентября 2014 г. 6:32

Ответы

  • Да, разумеется это возможно.

    Есть два способа для Вашего случая, через серверную объектную модель (C#) или через клиентскую(JS).
    Учитывая динамику развития SharePoint - рекомендую использовать JavaScript.
    Ниже пример для 1 одного текстбокса. Создайте его на своей странице. 
    Так же сделайте кнопку, на ней вызов ф-ии createListItem()
    Подключите jQuery. (Можете его не использовать, тогда измените код взятие данных с текстбокса)

    Собственно сам код:

    function createListItem() {
    	console.log("Начало выполнения функции 'createListItem()");
        var clientContext = new SP.ClientContext(currentWebUrl);
        var oList = clientContext.get_web().get_lists().getByTitle('Имя списка');        
        var itemCreateInfo = new SP.ListItemCreationInformation();
        this.oListItem = oList.addItem(itemCreateInfo);
        oListItem.set_item('Title', $("#ID Вашего элемента").text());
    	
        oListItem.update();
        clientContext.load(oListItem);
        clientContext.executeQueryAsync(
            Function.createDelegate(this, this.onQuerySucceededCreateListItem), 
            Function.createDelegate(this, this.onQueryFailedCreateListItem)
        );
    }
    
    function onQuerySucceededCreateListItem() {
    	console.log("Начало выполнения функции 'onQuerySucceededCreateListItem()");
        console.log('Элемент создан: ' + oListItem.get_id());
    }
    
    function onQueryFailedCreateListItem(sender, args) {
    	console.log("Начало выполнения функции 'onQueryFailedCreateListItem()");
        console.log('Ошибка при создании элемента. ' + args.get_message() + '\n' + args.get_stackTrace());
    }

    • Предложено в качестве ответа IL De 17 сентября 2014 г. 8:16
    • Помечено в качестве ответа Колтышев Евгений 18 сентября 2014 г. 8:23
    17 сентября 2014 г. 7:18
  • 17 сентября 2014 г. 8:31

Все ответы

  • Msdn: Продукты и технологии Microsoft SharePoint
    MVA

    Курс построен на основе докладов трека «Корпоративная разработка» конференции DevCon 2014. В рамках курса обсуждаются проблемы, которые необходимо учитывать при построении приложений под SharePoint 2013, в том числе в...


    SharePoint для разработчиков

    SharePoint для разработчиков

    17 сентября 2014 г. 7:07
  • Да, разумеется это возможно.

    Есть два способа для Вашего случая, через серверную объектную модель (C#) или через клиентскую(JS).
    Учитывая динамику развития SharePoint - рекомендую использовать JavaScript.
    Ниже пример для 1 одного текстбокса. Создайте его на своей странице. 
    Так же сделайте кнопку, на ней вызов ф-ии createListItem()
    Подключите jQuery. (Можете его не использовать, тогда измените код взятие данных с текстбокса)

    Собственно сам код:

    function createListItem() {
    	console.log("Начало выполнения функции 'createListItem()");
        var clientContext = new SP.ClientContext(currentWebUrl);
        var oList = clientContext.get_web().get_lists().getByTitle('Имя списка');        
        var itemCreateInfo = new SP.ListItemCreationInformation();
        this.oListItem = oList.addItem(itemCreateInfo);
        oListItem.set_item('Title', $("#ID Вашего элемента").text());
    	
        oListItem.update();
        clientContext.load(oListItem);
        clientContext.executeQueryAsync(
            Function.createDelegate(this, this.onQuerySucceededCreateListItem), 
            Function.createDelegate(this, this.onQueryFailedCreateListItem)
        );
    }
    
    function onQuerySucceededCreateListItem() {
    	console.log("Начало выполнения функции 'onQuerySucceededCreateListItem()");
        console.log('Элемент создан: ' + oListItem.get_id());
    }
    
    function onQueryFailedCreateListItem(sender, args) {
    	console.log("Начало выполнения функции 'onQueryFailedCreateListItem()");
        console.log('Ошибка при создании элемента. ' + args.get_message() + '\n' + args.get_stackTrace());
    }

    • Предложено в качестве ответа IL De 17 сентября 2014 г. 8:16
    • Помечено в качестве ответа Колтышев Евгений 18 сентября 2014 г. 8:23
    17 сентября 2014 г. 7:18
  • Да, разумеется это возможно.

    Есть два способа для Вашего случая, через серверную объектную модель (C#) или через клиентскую(JS).
    Учитывая динамику развития SharePoint - рекомендую использовать JavaScript.
    Ниже пример для 1 одного текстбокса. Создайте его на своей странице. 
    Так же сделайте кнопку, на ней вызов ф-ии createListItem()
    Подключите jQuery. (Можете его не использовать, тогда измените код взятие данных с текстбокса)

    Собственно сам код:

    function createListItem() {
    	console.log("Начало выполнения функции 'createListItem()");
        var clientContext = new SP.ClientContext(currentWebUrl);
        var oList = clientContext.get_web().get_lists().getByTitle('Имя списка');        
        var itemCreateInfo = new SP.ListItemCreationInformation();
        this.oListItem = oList.addItem(itemCreateInfo);
        oListItem.set_item('Title', $("#ID Вашего элемента").text());
    	
        oListItem.update();
        clientContext.load(oListItem);
        clientContext.executeQueryAsync(
            Function.createDelegate(this, this.onQuerySucceededCreateListItem), 
            Function.createDelegate(this, this.onQueryFailedCreateListItem)
        );
    }
    
    function onQuerySucceededCreateListItem() {
    	console.log("Начало выполнения функции 'onQuerySucceededCreateListItem()");
        console.log('Элемент создан: ' + oListItem.get_id());
    }
    
    function onQueryFailedCreateListItem(sender, args) {
    	console.log("Начало выполнения функции 'onQueryFailedCreateListItem()");
        console.log('Ошибка при создании элемента. ' + args.get_message() + '\n' + args.get_stackTrace());
    }

    Спасибо, Александр. А можете кинуть ссылку на описание всех возможных свойств, методов у объекта SP (как вы указали выше new SP.ClientContext())?
    17 сентября 2014 г. 8:29
  • 17 сентября 2014 г. 8:31
  • Это пространство имен. Вот ссылка на описание.
    17 сентября 2014 г. 9:43
  • С созданием элемента разобрался, решил реализовать его посредством С#.

    Теперь возник вопрос: после удачного добавления элемента хочется пользователю показать уведомление, что элемент был успешно создан. Нашел лишь создание всплывашек, но средствами js (SP.UI.Notify.addNotification()). Теперь не могу понять как мне из C# вызвать js-функцию? Либо же сделать всплывашку на C# - но не могу найти информацию по этому вопросу.

    Кто-нибудь реализовывал подобное?

    18 сентября 2014 г. 9:25
  • Можете сделать после создания элемента редирект на страницу с сообщением.

    Либо отсылать пользователя на ту же страницу с которой он создавал элемент.
    Но передать еще в url(query string) параметр. 
    Считать этот параметр (используя JavaScript) и если он есть показать popup сообщение.

    18 сентября 2014 г. 9:33
  • Думаю самое логичное использовать для этих целей статус бар или нотификейшены

    1. Notify
    2. Status
    • Изменено IL De 18 сентября 2014 г. 10:01
    18 сентября 2014 г. 9:49
  • Да, с точки зрения ненавязчивости.
    Если же элемент не создан, то модальный диалог. (Т.е. какая то ошибка)
    Про это здесь неплохо написано.
    18 сентября 2014 г. 10:14
  • вызов и серверного кода
    public static void AddSharePointNotification(Page page, string text) 
    { 
        //build up javascript to inject at the tail end of the page 
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.AppendLine("<script>");
        //First wait until the SP.js is loaded, otherwise the notification doesn’t work 
        //gets an null reference exception 
        stringBuilder.AppendLine("ExecuteOrDelayUntilScriptLoaded(ShowNotification, \"sp.js\");");
        stringBuilder.AppendLine("function ShowNotification()"); 
        stringBuilder.AppendLine("{"); 
        stringBuilder.AppendLine(string.Format("SP.UI.Notify.addNotification(\"{0}\");", text)); 
        stringBuilder.AppendLine("}");
        stringBuilder.AppendLine("</script>");
        //add to the page 
        page.Controls.Add(new LiteralControl(stringBuilder.ToString()));
    }

    18 сентября 2014 г. 10:24
  • Думаю самое логичное использовать для этих целей статус бар или нотификейшены

    1. Notify
    2. Status
    Верно, я тоже нашел данный функционал (чуть выше постом писал про SP.UI.Notify.addNotification()) - но это js-код. Как мне его вызвать из С# (у меня добавление элемента происходит в C#)?
    18 сентября 2014 г. 10:33
  • Как я Вам и описал:
    отсылать пользователя на ту же страницу с которой он создавал элемент.
    Но передать еще в url(query string) параметр. 
    Считать этот параметр (используя JavaScript) и если он есть показать popup сообщение.

    18 сентября 2014 г. 10:37