现在,我正在使用SPSecurity.RunWithElevatedPrivileges方法让匿名用户将列表项添加到列表中。我想做的是制作一个通用方法,将Site,List和List项作为参数,并将该项添加到要传递的列表中。现在我有:
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;
}
}
});
}
问题是'item'在提升的权限之外被初始化,因此当'itemToAdd'设置为'item'时,它会失去其提升的权限,导致代码在'item.update()'中断,如果使用了my非特权用户。
有什么想法吗?
答案 0 :(得分: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;
}
}
}
}
答案 1 :(得分:0)
以下行itemToAdd = item;
做了一些奇怪的事情 - 您将项目添加到一个列表(使用list.Items.Add()
)但是从另一个列表/位置更新项目(一个作为参数出现)。
不确定您真正想要的是什么,但也许您想将所有文件从item
复制到itemToAdd
。在这种情况下,请考虑将fieldName / value对作为参数传递,以明确表示您要添加具有给定值的新项。
请注意,匿名用户可以将项目添加到明确允许的列表中。
答案 2 :(得分:0)
我没有尝试过,但可能会有所帮助 - http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splistitem.copyto.aspx
此致 Nitin Rastogi
答案 3 :(得分:0)
如果item
来自SPList.AddItem()方法,则splist实例必须从提升的Web获取。否则这段代码将永远打破匿名用户。
或者您可以允许匿名用户将项目添加到列表中,因此您无需使用提升的权限运行代码。
顺便说一下,itemToAdd = item;
不是将新添加的项目设置为旧实例的正确方法。