以匿名用户身份添加到Sharepoint列表

时间:2011-11-16 23:04:59

标签: c# sharepoint sharepoint-2010 splistitem

现在,我正在使用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非特权用户。

有什么想法吗?

4 个答案:

答案 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;不是将新添加的项目设置为旧实例的正确方法。