2012-09-20 30 views
1

我正在尝试为博客网站(针对帖子列表)创建一个EventReceiver,并且在使其工作时遇到了一些麻烦。我想将创建者列更改为匿名。基本上,我在控制台应用程序中使用了整个工作,但是,只有在执行控制台应用程序时才会更改“创建者”列名称。EventReceiver不会在SharePoint列表中触发

无论何时将新项目添加到列表中,我都需要它来更改创建者。我的代码如下....我如何修改这个在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,这是我在一个活动Recevier项目,但没有运气尝试。它只是不改变创建领域,或任何字段为此事(我试过的标题为好)

 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:好吧,我发现我的问题,创建项目时,我选择了自定义列表作为我的列表附加到,但我需要选择帖子或评论,现在上面的代码工作!

但现在我有另一个问题,博客上的所有帖子都首先提交审批......并且由于此事件接收器似乎不适用于管理员以外的其他用户。它适用于管理员帐户,我可以直接发布帖子或评论,但对于具有Contribute权限的用户,帖子已提交给审批人的用户仍然可以在“管理帖子”页面上显示他们的姓名......我该怎么做?任何想法**

,工程代码:

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

请尝试按照本指南来查看您是否执行了此处提及的所有步骤:http://www.dotnetcurry.com/ShowArticle.aspx?ID=649。另一件事是,你可以修改你的代码,以使用'ItemAdded'事件接收器中可用的'properties'参数中的'ListItem'(或'ListItemId')。这样你可以避免每次更新所有项目。 –

+0

感谢您的回复,我实际上尝试使用properties.ListItem而不是遍历所有项目,但它仍然不起作用。我将在原始帖子中粘贴我的代码... –

+0

代码是否实际运行,但不会更改字段的值,您可以调试它?如果是这样,请用调试器验证是否没有抛出异常并且所有行均已运行。我还假设具有3个参数的'SPFieldUserValue'构造函数应该将同一个查找用户的id和值作为目标。尝试将其更改为“SPFieldUserValue userName = new SPFieldUserValue(web,”Anonymous“);'。应该直接将匿名用户添加到SharePoint用户(如果您仅添加他所在的AD组,但不添加用户本身,则可能无法正常工作)。 –

回答

0

针对编辑#4,与SharePoint工作时,如果当管理员帐户执行的代码工作,但当通过执行不工作一个“正常”的账户,权限很可能会受到责备。

有关修改作者字段的SPItemEventReceiver示例,请参阅answerSharePoint/WSS: Modify “created by” field?

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

相关问题