SPListItem.Update не работает - PullRequest
       7

SPListItem.Update не работает

1 голос
/ 14 января 2010

При использовании следующего блока кода listItem.Update завершается с ошибкой NullReferenceException:

        SPWeb web = null;
        SPList list = null;
        SPListItem listItem = null;
        try
        {
            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                using (SPSite site = new SPSite(this.SiteUrl))
                {
                    web = site.OpenWeb();
                    list = web.Lists[this.ListName];
                    listItem = list.Items.Add();
                    listItem["Background"] = "foo";

                }
            }
            );
            listItem.Update();
        }
        catch
        {
        }
        finally
        {
            web.Dispose();
        }

Если я перемещаю метод listItem.Update () внутри анонимного делегата, я получаю «Операция недопустима из-за текущего состояния объекта».

Да, я прочесал SO и перепробовал много перестановок.

Есть идеи?

Обновление: После первого комментария я попытался удалить анонимного делегата из кода, чтобы увидеть, насколько он лучше:

    // store the selected item to pass between methods
    public T SelectedItem { get; set; }   

    // set the selected item and call the delegate method
    public virtual void Save(T item)
    {
        SelectedItem = item;
        try
        {
            SPSecurity.RunWithElevatedPrivileges(SaveSelectedItem);
        }
        catch
        {
        }
    }

    public virtual void SaveSelectedItem()
    {
        if (SelectedItem != null)
        {

            using (SPSite site = new SPSite(this.SiteUrl))
            {
                using(SPWeb web = site.OpenWeb())
                {                    
                    SPList list = web.Lists[this.ListName];
                    SPListItem listItem = list.Items.Add();
                    //UpdateListItem(listItem, SelectedItem);
                    listItem["Background"] = "foo";
                    listItem.Update();
                }
            }      
        }
    }

И это по-прежнему не работает "Операция недействительна из-за текущего состояния объекта." В обоих примерах кода это выглядит как site.Impersonating ложно. Я использую Windows Auth и Олицетворение в web.config. Это выполняется с сервера разработки ASP.Net.

1 Ответ

1 голос
/ 15 января 2010

Я нашел пример с этого сайта (blackninjasoftware). Я создаю ссылку на сайт, беру его токен SystemAccount и затем создаю другую ссылку на сайт, используя токен администратора. Сначала это показалось мне немного хакерским - но эй - у меня есть крайний срок.

Тело окончательного метода работы теперь выглядит так:

            SPListItem new_item = null;
            SPSite initialSite = new SPSite(this.SiteUrl);
            using (var site = new SPSite(this.SiteUrl, initialSite.SystemAccount.UserToken))
            {
                // This code runs under the security context of the SHAREPOINT\system
                // for all objects accessed through the "site" reference. Note that it's a 
                // different reference than SPContext.Current.Site. 
                using (var elevatedWeb = site.OpenWeb())
                {
                    elevatedWeb.AllowUnsafeUpdates = true;
                    SPList list = elevatedWeb.Lists[this.ListName];
                    new_item = list.Items.Add();
                    UpdateListItem(new_item, item);
                    if (new_item != null)
                    {
                        new_item.Update();
                    }
                }
            }
            initialSite.Dispose();
...