【发布时间】: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