问题:
在SPSecurity.RunWithElevatedPrivileges 代码块中执行SPListItem.Update(),
SPSecurity.RunWithElevatedPrivileges
(
() =>
{
using (SPSite site = new SPSite("web url"))
{
using (var tempWeb = site.OpenWeb())
{
var list = tempWeb.Lists["mylist"];
var Item = list.Items[0];
Item["Title"] = "new Title";
Item.Update();
}
}
}
);
将会得到如下错误:Operation is not valid due to the current state of the object.
解决此问题有两个办法:
1。Item.Update();放到SPSecurity.RunWithElevatedPrivileges语句块的外面。
SPListItem Item = null;
SPSecurity.RunWithElevatedPrivileges
(
() =>
{
using (SPSite site = new SPSite("web url"))
{
using (var tempWeb = site.OpenWeb())
{
var list = tempWeb.Lists["mylist"];
Item = list.Items[0];
}
}
}
);
Item["Title"] = "new Title";
Item.Update();
2. 第二个方法是在new SPSite(),SPWeb时不能Hard Code URL类似于以上的代码,
应该使用如下方式:
var webContext = SPContext.Current.Web;
SPSecurity.RunWithElevatedPrivileges
(
() =>
{
using (SPSite site = new SPSite(webContext.Site.ID))
{
using (var tempWeb = site.OpenWeb(webContext.ID))
{
var list = tempWeb.Lists["mylist"];
var Item = list.Items[0];
Item["Title"] = "new Title";
Item.Update();
}
}
}
);
但是此方法有一个问题:在非Web应用程序的中,如控制台程序,以上代码将出现错误,因为SPContext.Current.Web为Null。
详情可参考老外的原文:http://vspug.com/ssa/2007/11/25/operation-is-not-valid-due-to-the-current-state-of-the-object/