事件疑难解答

上次修改时间: 2015年3月9日

适用范围: SharePoint Foundation 2010

本文内容
文档库和内容类型
列表和内容类型
文档库
Web

对事件进行编程会导致异常行为,具体取决于在其中实现事件处理程序的上下文。下面描述与您在编写代码时可能遇到的特定上下文相关的事件行为。

事件行为分为 4 个类别:

  • 文档库和内容类型

  • 列表和内容类型

  • 文档库

  • Web

文档库和内容类型

问题

说明

问题 1

在文档库中创建了一个特定内容类型的 .aspx 页。该页与 ItemAddingItemAdded 事件相关联。但不会引发这些事件。

解决方案:将文件上载到文档库时,系统会为其分配一个默认内容类型。但是,如果您上载文件,然后为其分配一种内容类型(例如内容类型"A"),则会导致在将该文件添加到文档库中后,该文件的内容类型从默认值更改为内容类型"A"。

在此情形下,如果内容类型"A"具有到 ItemAdding/ItemAdded 和 ItemUpdating/ItemUpdated 的事件绑定,则当您向文件分配新内容类型"A"时,不会引发 ItemAdding/ItemAdded 事件。但是,在此情形下会引发 ItemUpdating/ItemUpdated 事件。

如果使用"新建文档"功能(而不是上载文档)来直接从内容类型创建文件,则会成功引发 ItemAdding/ItemAdded 事件,以及 ItemUpdating 事件。

问题 2

在上载不属于某内容类型的文档时,也会引发绑定到该内容类型的 ItemAdding 事件。请注意,系统会首先为上载到文档库的每个文档分配默认内容类型。因此,在将文档添加到文档库中时,如果 ItemAdding\ItemAdded 事件绑定到默认内容类型,则会引发这些事件。

解决方案:可在更新阶段更改文档的内容类型,并据此调整内容类型标识符 (ID)。

问题 3

通过列表表单删除项目的请求不提供关联的内容类型 ID。因此会对所有列表项(而不仅仅是特定内容类型的项目)引发 ItemDeletingItemDeleted 事件。即使仅为指定内容类型注册事件,也会出现这种情况。

解决方案:按照设计,当请求未绑定到内容类型时,SharePoint Foundation 会对所有列表项引发事件。这样,当为列表中的所有项目注册事件接收器时,会对所有项目引发事件。

此行为会影响与 Delete 事件有关的策略。如果实现涉及删除的策略并将该策略应用于内容类型,然后将内容类型绑定到列表,则该策略将应用于列表中的所有项目,而不只是应用于它所应用于的内容类型的项目。

列表和内容类型

问题

说明

问题 1

对绑定到列表的内容类型注册 ItemUpdating 事件时,会发生该事件,即使通过对象模型更新不属于该内容类型的项目也是如此。请注意,SharePoint Foundation 会返回 0(零)作为内容类型 ID,而不是项目的内容类型 ID。

解决方案:无。

问题 2

不对 UserInformation 列表类型引发列表事件。

解决方案:无。

文档库

问题

说明

问题 1

在将新内容类型添加到绑定了事件的列表中时,可能会引发其中一些事件,因为在将内容类型绑定到列表时可能出现一些干扰因素,例如有时会添加文件(如 Template.doc)、更新文档或添加新字段。

解决方案:只有"共享文档"文档库会出现此行为,而自定义文档库不会出现。对于"共享文档",添加内容类型会创建 Forms/<Content Type> 文件夹并将 Template.doc 文件复制到该文件夹中,这将导致发生这些事件。

问题 2

使用 WebDAV 在"资源管理器"视图中向文档库中添加文档时,会调用 ItemAdding(SPItemEventProperties)ItemAdded(SPItemEventProperties) 方法一次,但会调用 ItemUpdating(SPItemEventProperties)ItemUpdated(SPItemEventProperties) 方法两次。

解决方案:无。此行为是设计使然,因为在"资源管理器"文件夹视图中添加文件时所涉及的内部进程必须调用这些方法两次。

问题 3

在"资源管理器"视图中使用 WebDAV 重命名文档库中的文件时,重命名事件 会引发 ItemUpdating(SPItemEventProperties)ItemUpdated(SPItemEventProperties) 事件,除非您在重命名该文件时,还更改了文件扩展名

解决方案:无。

Web

问题

说明

问题 1

对于 WebAdding(SPWebEventProperties)WebProvisioned(SPWebEventProperties) 方法,当父站点是根网站时,ServerRelativeUrl 属性为空。

解决方案:WebAdding 事件上的 ServerRelativeUrl 属性的正确值是父站点的 URL。WebProvisioned 事件上的正确值是新创建的子网站的 URL。

问题 2

将事件接收器状态设置为 WebDeleting(SPWebEventProperties)SiteDeleting(SPWebEventProperties) 事件中的 CancelNoError 会导致重定向到指示网站已被删除的错误页面。

解决方案:无。引发该事件后,控件只返回调用方。未删除该网站。

问题 3

将字段添加到列表中时,将事件接收器状态设置为 FieldAdding(SPWebEventProperties) 事件中的 CancelNoError 会导致重定向到指示该列不存在的错误页面。

解决方案:无。引发该事件后,控件只返回调用方。未删除该列。

问题 4

尝试从项目中删除附件时,将事件接收器状态设置为 ItemAttachmentDeleting(SPWebEventProperties) 事件中的 CancelNoError 会导致重定向到指示"异常来自 HRESULT"错误的错误页面。

解决方案:无。引发该事件后,控件只返回调用方。