【问题标题】:EventReceiver not Firing on SharePoint ListEventReceiver 未在 SharePoint 列表上触发
【发布时间】:2012-09-13 03:00:49
【问题描述】:

我正在尝试为博客站点(用于帖子列表)创建 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:更多进展,此代码适用于列表,但不适用于 Posts 或 Comments 列表,因为它不会更改 Created By 字段。难道是因为所有项目的批准/拒绝???无论是已批准还是未决,它仍然不会显示匿名,但就像我提到的,它在不同的列表中可以正常工作。

   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();
   }

**EDIT #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();
   }

【问题讨论】:

  • 尝试按照本指南查看您是否已执行其中提到的所有步骤:dotnetcurry.com/ShowArticle.aspx?ID=649。另一件事是您可以修改您的代码以使用properties 参数中的ListItem(或ListItemId),您应该在ItemAdded 事件接收器中可用。这样您就可以避免每次都更新所有项目。
  • 感谢您的回复,我确实尝试过使用 properties.ListItem 而不是遍历所有项目,但它仍然不起作用。我将在原始帖子中粘贴我的代码...
  • 代码是否真的在运行,但没有改变字段的值,你可以调试它吗?如果是这样,请使用调试器验证是否没有引发异常并且所有行都运行。我还假设具有 3 个参数的 SPFieldUserValue 构造函数应该将同一查找用户的 id 和值作为目标。尝试将其更改为SPFieldUserValue userName = new SPFieldUserValue(web, "Anonymous");。匿名用户应该直接添加到 SharePoint 用户中(如果您只添加他所在的 AD 组,而不是用户本人,则可能不起作用)。
  • 我实际上已经尝试将用户添加到直接添加到 SHarePoint 用户以及 SharePoint 组中,但没有。有趣的是,如果我只是这样做 --properties.ListItem["Title"] = "Test Title"; properties.ListItem.Update();-- 它可以工作并更改标题,问题是它不适用于列表的 Created By 列。调试器遍历我相信的所有行,没有例外,但是,我不能放置断点,因为他们说没有加载符号,我已经尝试了很多帖子来解决这个问题,但没有任何效果。还有其他想法吗?
  • 谢谢卢卡斯!我现在让它在列表上工作,但前提是我是管理员角色。由于普通用户需要在发布之前提交帖子以供批准,因此他们发布时会显示他们的名字但是,由于我是管理员,我可以自动发布我的帖子并且名称不会显示,它说匿名。还有什么我需要考虑的,以便普通用户也会显示为匿名用户吗?有什么想法吗?

标签: list sharepoint event-handling event-receiver


【解决方案1】:

针对编辑 #4,在使用 SharePoint 时,如果代码在由管理员帐户执行时有效,但在由“普通”帐户执行时无效,则可能是权限问题。

有关修改 Author 字段的 SPItemEventReceiver 示例,请参阅问题 SharePoint/WSS: Modify “created by” field?answer

注意:许多 SharePoint 开发人员建议不要使用 RunWithElevatedPrivileges,而是建议使用模拟。有关详细信息,请参阅我的answer 问题In which situation use SPSecurity.RunWithElevatedPrivileges with superusertoken?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    相关资源
    最近更新 更多