【问题标题】:Best Practices for Content Types in SharePointSharePoint 中内容类型的最佳做法
【发布时间】:2011-01-04 09:50:22
【问题描述】:

最近,我们在生产农场中遇到了内容类型的严重问题。我想先解释一下这个问题的背景。

我们为生产和测试场中的内容类型安装提供了很好的工作功能。我们在 Visual Studio 中开发和部署(使用 wsps)此 SharePoint 功能。我们正在使用publishing pages 使用页面布局和内容类型来帮助内容编辑器快速发布网页。不幸的是,某些内容类型和网站栏已由生产中的某些人手动更新/添加,因此每当我(开发人员)对现有内容类型进行一些更改(使用 Visual Studio 和功能激活/停用)时,SharePoint 会删除一个或内容类型中的两列(在功能激活/停用期间);或未以最佳实践方式添加的列。我认为最佳做法是使用 Visual Studio 更新内容类型。

现在,我希望确保不会在功能激活/停用时从内容类型中删除网站栏。

注意:我们的内容类型激活/停用功能在 feature.xml 中不包含任何激活依赖项

【问题讨论】:

  • 抱歉,我帮不了您 - 您更有机会通过 SharePoint 找到 SharePoint 专家
  • 感谢格雷格!我也会在那里问同样的问题
  • 我不确定该网址是否正确,但当前用于 SharePoint 问题的 StackExchange 网站是 sharepoint.stackexchange.com

标签: sharepoint


【解决方案1】:

推荐方法

基于所有这些因素,我的建议是:

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

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

• 如果您想通过更改除字段类型之外的几乎所有内容来更新站点列,请使用功能接收器执行此操作。通过执行此操作,您可以调用 Update 方法并传入一个布尔值,指示您是否希望从该站点继承的所有现有资产都更新到,(这是您无法通过 CAML 执行的操作。)

• 您还可以将现有的站点栏(您通过 CAML 功能提供的)添加到现有的内容类型(通过 CAML 功能提供的)。如果 Column 之前不是该 Content Type 的一部分,这将很有帮助。

• 在我刚刚在上一个要点中提到的场景中,有必要在调用您的功能接收器之前停用和响应 CAML 功能(以配置新资产)。这对网站意味着什么?由于网站列表中的所有网站栏和内容类型都使用与网站集根目录中配置的 ID 相同的 ID,因此从网站集中删除其父级不会改变这一点。它可能会暂时使其处于孤立状态(即,该项目与站点集合根目录中的项目之间没有关系,但它会以与以往相同的方式运行,因为它实际上是原始项目的功能齐全的副本)直到您重新激活将项目放回网站集中的功能。就像您停用该功能时父母正在度假,而当您再次激活该功能时父母正在回家一样。 您可以选择如何维护 CAML 和特征接收器,因为您有两种方案:现有网站集和新网站集。

• 您可以制定一项策略,即每次在功能接收器中编写代码以更新站点列或内容类型时,您也必须在 CAML 中进行更改。这意味着每次您在“新”网站集中激活 CAML 功能时,CAML 都是最新且准确的;无需运行“更新程序”功能。 (在您的功能接收器中,您应该确保进行一些额外的检查,以确保站点列在添加之前不属于内容类型等,以防在代码执行之前更改已经到位。)这种方法意味着您在创建新网站集时只需执行一个功能,但这也意味着您在两个地方维护更改:在功能接收器中对现有网站进行更改,在 CAML 中对新网站进行更改。这是一种更简洁的方法,但也包含冗余元素,这总是为人为错误留下空间。

• 另一种方法是简单地假设每次激活基本 CAML 功能时,您总是要执行功能接收器。这种方法表明,您更改 CAML 的唯一时间是添加新的站点列或新的内容类型;否则,所有更改都发生在 Feature Receiver 中。这种方法减少了冗余,但也意味着随着时间的推移,您的所有更改都会使您的功能接收器代码变得非常大,并且随着时间的推移,它可能会使您的 CAML 变得非常“遗留”。

源:http://blog.beckybertram.com/Lists/Posts/Post.aspx?List=eb3e1762%2Dbab0%2D4e96%2D8bc5%2Dd67d6e6bfd44&ID=18

【讨论】:

    【解决方案2】:

    更新内容类型仍然是 Sharepoint 的未开发部分之一,这有时会导致麻烦,尤其是在内容部署方案中。

    在您的情况下,最好的办法是始终避免手动(使用 UI)对内容类型进行任何更改

    无论何时安装内容类型,请确保删除之前的内容类型,然后安装新的内容类型。 (有时这是不可能的,因为已经从中创建了页面)。

    【讨论】:

    • 如果您拥有超过 10k 个站点和子站点,情况会更加混乱。
    • 我同意。发生的情况是,如果您更新内容类型,更改不会在所有站点、子站点中传播。在这种情况下,我们可以使用一个简短的工具来迭代并进行更改
    • 我想我更喜欢使用单独的功能(使用功能接收器)为我们更新内容。
    • 多个部署环境怎么样,所以你可以手动更新它们,然后在每个环境中运行你的工具......我同意 Free styler 这里......你的建议很荒谬。
    【解决方案3】:

    我目前部署内容类型的方法是尽可能使用代码而不是 CAML。这样就很容易完全控制更新的逻辑,包括确保手动进行的更改不会引起冲突。我将结构定义为接口上的属性,我也用于强类型列表访问,但还有其他几种方法可以做到这一点。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-11
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多