事件疑难解答
上次修改时间: 2015年3月9日
适用范围: SharePoint Foundation 2010
本文内容
文档库和内容类型
列表和内容类型
文档库
Web
对事件进行编程会导致异常行为,具体取决于在其中实现事件处理程序的上下文。下面描述与您在编写代码时可能遇到的特定上下文相关的事件行为。
事件行为分为 4 个类别:
文档库和内容类型
列表和内容类型
文档库
Web
文档库和内容类型
问题 |
说明 |
---|---|
问题 1 |
在文档库中创建了一个特定内容类型的 .aspx 页。该页与 ItemAdding 和 ItemAdded 事件相关联。但不会引发这些事件。 解决方案:将文件上载到文档库时,系统会为其分配一个默认内容类型。但是,如果您上载文件,然后为其分配一种内容类型(例如内容类型"A"),则会导致在将该文件添加到文档库中后,该文件的内容类型从默认值更改为内容类型"A"。 在此情形下,如果内容类型"A"具有到 ItemAdding/ItemAdded 和 ItemUpdating/ItemUpdated 的事件绑定,则当您向文件分配新内容类型"A"时,不会引发 ItemAdding/ItemAdded 事件。但是,在此情形下会引发 ItemUpdating/ItemUpdated 事件。 如果使用"新建文档"功能(而不是上载文档)来直接从内容类型创建文件,则会成功引发 ItemAdding/ItemAdded 事件,以及 ItemUpdating 事件。 |
问题 2 |
在上载不属于某内容类型的文档时,也会引发绑定到该内容类型的 ItemAdding 事件。请注意,系统会首先为上载到文档库的每个文档分配默认内容类型。因此,在将文档添加到文档库中时,如果 ItemAdding\ItemAdded 事件绑定到默认内容类型,则会引发这些事件。 解决方案:可在更新阶段更改文档的内容类型,并据此调整内容类型标识符 (ID)。 |
问题 3 |
通过列表表单删除项目的请求不提供关联的内容类型 ID。因此会对所有列表项(而不仅仅是特定内容类型的项目)引发 ItemDeleting 和 ItemDeleted 事件。即使仅为指定内容类型注册事件,也会出现这种情况。 解决方案:按照设计,当请求未绑定到内容类型时,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"错误的错误页面。 解决方案:无。引发该事件后,控件只返回调用方。 |