При использовании следующего блока кода 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.