轉自:http://www.cnblogs.com/MinSentinel/archive/2008/06/07/1209992.html
通過SPList.Update()可以更新一個List,但一般你是不能直接調用此方法的,會出現“Updates are currently disallowed on GET requests. To allow updates on a GET, set the 'AllowUnsafeUpdates' property on SPWeb.”
解決方案有兩個:
1。設定 AllowUnsafeUpdates = true.這是個很取巧的方法,不只這裡可以使用,在由於其他一些原因導致以上錯誤的時候只要設定此值,錯誤就可避免。我看到過有些工程裡只要涉及到SPWeb,必設定此值。但是它是有安全隱患的,具體解釋可以參考MSDN。
2。 不要使用Get requests而使用 Post requests,配合使用RunWithElevatedPrivileges,也可以有效解決這個問題。所謂不要使用Get requests而使用 Post requests,簡單的說就是你不要直接在Page_Load這種事件裡去Update list,你可以放一個Button,使用它來觸發事件。然後把Update 代碼放在RunWithElevatedPrivileges中執行。
string url = SPContext.Current.Site.Url;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite site = new SPSite(url))
{
using (SPWeb web = site.OpenWeb())
{
SPList list = web.Lists[ListName];
list .Update();
}
}
}
);
一般情況下都能滿足需要。
====================================
【問題描述】
在更新列表裡的清單項目時,我們常常需要用SPSecurity.RunWithElevatedPrivileges(delegate(){}來進行item.Update(),但有時這樣做會出錯。
【解決方案一】
1.將item.Update()放在許可權提升的後面,即只把site和文本放在提升許可權裡:
SPList list = null;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
site = new SPSite(siteCollectionUrl);
web = site.RootWeb;
});
list = web.Lists["通知庫"];
SPListItem item = list.Items.Add();
Iitem[Title]= "123";
Item.Update();
2. 提升許可權後,操作ListItem也會出現類似的錯誤,可以用同樣的方法解決:
protected void Page_Load(object sender, EventArgs e)
{
SPSecurity.RunWithElevatedPrivileges(delegate()
{
UpdateItem();
}
);
}
void UpdateItem()
{
SPSite site = new SPSite("http://ssjin073:9032");
SPWeb web = site.RootWeb;
//強制設定內容物件
HttpContext.Current.Items["HttpHandlerSPWeb"] = web;
web.AllowUnsafeUpdates = true;
SPList list = web.Lists["MainList"];
SPListItem item = list.Items[0];
item["Title"] = DateTime.Now.ToString();
item.Update();
web.Dispose();
site.Dispose();
}
第二種方法來源於:http://www.cnblogs.com/jianyi0115/archive/2008/04/11/1148827.html