Sharepoint 2010 Event Receiver просто работает в учетной записи администратора
У меня есть получатель событий, который автоматически создает 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;
}
}
});
}
Кто-нибудь может помочь решить проблему? Обратите внимание, что все пользователи являются домашними участниками и могут создавать папки вручную.
1 ответ
Попробуйте позвонить ItemAdding
,
ItemAdding
вызывается при вызове метода (синхронно с текущим вошедшим в систему пользователем) и ItemAdded
вызывается после выполнения метода - асинхронно с пользователем SharePoint\System, который обычно является рабочим процессом.
Может быть, это поможет.