0

现在,我正在使用 SPSecurity.RunWithElevatedPrivileges 方法让匿名用户将列表项添加到列表中。我想做的是制作一个通用方法,它将站点、列表和列表项作为参数并将该项添加到正在传递的列表中。现在我有:

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”时,它会失去提升的权限,如果使用我的非特权用户。

有什么想法吗?

4

4 回答 4

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;
            }
        }
    }
}
于 2011-11-16T23:43:24.357 回答
0

以下行itemToAdd = item;做了一些奇怪的事情 - 您将项目添加到一个列表(使用list.Items.Add())但从另一个列表/位置更新项目(作为参数提供的)。

不确定您真正想要什么,但也许您想将所有文件从 复制itemitemToAdd. 在这种情况下考虑将 fieldName/value 对作为参数传递,以明确您正在添加具有给定值的新项目。

请注意,匿名用户可以将项目添加到明确允许的列表中。

于 2011-11-16T23:43:52.953 回答
0

如果item来自 SPList.AddItem() 方法,则必须从提升的 Web 获取 splist 实例。否则此代码将始终为匿名用户中断。

或者您可以允许匿名用户将项目添加到列表中,因此您不需要以提升的权限运行代码。

顺便说itemToAdd = item;一句,将新添加的项目设置为旧实例不是正确的方法。

于 2011-11-17T13:18:16.797 回答
0

我还没有尝试过,但这可能会有所帮助 - http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splistitem.copyto.aspx

问候, Nitin Rastogi

于 2011-11-17T08:37:37.153 回答