我有一个网站内容类型,用于整个网站集中的少数列表。在该内容类型中,我描述了一个事件接收器来处理 ItemAdding 事件。这工作正常。现在我需要更新内容类型,以便同时处理 ItemUpdating。在我的脑海中,我尝试简单地修改我的内容类型的 xml,因为这似乎允许简单的版本跟踪。从某种意义上说,这很有效,因为我的更新应用于站点内容类型,但没有应用于我一直使用此内容类型的列表。这是预料之中的。然后我注意到 SharePoint SDK 对此持冷淡的看法:
在安装并激活该内容类型之后,在任何情况下都不应更新该内容类型的内容类型定义文件。Windows SharePoint Services 不跟踪对内容类型定义文件所做的更改。因此,您无法将对站点内容类型所做的更改下推到子内容类型。
SDK 然后指向几个部分,这些部分描述了如何使用 UI 或代码来推送更改。由于 UI 没有提供事件接收器的挂钩,我想我将选择代码路径。
我想我可以做这样的事情,只需将一个新的事件接收器添加到列表的内容类型副本中:
SPList list = web.Lists["My list"];
SPContentType ctype = list.ContentTypes["My content type"];
// Doesn't work -- EventReceivers is null below.
ctype.EventReceivers.Add(SPEventReceiverType.ItemUpdating,
"My assembly name", "My class name");
但问题是 ctype.EventReceivers 在这里为空,即使我已经将 ItemAdding 连接到这个列表。它似乎已移至列表本身。因此,该列表具有有效的 EventReceivers 集合。
SPList list = web.Lists["My list"];
list.EventReceivers.Add(SPEventReceiverType.ItemUpdating,
"My assembly name", "My class name");
所以,我有几个问题:
- 只是将任何新的事件接收器直接添加到列表中而完全忘记我的内容类型是正确的方法吗?
- 为了完成这种变化,在配置管理方面处理这个问题的最佳方法是什么?我应该创建一个简单的控制台应用程序来查找所有适当的列表并修改每个列表吗?还是以某种方式创建功能是更好的选择?无论哪种方式,似乎这种变化都会自行消失,并且可能需要使用这种内容类型的未来开发人员很难发现。