1

我正在尝试为博客站点(用于帖子列表)创建一个 EventReceiver,但在使其正常工作时遇到了一些麻烦。我想将 Created By 列更改为 Anonymous。基本上,我在控制台应用程序中完成了整个工作,但是,它只会在执行控制台应用程序时更改 Created By 列名。

每当将新项目添加到列表中时,我都需要它来更改创建者。我的代码在下面....如何修改它以在 EventReceiver 项目中使用???因为我已经告诉 EventReceiver 项目我希望 EventReceiver 附加到的 URL,所以我不确定我可以从这段代码中删除什么,现在它什么都不做,没有错误,也没有更改 Created By 列时我调试。

   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,这是我在Event Recevier项目中的尝试,但没有运气。它只是不会更改 Created By 字段或任何与此相关的字段(我也尝试了 Title)

       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的问题的回答?更多细节。

于 2013-03-23T15:01:06.197 回答