SharePoint:复制SPListItem时将源ContentType应用于目标

时间:2010-01-17 18:49:08

标签: sharepoint moss copy splistitem

问候,

我编写了自己的ContentType定义,可以应用于任何文档库。当用户将该项目复制到尚未附加我的ContentType定义的文档库时,我希望通过我的ContentType保留与项目关联的数据。

显而易见的是,要抓住新项目的ItemAdding或ItemUpdating事件,查看源项目以查看我的ContentType是否与之关联,然后将我的ContentType添加到目标文档实际发生复制之前的库。

问题是,我在这些事件中找不到告诉我源项目是什么的信息。唯一的此类数据是在最终的ItemUpdated事件中,但到那时为时已晚......项目已被复制,与我的ContentType相关联的数据被丢弃。

任何人都对如何获得我想要的行为有任何想法?

TIA提供任何帮助!

史蒂夫

PS:我想我可以做的一件事是在ItemUpdated事件中获取源Url,然后编写代码以添加ContentType,并手动将源中与该类型相关联的数据移动到目标。与我上面提出的解决方案相比,这似乎非常不优雅。

2 个答案:

答案 0 :(得分:0)

我明白了!答案是源URL位于ItemUpdating事件属性的AfterProperties字段中。你这样得到它:

properties.AfterProperties["_CopySource"];

我查看了这个字段,但是由于该对象中有一个成员在调试器中显示“Count = 0”这一事实引发了这种情况。我误解了这意味着那里什么也没有,但事实证明,那个数与那里有多少属性无关。糟糕!

不幸的是,我试图做的仍然不起作用。即使我在ItemUpdating事件中将我的ContentType添加到目标库,也不会复制与该类型相关联的字段。哦,好吧......

答案 1 :(得分:0)

只是跟进,以防有人对我的问题的最终解决方案感兴趣...

我做了什么来获得我想要的行为:

  1. 将我的代码移至ItemUpdated事件处理程序,以便在副本完全发生后我正在运行。

  2. 获取源项目URL(请参阅先前的答案)并将其解析为源SPList和SPListItem

  3. 查看我的ContentType是否在源中但不在目的地。

  4. 如果ContentType不在目标中,请在目标中安装ContentType并手动将该ContentType中的属性(通过查询ContentType本身)从源复制到目标。

  5. 此过程仅适用于复制到目标lib的第一个项目。之后,目标类型中已存在ContentType,SP本身会将该类型的字段值从源复制到目标。