我正在尝试为博客站点创建一个EventReceiver(用于帖子列表),但是在使用它时遇到了一些麻烦。我想将Created By列更改为Anonymous。基本上我在控制台应用程序中使用了这一切,但只会在执行控制台应用程序时更改Created By列名。
每当新项目添加到列表中时,我都需要它来更改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字段或任何字段(我也尝试了标题) 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 :(得分:0)
为了响应编辑#4,在使用SharePoint时,如果代码在由管理员帐户执行时有效,但在由“普通”帐户执行时无效,则权限可能会受到指责。
有关修改“作者”字段的SPItemEventReceiver示例,请参阅问题answer的SharePoint/WSS: Modify “created by” field?。
注意:许多SharePoint开发人员建议不要使用RunWithElevatedPrivileges
并建议使用模拟。有关详细信息,请参阅问题answer的In which situation use SPSecurity.RunWithElevatedPrivileges with superusertoken?。