如何:创建字段呈现模板
上次修改时间: 2010年4月4日
适用范围: SharePoint Foundation 2010
本文内容
呈现模板与呈现控件的关系
呈现模板系统
字段呈现配置
需要多个呈现模板的情形
添加更多模板关联
将 Web 自定义控件用作模板
字段呈现模板是一个 RenderingTemplate 对象,该对象在文件夹 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\controltemplates 中的 .ascx 文件中定义为 RenderingTemplate 元素。将该模板可与呈现控件类的 CreateChildControls 方法一起使用,以便在"新建"、"编辑"或"显示"模式中呈现字段。
呈现模板与呈现控件的关系
RenderingTemplate 对象是一类混合了 Control 和 ITemplate 的对象。它派生自 Control 并仅添加一个新成员,即一个包含 ITemplate 对象的 Template 属性。这使得呈现控件(派生自 TemplateBasedControl)能够间接引用 ITemplate 对象,方法是通过呈现模板的 ID 属性 (ID) 来引用 RenderingTemplate 对象。呈现控件通过使用其具有的若干 String 属性中的一个或多个属性(例如可以包含呈现模板的 ID 的 TemplateName)可以达到此目的。
呈现模板系统
每个字段呈现控件至少具有一个与之关联的字段呈现模板。在呈现时,SharePoint Foundation 会通过搜索 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\CONTROLTEMPLATES 中的 .ascx 文件中声明的所有控件的 ID 来查找所需模板(所有模板在 Web 应用程序启动时加载)。
字段呈现配置
在开发自定义字段类型时最常用的字段呈现配置的模式具有以下特征:
呈现控件与两个呈现模板相关联,并且该控件使用其 TemplateName 和 DisplayTemplateName 属性指定这些模板的 ID。
一个模板在"新建"和"编辑"模式中提供大部分字段呈现。另一个模板在"显示"模式中提供大部分字段呈现。
呈现控件的 CreateChildControls 方法在"新建"模式中将默认值分配给呈现控件的子控件。它在"编辑"和"显示"模式中将字段的当前值分配给子控件。它还可能执行其他"最终完善"呈现工作,如将 CSS 类分配给 Label 子控件。
验证逻辑由字段呈现控件的 Validate、IsValid 和 ErrorMessage 成员以及基础字段类型的 GetValidatedString 方法实现。(CreateChildControls 可能调用 Validate。)
BaseFieldControl 继承自 TemplateBasedControl 和 FieldMetadata 成员,这些成员使它能够链接到多个呈现模板并基于呈现上下文在这些模板之间切换。
需要多个呈现模板的情形
除 Template、TemplateName、DisplayTemplate 和 DisplayTemplateName 外;您还可以使用 AlternateTemplate、AlternateTemplateName。
使用备用模板在主模板不符合您的要求的任意页面上下文中呈现自定义字段。下面列出了一些示例:
如果该字段在一些列表上是必需的,而在其他列表上不是,则可使用与主模板类似、但带红色星号指示符的备用模板来指明该字段在特定列表上是必需的。然后,让 ControlTemplate 的 get 取值函数检查基础字段的 Required 属性,并在适当时返回 Template 或 AlternateTemplate。
如果计划使用几乎以相同方式呈现的多个自定义字段类型,则可通过创建在"新建"和"编辑"模式中使用的单独模板来实现更好的代码重用。前者会将默认值分配给子对象,而后者会分配当前值。这样,您便能够避免在每个自定义字段类型类的 CreateChildControls 方法中重复分配逻辑。然后,ControlTemplate 的 get 取值函数将基于控件模式确定使用的模板。
如果需要在特定网站、网站集或 Web 应用程序中以特殊方式呈现字段,则使用备用模板也会非常有用。例如,请考虑专门为视力受损人员(如色盲)设计的网站。ControlTemplate 的 get 取值函数可检查 RenderContext 的值,以查看是否需要特殊模板,并返回相应的模板。
对于从 SPFieldNumber 继承并且有时(但并非始终)需要以百分比形式呈现的自定义字段类型,具有两个不同的呈现模板可显著节约开发时间。替代 ControlTemplate 的 get 取值函数可响应 SPFieldNumber.ShowAsPercentage 属性的值。
添加更多模板关联
当然,您可以向派生自 BaseFieldControl 的字段呈现控件中添加更多呈现模板关联。建议按照下面的过程操作:
创建 ITemplate 类型的新私有字段。
创建一个新公共属性作为该私有字段的包装,并按如下形式命名该属性:circumstanceTemplate,其中 circumstance 标识您希望在其中使用模板的环境。
创建第二个返回 String 的公共属性,并将其命名为 circumstanceTemplateName。
仅当 circumstanceTemplate 不为 null 时,它的 get 取值函数才应返回私有字段。否则,它应返回由 circumstanceTemplateName 命名的 ITemplate。请使用 GetTemplateByName() 方法执行此操作。
替代 ControlTemplate 的 get 取值函数,以在 circumstance 为 true 时返回 circumstanceTemplate。
将 Web 自定义控件用作模板
您的自定义字段呈现控件还将继承两个特殊的 ITemplate 属性 (Property):CustomTemplate 和 CustomAlternateTemplate。这两个属性 (Property) 以 [PersistenceMode(PersistenceMode.InnerProperty)] 属性 (Attribute) 进行标记。这意味着它们返回的 ITemplate 对象是经过编译的,并且它们作为嵌套标记永久位于字段呈现控件中。使用预编译的模板有许多优点;例如,通过在设计器工具箱中拖放这些模板,可将它们添加到可视化设计器(如 SharePoint Designer 或 Visual Studio)中的页面中。但它们也有缺点。有关 Web 用户控件和自定义 Web 控件的详细信息,请参阅 Web User Controls and Web Custom Controls和 PersistenceModeAttribute。