1

ユーザーがフォルダーを作成すると、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;
            }
         }
    });
} 

誰でも問題を解決するのを助けることができますか? すべてのユーザーがホーム メンバーであり、フォルダーを手動で作成できることに注意してください。

4

1 に答える 1

2

に電話をかけてみますItemAdding

ItemAddingメソッドの呼び出し中に (現在ログインしているユーザーと同期的に)呼び出され、メソッドの実行ItemAddedに呼び出されます (通常はワーカー プロセスである SharePoint\System ユーザーと非同期的に)。

多分これが役立つでしょう。

于 2012-11-16T13:09:22.960 に答える