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

  • Вопрос

  • Добрый день!

    Имеется два списка: "Активные заявки" и "Архив заявок". Есть группа "Инициаторы", у которой есть права на создание и редактирование элементов в списке "Активные заявки" и только просмотр элементов в списке "Архив заявок". В форме редактирования активной заявки я сделал чекбокс (отметка о выполнении заявки). Если отметка есть, то срабатывает мой собственный обработчик сохранения CloseRequest. В этом обработчике создаётся копия текущей заявки в "Архиве заявок", после чего исходная заявка удаляется. Ниже приведён код обработчика:

     private void CloseRequest(object sender, EventArgs e)
            {
                if (completed != null)
                {
                    if (completed.Checked)
                    {
                        SPSecurity.RunWithElevatedPrivileges(delegate()
                        {
                            SPContext current = SPContext.Current;
                            SPWeb web = current.Web;
                            SPListItem curitem = current.ListItem;
                            SPList archive = web.GetList("Lists/Archive/");
                            SPListItem item = archive.AddItem();
                            item["Title"] = curitem["Title"];
                            item["Categor"] = curitem["Categor"];
                            item["FullDescription"] = curitem["FullDescription"];
                            item["PersonName"] = curitem["PersonName"];
                            item["Subdivision"] = curitem["Subdivision"];
                            item["Room"] = curitem["Room"];
                            item["Phone"] = curitem["Phone"];
                            item["Status"] = "Закрыта";
                            item["Executor"] = curitem["Executor"];
                            item["DispatcherNote"] = curitem["DispatcherNote"];
                            item["WorkStartTime"] = curitem["WorkStartTime"];
                            item["WorkTime"] = curitem["WorkTime"];
                            item["ExecutorComment"] = curitem["ExecutorComment"];
                            item.Update();
                            curitem.Delete();
                        });
                    }
                }
            }
    Проблема в том, что этот код не срабатывает (несмотря на то, что используется SPSecurity.RunWithElevatedPrivileges), если у инициатора нет прав на создание элементов в списке "Архив заявок" (если дать ему права, то всё нормально работает). Уже искал информацию, но никак не могу разобраться, в чём проблема.
    22 января 2014 г. 6:22

Ответы

Все ответы

  • А он и не должен работать. Плохо искали. 

    Поставьте себе SPCOP (из галереи расширений VS) он быстро расскажет где вы не правы.

    http://docs.spcaf.com/v4/SPC020206_AvoidCallToRunWithElevatedPrivileges.html

    http://docs.spcaf.com/v4/SPC050201_InstantiateNewSPSiteInRunWithElevatedPrivileges.html

    22 января 2014 г. 8:19
  • Искал-то может быть и неплохо, просто было несколько непонятно. Я правильно понимаю, что нужно внутри делегата обязательно создавать новый объект SPSite и работать уже с ним?
    22 января 2014 г. 14:20
  • Спасибо за ссылки, разобрался. Также не обошлось без AllowUnsafeUpdates.

    После исправления код выглядит так:

    private void CloseRequest(object sender, EventArgs e)
            {
                if (completed != null)
                {
                    if (completed.Checked)
                    {
                        SPContext current = SPContext.Current;
                        SPSite site = current.Site;
                        SPListItem curitem = current.ListItem;
                        
                        SPSecurity.RunWithElevatedPrivileges(delegate()
                        {
                            using (SPSite elevatedSite = new SPSite(site.ID))
                            {
                                SPWeb elevatedWeb = elevatedSite.RootWeb;
                                elevatedWeb.AllowUnsafeUpdates = true;
                                SPList archive = elevatedWeb.GetList("Lists/Archive/");
                                SPListItem item = archive.AddItem();
                                item["Title"] = curitem["Title"];
                                item["Categor"] = curitem["Categor"];
                                item["FullDescription"] = curitem["FullDescription"];
                                item["PersonName"] = curitem["PersonName"];
                                item["Subdivision"] = curitem["Subdivision"];
                                item["Room"] = curitem["Room"];
                                item["Phone"] = curitem["Phone"];
                                item["Status"] = "Закрыта";
                                item["Executor"] = curitem["Executor"];
                                item["DispatcherNote"] = curitem["DispatcherNote"];
                                item["WorkStartTime"] = curitem["WorkStartTime"];
                                item["WorkTime"] = curitem["WorkTime"];
                                item["ExecutorComment"] = curitem["ExecutorComment"];
                                
                                item.Update();
                                curitem.Delete();
                                elevatedWeb.AllowUnsafeUpdates = false;
                                elevatedWeb.Dispose();
                            }
                        });
    
                        site.Dispose();
                    }
                }
            }

    23 января 2014 г. 6:30
  • *facepalm*
    В коде немеряно ошибок. Поставьте spcop, посмотрите на что он ругается.

    Business Solutions Architect, SharePoint Expert, Trainer, Speaker and Author http://gandjustas.blogspot.com/ Join Russian SharePoint Community at https://www.facebook.com/groups/sharepointrussian/

    23 января 2014 г. 7:17
  • Видимо, Вы просто не можете не выпендриваться. Знаете, ВНЕЗАПНО не у всех сразу появляется такой же опыт в шарике, как у Вас. Но всё равно спасибо за помощь.
    24 января 2014 г. 3:15
  • Я уже дважды написал что надо поставить spcop и посмотреть на что он ругается. Вы этого так и не сделали. Опыт тут не при чем.

    Business Solutions Architect, SharePoint Expert, Trainer, Speaker and Author http://gandjustas.blogspot.com/ Join Russian SharePoint Community at https://www.facebook.com/groups/sharepointrussian/

    24 января 2014 г. 5:58
  • С чего Вы взяли, что я его не поставил? Я просто не сказал об этом.
    24 января 2014 г. 10:49
  • В RunWithElevatedPrivileges всегда требуется переоткрывать SPSite SPWeb!

    Для SPContext не надо вызывать Dispose!

    При работе с классами IDisposable вместо вызова Dispose используйте using(){} !!!

    8 февраля 2014 г. 12:01