2011-11-16 48 views
0

現在,我正在使用SPSecurity.RunWithElevatedPrivileges方法讓匿名用戶將列表項添加到列表中。我想要做的是製作一個通用方法,它將Site,List和List項目作爲參數,並將該項目添加到傳遞的列表中。現在,我有:作爲匿名用戶添加到Sharepoint列表

public static void AddItemElevated(Guid siteID, SPListItem item, SPList list) 
{ 
    SPSite mySite = SPContext.Current.Site; 
    SPList myList = WPToolKit.GetSPList(mySite, listPath); 
    SPWeb myWeb = myList.ParentWeb; 
    SPSecurity.RunWithElevatedPrivileges(delegate() 
    { 
     using (SPSite eleSite = new SPSite(mySite.ID)) 
     { 
      using (SPWeb eleWeb = eleSite.OpenWeb(myWeb.ID)) 
      { 
       eleWeb.AllowUnsafeUpdates = true; 
       SPList eleList = eleWeb.Lists[myList.Title]; 
       SPListItem itemToAdd = list.Items.Add(); 
       itemToAdd = item; 
       itemToAdd.Update(); 
       eleWeb.AllowUnsafeUpdates = false; 
      } 

     } 
    }); 
} 

的問題是,「項目」得到的提升權限外初始化,所以當「itemToAdd」設置爲「項」就失去了提升的權限,使代碼在打破' item.update()'如果使用我的非特權用戶。

有什麼想法?

回答

0

問題可能是因爲您傳遞了您的列表。嘗試只是路過列表中的名稱,然後從高架網頁抓取名單如下:

public static void AddItemElevated(SPListItem itemToAdd, string listName) 
{ 
    SPWeb web = SPContext.Current.Web; 

    SPSecurity.RunWithElevatedPrivileges(delegate() 
    { 
     using (SPSite elevatedSite = new SPSite(web.Url)) 
     { 
      using (SPWeb elevatedWeb = elevatedSite.OpenWeb()) 
      { 
       elevatedWeb.AllowUnsafeUpdates = true; 
       SPList list = elevatedWeb.Lists[listName]; 
       SPListItem item = list.Items.Add(); 
       item = itemToAdd; 
       item.Update(); 
       elevatedWeb.AllowUnsafeUpdates = false; 
      } 
     } 
    } 
} 
0

行之後itemToAdd = item;做一些奇怪的事情 - 你添加項目到一個列表(list.Items.Add()),但是從另一個列表中更新項目/位置(一個作爲參數)。

不知道你真正想要什麼,但也許你想共同複製itemitemToAdd所有文件。考慮在這種情況下傳遞fieldName/value對作爲參數,以清楚地表明您正在添加具有給定值的新項目。

請注意,匿名用戶可以將項目添加到明確允許的項目列表中。

0

如果item是從SPList.AddItem()方法的到來,splist實例必須是從獲得高架網。否則此代碼將永遠爲匿名用戶打破。

或者您可以允許匿名用戶將項目添加到列表中,因此您不需要使用提升的權限運行代碼。

順便說一下,itemToAdd = item;不是正確的方法,可以將新添加的項目設置爲舊實例。