表单和字段控件

上次修改时间: 2010年4月9日

适用范围: SharePoint Foundation 2010

Microsoft SharePoint Foundation 表单由 ASP.NET 控件组成,这些控件定义表单和表单中的字段和其他元素。SharePoint 控件遵循一类控件层次结构,此层次结构中包含一个所有控件派生自的基控件。

SharePoint 表单中使用的控件均在 Microsoft.SharePoint.WebControls 命名空间中定义,并且这些控件支持 SharePoint Foundation 的所有表单功能。此命名空间提供一些控件,例如:基于列表架构呈现字段的控件、所有默认 SharePoint 字段类型的控件、用于工具栏、页眉和页脚的控件以及列表的控件。可以重用现有控件,也可以扩展控件以获得特定功能。

图 1 显示表单及其字段中使用的常见控件的层次结构。

图 1. 常见表单和字段控件

表单控件层次结构

扩展控件

可以创建继承 SharePoint Foundation 控件的基本字段功能但修改了字段的呈现方式的自定义字段控件。自定义字段控件继承自 Microsoft.SharePoint.WebControls.BaseFieldControl,因此无需重新实现核心字段功能,即可自定义字段呈现。可以仅在表单页上插入一个现有字段控件并在控件上设置属性,也可以创建添加控件的代码隐藏类。

页面初始化

在通过代码隐藏以编程方式创建字段控件时,必须在页生命周期的初始化阶段 (Page_Init) 创建该控件。否则会由于 ASP.NET 在加载阶段之前加载视图状态,而导致字段控件在创建时不会收到更新的用户输入。

下面的示例阐释如何调用 Page_Init。

Public Sub New()
    AddHandler Me.Init, AddressOf Page_Init
End Sub
Private Sub Page_Init(sender As Object, e As System.EventArgs)
    ... 'Add field control to the page control tree.
End Sub
public EditMetadata(): base()
{
    this.Init += new EventHandler(Page_Init);
}
private void Page_Init(object sender, System.EventArgs e)
{
    ... //Add field control to the page control tree.
}

条件呈现

SharePoint Foundation 支持三种用于确定在呈现表单时使用的控件模板的不同方法:

  • 以编程方式为控件设置模板

  • 通过设置模板属性,在控件的实例中设置模板

  • 在控件的标记中定义模板

通过控件模板或代码隐藏对表单和字段进行的条件呈现会使用如 Template 和 AlternateTemplate 这样的属性以及继承自 Microsoft.SharePoint.WebControls.TemplateBasedControl 的其他成员。可以创建一些表单来选择用于呈现控件的模板,并根据用户的权限级别以不同的方式显示字段。

验证

SharePoint Foundation 不使用 .NET 验证控件。Microsoft.SharePoint.WebControls 命名空间中提供的默认字段继承自 BaseFieldControl,这将实现 System.Web.UI.IValidator 接口并重写其 Validate 方法。SharePoint 表单中的服务器端验证不受字段控件级别限制,也可以在使用对象模型的代码中以编程方式执行此验证。

字段顺序

列表架构或内容类型确定字段在列表表单中的显示顺序。表单中的 Microsoft.SharePoint.WebControls.ListFieldIterator 重复器控件遵循列表架构文件 (Schema.xml) 中定义的字段顺序。架构中定义的字段顺序确定所有三种表单控件模式(新建、编辑和显示)的顺序。

FormField 控件

可以使用 FormField 控件生成特定字段的固定布局,并使用 ListFieldIterator 控件呈现剩余的字段。FormField 控件基于字段架构实例化类型特定的字段控件。因此,若要在表单内添加字段控件,请使用 FormField,而不是类型特定的字段控件。例如,如果在特定的 Text 字段上使用类型特定的字段控件(如 TextField),但稍后将字段类型更改为另一种数据类型(如 Number),则字段呈现将失败,原因是字段控件 (TextField) 将与字段类型不匹配。不过,使用 FormField

控件将实例化正确的控件,并且字段呈现不会失败。

CompositeField 控件

由于 CompositeField 控件的默认控件模板包含多个字段控件,因此该空间特别有用。CompositeField 控件使用 FieldLabel 呈现文件名,使用 FormField 显示数据,并使用 FieldDescription 显示字段的说明。此外,CompositeField 控件包括用于显示 AppendOnly 多行 Text 字段的 AppendOnlyHistory 控件,该字段在其他情况下保持隐藏状态。

下面的示例演示在 DefaultTemplates.ascx 中为 CompositeField 控件定义的控件模板。

<SharePoint:RenderingTemplate ID="CompositeField" runat="server">
  <Template>
    <TD nowrap="true" valign="top" width="190px" class="ms-formlabel"><H3 class="ms-standardheader">
      <SharePoint:FieldLabel runat="server"/>
    </H3></TD>
    <TD valign="top" class="ms-formbody" width="400px">
      <SharePoint:FormField runat="server"/>
      <SharePoint:FieldDescription runat="server"/>
      <SharePoint:AppendOnlyHistory runat="server"/>
    </TD>
  </Template>
</SharePoint:RenderingTemplate>

可以创建包含自定义复合字段控件的自定义列表字段迭代器模板,如以下示例所示:

<SharePoint:RenderingTemplate ID="CustomListFieldIterator" runat="server">
  <Template>
    <TR>
      <SharePoint:CompositeField Template="CustomCompositeField" runat="server"/>
    </TR>
  </Template>
</SharePoint:RenderingTemplate>