使用事件接收器更新项目的“标题”字段

时间:2009-08-10 13:12:57

标签: sharepoint listitem event-receiver

我编写了一个事件接收器,它在“页面”列表的“ItemAdded”事件中激活。代码运行正常,但我的问题是这个 - 在调用我的Sub ItemAdded期间,我想更改属于当前列表项的字段的值(在本例中为aspx页面)。

我的想法是,我可以将“标题”字段配置为我的事件接收器配置的另一个值,并且当用户在编辑模式下看到页面时,将为页面保存新标题。这是我目前的尝试:

Public Overrides Sub ItemAdded(ByVal properties As Microsoft.SharePoint.SPItemEventProperties)

 Dim newItem As SPListItem = properties.ListItem
 Dim currentSiteTitle As String = properties.OpenWeb().Title

 UpdateItemTitle(newItem, currentSiteTitle)
 newItem.Update()
 'newItem.SystemUpdate()

End Sub

正如您所看到的,我已尝试过Update()和SystemUpdate(),但在每种情况下,当用户尝试检入页面时,他们会收到一条消息,表明该页面已在外部进行了修改。另外,在查看页面时,标题字段值没有改变。

我正在尝试做什么,或者有更好的方法吗?

干杯。 雅各

4 个答案:

答案 0 :(得分:3)

更改properties.afterproperties将解决保存冲突。请注意,afterproperties是一个哈希表,但您可以访问它:

properties.AfterProperties [“Title”] =“我的新标题”;

答案 1 :(得分:2)

ItemAdd ed 名称说明了一切。它是在添加Items之后发生的异步事件,因此你的calse问题也是如此。我建议您挂钩ItemAdding事件,除非您有理由不这样做。

请参阅Link了解有关Asynchronous&amp ;;的详细信息同步

答案 2 :(得分:0)

实现此目的的最佳方法是使用ItemAdd ing 事件。这将允许您在将标题值保存到数据库之前更改它。尝试在ItemAdded中更改它们是可能的,但会引起您遇到的麻烦。

你有没有尝试过ItemAdding?

答案 3 :(得分:0)

现在继续上面的内容,我发现当我与一个讨论组合作时,我可以更改列表项中任何字段的唯一位置是ItemUpdating方法,我可以在其中将新值分配给属性。 AfterProperties哈希对应于前面提到的项目名称。

不幸的是,当一个新的回复被添加到讨论中时,似乎没有自动运行(可能是在其他列表相关的场景中)但是如果我将代码放入ItemAdded方法(ItemAdding也没有被触发)我发现它正在运行,但我无法从那里更改项目,所以我在itemAdded中得到了类似的东西:

  public override void ItemAdded(SPItemEventProperties properties)
    {
        SPListItem item = properties.ListItem;
        item.Update();
    }

这样做的结果是该字段已更新但不在显示之前,因此当用户被定向到输出页面时,列表将看起来像之前一样,但如果您更改视图或者查看回复的详细信息,您会发现它实际上已按预期更改。

这对我来说已经足够了,因为我希望我的大部分回复都能通过电子邮件到达。