我正在为我的一个SPL使用ItemAdding事件。问题是如何从SPItemEventProperties获取新的尚未添加的项目?我试过ListItem.Item但debuger显示该属性设置为Nothing。有任何更正建议吗?
最好的问候
T.S。
答案 0 :(得分:4)
Ihe ItemAdding event在之前触发实际添加了一个,但是您无法使用.Item访问这些字段。
但是,您可以在.AfterProperties哈希表中访问除ID之外的所有内容(因为它尚未创建)。
好的代码示例
答案 1 :(得分:2)
首先,它取决于您的事件接收器是在列表还是文档库上运行。
查看此网站,了解填充BeforeProperties
,AfterProperties
和properties.ListItem
时的便捷表格。
编辑:链接已死 http://www.synergyonline.com/blog/blog-moss/Lists/Posts/Post.aspx?List=fcb287b5%2D7a1a%2D4206%2Da04f%2D2a97805e4a25&ID=25。我使用Wayback Machine https://web.archive.org/web/20100623125934/http://www.synergyonline.com/blog/blog-moss/Lists/Posts/Post.aspx?List=fcb287b5-7a1a-4206-a04f-2a97805e4a25&ID=25救出了内容。
众所周知,事件接收器是挂钩各种SharePoint事件的好方法。这些可以应用于功能事件,如FeatureActivated,List事件,如FieldAdded,以及许多其他事件。但是,最常用的接收器集是SPItemEventReceiver的一部分,它允许您将代码连接到列表或库中的项目可能发生的许多事件。
在处理事件时,您会很快发现存在之前(同步)和之后(异步)事件,并且方法后缀如“ing”(例如ItemAdding)和“ed”(例如ItemAdded)将告诉您是否在实际更改之前或之后调用它。基本的东西。
而且,随着你越来越深入,你甚至会发现你可以提取变化的前后状态。例如,您可以挂钩文档库的ItemUpdating事件,并阻止用户更改某个列。代码可能如下所示:
public override void ItemUpdating(SPItemEventProperties properties)
{
if (properties.BeforeProperties["column"] != properties.AfterProperties["column"])
{
properties.Cancel = true;
properties.ErrorMessage = "This column cannot be changed";
}
}
对于文档库,这很好用。但是,您应该知道未为列表中的项填充BeforeProperties哈希表。正如SDK中所述:“对于文档,保证Post事件的Before和After属性,例如ItemUpdated,但Before属性不适用于列表项上的帖子事件”
当他们说“不适用于列表项目的帖子事件”时,它们是指事件之后(如ItemUpdated,ItemDeleted等)吗?这里的措辞很奇怪,所以我想我需要一些时间来测试每个常见事件的组合,例如添加,更新和删除。这些是在自定义列表和文档库中完成的。每个测试都涉及添加新项目,编辑项目然后删除项目。以下是列表的结果:
List BeforeProperties AfterProperties properties.ListItem
ItemAdding No value New value Null
ItemAdded No value New value New value
ItemUpdating No value Changed value Original value
ItemUpdated No value Changed value Changed value
ItemDeleting No value No value Original value
ItemDeleted No value No value Null
没有值意味着哈希表中的列值不可用 新值表示该列的正确值可用 更改的值意味着可以使用正确的更新值。 原始值表示可以使用正确的原始值。
以下是针对文档库的相同测试:
Library BeforeProperties AfterProperties properties.ListItem
ItemAdding No value No value Null
ItemAdded No value No value New value
ItemUpdating Original value Changed value Original value
ItemUpdated Original value Changed value Changed value
ItemDeleting No value No value Original value
ItemDeleted No value No value Null
Properties.ListItem引用事件中该点的列表项的当前值。 Null表示该项目不可用。我的分析得出以下结果:
毫不奇怪,我们为ItemAdding(在添加项目之前)和ItemDeleted(在删除项目之后)获取空值。这是前一段时间Ishai Sagi证明的。 正如SDK中正确记录的那样,列表的项事件不会公开BeforeProperties。 ItemAdding和ItemAdded正确报告AfterProperties中列表项的值,但不报告库项目。这很奇怪。 在ItemDeleted事件期间,我们对先前的状态没有可见性。一旦它被删除,它就会消失。
所以,如果我们回到上面列出的原始问题。我们如何阻止用户更改列表事件中某个项目的某个列?从列表中,您可以看到我们是否挂钩到ItemUpdating事件,我们可以将当前项的值(properties.ListItem)与AfterProperties值进行比较。代码如下所示:
if (properties.ListItem["column"] != properties.AfterProperties["column"])
{
properties.Cancel = true;
properties.ErrorMessage = "This column cannot be changed";
}
我希望这篇文章能让您更好地了解事件之前和之后如何为列表和库工作。欢迎您的意见和反馈。