SharePoint中内容类型的最佳实践

7
最近,在内容类型生产环境中,我们遇到了一个严重的问题。首先我想解释一下这个问题的背景。
我们在生产和测试环境中开发了一个不错的内容类型安装功能。使用Visual Studio,我们开发并部署了(使用wsps)这个SharePoint功能。我们使用发布页面使用页面布局和内容类型来帮助内容编辑人员快速发布网页。不幸的是,一些内容类型和站点列已由一些人手动更新/添加到生产环境中,因此每当我(开发人员)对现有内容类型进行更改(使用Visual Studio和功能激活/停用),SharePoint就会从内容类型中删除一个或两个列(在功能激活/停用期间),或者那些没有按最佳实践方式添加的列。我认为最佳实践是使用Visual Studio更新内容类型。
现在,我希望确保在功能激活/停用时,站点列不会从内容类型中删除。
注意:我们的内容类型激活/停用功能在feature.xml中没有任何激活依赖项。

抱歉,我无法帮助您 - 您在[sharepoint.se]上找到SharePoint专家的机会更大。 - Greg Sansom
谢谢Greg!我也会在那里问同样的问题。 - code master
2
我不确定那个URL是否正确,但当前用于SharePoint问题的StackExchange网站是http://sharepoint.stackexchange.com。 - David Clarke
3个回答

5

推荐方法

综合考虑所有因素,我的建议是:

• 创建两个功能:一个用于原始标记,另一个用于更改。 (或者您可以将它们放在同一个功能中;我只是想区分您在哪里进行操作。)

• 原始功能应包含网站列和内容类型的 CAML。 这确保了 ID 在类型之前被分配并保持不变。

• 如果要通过更改几乎任何关于其字段类型以外的内容来更新网站列,请使用功能接收器。通过这样做,您可以调用 Update 方法并传递一个布尔值,指示是否希望所有从此继承的现有资产进行更新(这是您无法通过 CAML 实现的)。

• 您还可以将现有网站列(通过 CAML 功能进行配置)添加到现有内容类型(通过 CAML 功能进行配置)。如果该列以前不属于该内容类型等,则此功能很有帮助。

• 在如上述的场景中,需要在调用功能接收器之前停用并重新激活CAML功能(以提供新资产)。这对网站意味着什么?由于网站中列表中的所有网站列和内容类型都使用与在网站集根目录中提供的ID相同的ID,因此从网站集中删除其父项不会改变它。它可能暂时被留下孤立(即该项与网站集根目录中的项之间没有关系),但它将像以前一样正常工作,因为它实际上是原始项目的完全功能副本,直到您重新激活将该项放回网站集的功能。就像当您停用功能时父母去度假,而当您再次激活功能时回家一样。 在维护CAML和功能接收器方面,您有两种情况可供选择:现有网站集和新网站集。
• 您可以制定一个策略,每次在功能接收器中编写代码以更新网站列或内容类型时,都必须在 CAML 中进行更改。这意味着每次在“全新”的网站集中激活 CAML 功能时,CAML 将是最新和准确的;没有运行“更新程序”功能的必要。(在您的功能接收器中,应确保在添加网站列之前对其进行额外检查,以确保其不已经属于内容类型等,以防代码执行之前已经进行了更改。)这种方法意味着您只需要执行一个功能来创建新的网站集,但也意味着您需要在两个位置维护更改:用于对现有站点进行更改的功能接收器和用于新站点的 CAML。这是一种更清晰的方法,但也包含了冗余的元素,这总是会留下人为错误的空间。
• 另一种方法是假设每次激活基本的CAML功能时,您总是会执行功能接收器。这种方法认为您只会在添加新站点列或新内容类型时更改CAML;否则,所有更改都在功能接收器中发生。这种方法减少了冗余,但也意味着随着时间的推移,您的功能接收器代码可能会变得非常庞大,并且可能会使您的CAML成为非常“遗留”的状态。
来源:http://blog.beckybertram.com/Lists/Posts/Post.aspx?List=eb3e1762%2Dbab0%2D4e96%2D8bc5%2Dd67d6e6bfd44&ID=18

1

更新内容类型仍然是Sharepoint中未完善的部分之一,有时在内容部署方案中会引起麻烦。

在您的情况下,最好总是避免手动更改内容类型(使用UI)。

无论何时安装内容类型,请确保删除先前的内容类型,然后再安装新的内容类型。(有时由于页面已经从它创建而出,这是不可能的)。


如果您有超过10,000个站点和子站点,情况会更加混乱。 - code master
我同意。发生的情况是,如果您更新内容类型,则更改不会在所有站点、子站点中传播。在这种情况下,我们可以使用一个简短的工具来迭代并进行更改。 - Madhur Ahuja
我认为我更喜欢使用单独的功能(使用功能接收器)来为我们执行更新操作。 - code master
多个部署环境怎么办?你会手动更新它们,然后在每个环境中运行你的工具吗?我同意Free styler的观点... 你的建议是荒谬的。 - dbobrowski

1

我目前部署内容类型的方法是尽可能使用代码而不是 CAML。这样可以轻松完全控制更新逻辑,包括确保手动更改不会导致冲突。我将结构定义为接口上的属性,我还使用它进行强类型列表访问,但您可以使用其他几种方式。

API 中唯一不可用的部分是设置特定内容类型 ID,因此您需要一个 CAML 文件,但它是一个小型/简单文件,不会尝试进行更新,并且仅从运行更新代码的功能引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接