Sharepoint 2010事件接收器仅在管理员帐户中工作



我有一个事件接收器,当用户创建文件夹时,它会自动创建13个子文件夹。下面的代码可以做到这一点,当管理员帐户创建文件夹时,一切都正常。但当涉及到其他用户时,不会创建子文件夹而不会出现任何错误。

public override void ItemAdded(SPItemEventProperties properties)
{
base.ItemAdded(properties);
SPWeb web = properties.OpenWeb();
web.AllowUnsafeUpdates = true;
SPDocumentLibrary docLib = (SPDocumentLibrary)web.List[properties.ListId];
if (properties.ListItem.ContentType.Name == "Folder"
&& properties.ListItem.Folder.ParentFolder.ToString().ToLower().EndsWith("opportunity"))
{
String url = properties.ListItem.ParentList.RootFolder.ServerRelativeUrl.ToString();
SPFolder libFolder = properties.ListItem.Folder;
string newFolderUrl = (web.Url + "/" + libFolder.ToString());
foreach (string subfolder in folders)
{
SPListItem newFolder = docLib.Items.Add(newFolderUrl, SPFileSystemObjectType.Folder, subfolder);
newFolder.Update();
}
}
}

我读了很多关于提升SPSite和SPWeb的文章,并在创建子文件夹之前编写了一段提升对象的代码。但是下面的代码不起作用:

public override void ItemAdded(SPItemEventProperties properties)
{
Guid siteId = properties.SiteId;
Guid webId = properties.OpenWeb().ID;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite elevatedSite = new SPSite(siteId))
{
using (SPWeb web = elevatedSite.OpenWeb(webId))
{
base.ItemAdded(properties);
web.AllowUnsafeUpdates = true;
SPDocumentLibrary docLib = (SPDocumentLibrary)web.Lists[properties.ListId];
if (properties.ListItem.ContentType.Name == "Folder"
&& properties.ListItem.Folder.ParentFolder.ToString().ToLower().EndsWith("opportunity"))
{
String url = properties.ListItem.ParentList.RootFolder.ServerRelativeUrl.ToString();
SPFolder libFolder = docLib.RootFolder.SubFolders[properties.ListItem.Name];
SPFolder libFolder = properties.ListItem.Folder;
string newFolderUrl = (web.Url + "/" + libFolder.ToString());
foreach (string subfolder in folders)
{
SPListItem newFolder = docLib.Items.Add(newFolderUrl, SPFileSystemObjectType.Folder, subfolder);
newFolder.Update();
}
}
web.AllowUnsafeUpdates = false;
}
}
});
} 

有人能帮忙解决这个问题吗?请注意,所有用户都是家庭成员,可以手动创建文件夹。

尝试拨打ItemAdding

方法调用时调用ItemAdding(与当前登录的用户同步),方法执行后调用ItemAdded(与SharePoint\System用户异步),后者通常是工作进程。

也许这会有所帮助。

相关内容

最新更新