2

Sharepointサイトに実装しようとしているこのイベントレシーバーc#クラスがあります。それは動かなかった。ビルドに問題がなかった後、VisualStudio2010から展開しました。誰かが問題が何であるかわかりますか?コードは大丈夫ですか?またはSPの問題ですか?ありがとうございました。-これが新しいコードです

    using System;
using System.Security.Permissions;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Security;
using Microsoft.SharePoint.Utilities;
using Microsoft.SharePoint.Workflow;

namespace EventReceiverCFolder.EventReceiver1
{
    /// <summary>
    /// List Item Events
    /// </summary>
    public class EventReceiver1 : SPItemEventReceiver
    {
        /// <summary>
        /// An item is being added.
        /// </summary>
        public override void ItemAdded(SPItemEventProperties properties)
        {

            try
            {
                if (properties.ListTitle == "CF") // list where the item was added 
                { // if item was added to this list then create a folder on -  Dlib - list
                    UpdateFolder(properties);
                }
            }
            catch (Exception ex)
            {
                properties.Status = SPEventReceiverStatus.CancelWithError;
                properties.ErrorMessage = ex.Message;
                properties.Cancel = true;
            }
        }

        private void UpdateFolder(SPItemEventProperties properties)
        {
            string foldername = properties.ListItem["Title"].ToString();

            try
            {
                SPSecurity.RunWithElevatedPrivileges(delegate()
                {
                    //inside RunWithElevatedPriviliges I need to open a new site (an elevated site) 
                    using (SPSite site = new SPSite(properties.Web.Site.ID))
                    {
                        using (SPWeb web = site.OpenWeb())
                        {
                            web.AllowUnsafeUpdates = true;
                            SPList list = web.Lists.TryGetList("DLib"); // this is doc Library where the new folder will be created
                            //note that we are creating a list item, not a folder - a folder IS a list item 
                            SPListItem createdFolder = list.Items.Add(list.RootFolder.ServerRelativeUrl, SPFileSystemObjectType.Folder, null);
                            if (createdFolder != null)
                            {
                            createdFolder["Name"] = foldername;
                                createdFolder.Update();
                            }
                            list.Update();
                        }
                    }
                });
            }
            finally { }
        }
    }
}
4

3 に答える 3

2

これを行わないでください:SPUser privilegedAccount = properties.Web.AllUsers[@"SHAREPOINT\SYSTEM"]; の使用について読んでくださいSPSecurity.RunWithElevatedPrivileges。こちらのMSDNドキュメントを参照してください。

また、using(SPSite ...を実行しないでください。usingブロック内では、Webを経由して取得しようとしますSPContext.Current。そのWebはもう昇格されません。

正しい方法は、これらの線に沿ったものです(私はこれを試していなかったので、あなたがどこに向かっているのかを知るためだけのものです):

private void UpdateFolder(SPItemEventProperties properties)
{
    string foldername = properties.ListItem["Title"].ToString();

    SPSecurity.RunWithElevatedPrivileges(delegate()
    {
            //inside RunWithElevatedPriviliges I need to open a new site (an elevated site)
        using (SPSite site = new SPSite(properties.Web.Site.ID))
        {
            using (SPWeb web = site.OpenWeb())
            {
                web.AllowUnsafeUpdates = true;
                SPList list = web.Lists.TryGetList("ListTitle"); //is that really the list title?
                //note that we are creating a list item, not a folder - a folder IS a list item
                SSPListItem createdFolder = list.Items.Add(list.RootFolder.ServerRelativeUrl, SPFileSystemObjectType.Folder, null);
                if (newFolder != null)
                {
                    createdFolder["Name"] = foldername;
                    createdFolder.Update();
                }
                list.Update();
            }
        }
    });
}

また、コードをデバッグしたり、ブレークポイントを設定したりしてみてください。

于 2012-09-21T09:55:45.477 に答える
1

私はこのようなフォルダ名を取得する必要がありました:

string foldername = Convert.ToString(properties.AfterProperties["Title"]);
于 2012-09-26T20:40:07.110 に答える
0

デバッグしようとしましたか?デバッグして、発生しているエラーを教えてください。ただし、デバッグする前に、まずSharePoint Managerを使用して、イベントレシーバーが正しく接続されているかどうかを確認してください。

SharePointイベントレシーバーをデバッグする方法がわからない場合は、こちらをご覧ください

于 2012-09-21T01:14:13.757 に答える