1

ブログ サイト (投稿リスト用) の EventReceiver を作成しようとしていますが、うまく動作しません。[作成者] 列を [匿名] に変更したいと考えています。基本的に、私はこのすべてをコンソールアプリケーションで動作させていますが、コンソールアプリケーションが実行されたときに作成者の列名のみが変更されます。

新しいアイテムがリストに追加されるたびに作成者を変更する必要があります。私のコードは以下のとおりです....これを変更して EventReceiver プロジェクトで使用するにはどうすればよいですか??? EventReceiver プロジェクトに、EventReceiver をアタッチしたい URL を既に伝えているので、このコードから何を削除できるかわかりません。今のところ、何も実行されず、エラーも発生せず、作成者列が変更されても、デバッグします。

   using (SPSite site = new SPSite("http://test-sharepoint/subsite/")) 
   { 
       using (SPWeb web = site.OpenWeb()) 
       { 
           SPList list = web.Lists["Posts"]; 
           SPListItemCollection listItemCollection = list.Items; 

           foreach (SPListItem listItem in listItemCollection) 
           { 
               SPFieldUserValue userName = new SPFieldUserValue(web, 22, "Anonymous");
                listItem["Author"] = userName; 
               listItem["Editor"] = userName; 

               listItem.Update(); 
           } 
           web.Update(); 
       } 
    } 

編集: コードは ItemAdded メソッドにあります

編集 #2: これは、ループなしで properties.ListItem を使用する以外は同じコードを試しています。これは、イベント レシーバー プロジェクトでの私の試みでしたが、うまくいきませんでした。作成者フィールド、またはその問題のフィールドは変更されません(タイトルも試しました)

       SPSite site = new SPSite("http://test-sharepoint/subsite/");
       SPWeb web = site.OpenWeb();
       SPFieldUserValue userName = new SPFieldUserValue(web, 22, "Anonymous");

       properties.ListItem["Author"] = userName;
       properties.ListItem["Editor"] = userName;
       properties.ListItem.Update();

* また、私の理解では、SPFieldUserValue はユーザーまたは SharePoint ユーザー グループ (アクセス許可) のいずれかを取得するため、私のコードでは、22 は必要な SharePoint ユーザー グループを取得し、「匿名」はそのグループのユーザーです...


編集#3:さらに進歩しました。このコードはリストに対しては問題なく機能しますが、投稿またはコメントリストではなく、作成者フィールドを変更しないものです。全項目の承認/却下のせいでしょうか??? 承認済みであろうと保留中であろうと、まだ匿名は表示されませんが、前述のように、別のリストでは正常に機能します。

   public override void ItemAdded(SPItemEventProperties properties)
   {
       base.ItemAdded(properties);

       SPSite site = new SPSite("http://test-sharepoint/hr/blog/"); //SPContext.Current.Site;
       SPWeb web = site.OpenWeb();
       SPFieldUserValue userName = new SPFieldUserValue(web,22,"Anonymous");

       SPListItem currentItem = properties.ListItem;
       //currentItem["Title"] = userName;  //DateTime.Now.ToString();
       currentItem["Author"] = userName;
       currentItem["Editor"] = userName;
       currentItem.SystemUpdate();
   }

**編集#4:問題が見つかりました。プロジェクトを作成するときに、添付するリストとしてカスタムリストを選択しましたが、投稿またはコメントを選択する必要があり、上記のコードが機能するようになりました!!!

しかし今、私は別の問題を抱えています.ブログのすべての投稿は最初に承認のために送信されます...そして、このため、イベントレシーバーは管理者以外のユーザーに対しては機能しないようです. 投稿またはコメントを直接公開できる管理者アカウントでは問題なく機能しますが、投稿が承認のために送信される投稿権限を持つユーザーの場合、投稿の管理ページに名前が表示されます...これについてどうすればよいですか? 何か案は?**

動作するコード:

   public override void ItemAdded(SPItemEventProperties properties)
   {
       base.ItemAdded(properties);

       SPSite site = new SPSite("http://test-sharepoint/hr/blog/"); //SPContext.Current.Site;
       SPWeb web = site.OpenWeb();
       SPFieldUserValue userName = new SPFieldUserValue(web, 23, "Anonymous");

       SPListItem currentItem = properties.ListItem;
       currentItem["Author"] = userName;
       currentItem["Editor"] = userName;
       currentItem.SystemUpdate();
   }
4

1 に答える 1

0

編集 #4 への対応として、SharePoint を使用しているときに、コードが管理者アカウントで実行されたときに機能するが、「通常の」アカウントで実行されたときにコードが機能しない場合は、パーミッションが原因である可能性があります。

SharePoint/WSS: 「作成者」フィールドを変更しますか?という質問への回答を参照してください。Author フィールドを変更する SPItemEventReceiver の例。

注: 多くの SharePoint 開発者は、RunWithElevatedPrivileges偽装の使用を推奨せず、代わりに使用することを提案しています。どの状況でSPSecurity.RunWithElevatedPrivilegesとsuperusertoken を使用しますか? 詳細については。

于 2013-03-23T15:01:06.197 に答える