WSS3SDK之:更新子内容类型

来源:互联网 发布:淘宝无线排名查询 编辑:程序博客网 时间:2024/05/16 18:48

每个内容类型都包含了其所基于的网站内容类型的引用。这使得WSS可以传播,或者推送对于父内容类型的变更到其子网站或列表内容类型。
当您修改某内容类型后,您可以选择推送这些改动到所有子级。当推送操作拷贝变化到基于该内容类型的网站或列表内容类型时,他并不会覆盖整个内容类型。相反,进行覆盖的范围会根据是通过用户界面还是对象模型而有所不同。

通过用户界面更新子内容类型

当您通过用户界面编辑一个网站内容类型,并在内容类型设置页面进行修改后,所有页面中包含的设置都会通过推送进行覆盖。因此,我们推送的粒度是由分组在各页上的设置决定的。每次您在内容类型设置页面中进行的任何改动后,该页上所有的设置项都会在推送操作中进行覆盖。

下面是各内容类型设置页所包含设置的一个摘要:
  • 高级设置 该页面包含下列设置项:
    • 文档模板URL

    • 文档模板文件本身, 如果您在网站中选择了一个已存在的模板或者上传了一个模板

    • 只读属性
  • 新建栏设置 该页用来管理新建到内容类型中的栏。
  • 栏设置   该页面包含下列设置项:

    • 必填

    • 隐藏
    • 从内容类型中移除栏

通过对象模型更新子内容类型

对象模型我推送操作提供了更粗的粒度。当我们通过对象模型更改了某个网站内容类型后,代码实际上只是更改了该内容类型在内存中的表现。仅仅当我们调用Update方法后,WSS才会提交这些更改到网站数据库中。

下面的例子中,通过代码给一个网站内容类型Specification添加了两栏,然后推送更改到所有子内容类型。

C#

SPWeb web = GetSPWeb();
SPContentType myCT 
= web.ContentTypes["Specification"];
myCT.Fields.Add(Field1);
myCT.Fields.Add(Field2);
myCT.Update();

更新自定义设置到子内容类型

您也可以在XML文档的粒度上通过对象模型推送自定义设置。每个内容类型都有一个XML文档集合,第三方解决方案可以用来存储自定义设置信息。我们可以通过推送操作覆盖特定的XML文档。要注意的是WSS并不会在覆盖前判断该XML文档是否正在被使用或是否是其他过程所必需。您也可以在推送操作中整个删除XML文档。


当更新子内容类型时的考虑

要知道,推送操作会覆盖子内容类型所作的更改,如果这些更改正好落入推送操作粒度的范围内。举例来说,假设您在子内容类型里变更了一栏。如果您随后对父内容类型中的该栏作出其他改变,甚至删除该栏,并推送变化, Windows SharePointServices将覆盖您(或更有可能是其他人)原先在子内容类型上所作的变更。

每个推送操作仅会推送本次对父内容类型所做的更改。如果对其更改后没有推送,您将不能在以后轻易的进行推送。大多数情形下,你只能被迫撤销先前的更改,然后再从新改一遍,再来推送。举例来说,假设您从父内容类型中删除了一栏,但当时不推送这一变化。任何其后的推送操作,都将不包括从子内容类型中删去该列的操作。如果要从子内容类型中删除该列,你将需要在父内容类型中重新添加该栏,再次将它删除,然后执行推送操作。

如果你推送的变化不再适用于子内容类型,这些变化将被忽略。例如,如果您推送栏设顶的变化到一个已被从子内容类型中删除的栏,这些变化将被忽略。 Windows SharePoint Services不会将栏添加回子内容类型。

如果您尝试对标记为只读子内容类型执行推送操作,推动操作将失败,除非您在推送操作中有设置父内容类型为读/写(read/write)的操作。

推送的变化不是一个全有或全无的操作;若推送的变化,对于某一子内容类型未能成功, Windows SharePointServices会继续推送变化到任何余下的子内容类型。在推送结束后, Windows SharePointServices会返回一个过程中错误的清单。

如果子内容类型定义为密封的,推送操作会在该内容类型上失败。

注意

要创建或管理一个网站内容类型,您必须至少是该网站的网站设计者。如果您对某些子网站没有适当的存取权限,推送操作在这些子网站中的内容类型上将会失败。