2011-11-16 49 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;不是正确的方法,可以将新添加的项目设置为旧实例。