自定义字段数据验证

上次修改时间: 2010年3月13日

适用范围: SharePoint Foundation 2010

自定义字段类可包含数据验证。每个自定义字段类型可从其父字段类继承有效性、替代其父级的有效性,甚至可调用其父级有效性作为其自身有效性逻辑的一部分。可以在替代 GetValidatedString 方法时为您的自定义字段类指定自定义数据有效性和预更新处理逻辑。(默认的实现仅调用值类的 ToString 方法;因此,如果您的字段类是直接从 SPField 继承的,或从本身不会替代 GetValidatedString 方法的派生类继承的,则必须 替代 GetValidatedString 才能提供有效性逻辑(如果需要)。)

执行数据验证

虽然可在代码中的多个位置(包括表单控件)中执行数据验证,但我们仍强烈建议您添加自定义字段类的 GetValidatedString 方法所需的任何服务器端数据有效性逻辑。因为这样做有助于确保将所需的数据有效性应用于字段中的数据和内容数据库中的数据。

通过以下任一方法更新数据时:

  • 使用表单控件

  • 通过用户界面,或

  • 以编程方式通过对象模型,

只要数据存储在 SPField 或派生类中,SharePoint Foundation 就会调用 GetValidatedString 方法。例如,当使用 SPListItem.this["field name"] 方法设置 SPListItem 对象中的字段值时,SharePoint Foundation 会调用 GetValidatedString 方法。

备注

用户可以通过不调用 GetValidatedString 方法(从而不调用该方法中包含的任何数据有效性逻辑)的方式来更新字段中的数据。这包括使用不调用 SPListItem 对象的非托管代码或 Web 服务方法来更新字段数据。例如,当用户使用数据表视图更新列表项数据时,列表项会在不调用 GetValidatedString 方法的情况下进行更新。

此外,您还可以使用 GetValidatedString 方法来将字符串错误消息返回到调用应用程序或表单,这样您就能够提供正常显示并处理字段类的数据有效性错误。

若要返回错误消息,GetValidatedString 方法应将 SPFieldValidationException 引发为错误。可以将相应的错误消息作为字符串参数提供给 SPFieldValidationException 构造函数。在 SharePoint Foundation 中,如果用户在表单中输入无效值然后单击"确定",则消息将以红色文本显示在标准"新建"和"编辑"(列表项)表单上的字段旁边。

下面的示例演示 GetValidatedString(验证字段为必填字段时该字段是否包含值以及该值的字符串形式不会超过指定的限制)的替代版本。(Required 属性记录该字段是否必需。)

public override String GetValidatedString(Object value)
{
    if ((this.Required == true) && (value.ToString() == ""))
    {
        throw new SPFieldValidationException(this.Title 
            + " must have a value.");
    }
    else if (value.ToString().Length > MAXLENGTH)
    {
        throw new SPFieldValidationException(this.Title 
            + " cannot be longer than " + MAXLENGTH.ToString());
    }
    return base.GetValidatedString(value);
} 
Public Overrides Function GetValidatedString(ByVal value As Object) As String
    If (Me.Required = True) AndAlso (value.ToString() = "") Then
        Throw New SPFieldValidationException(Me.Title & " must have a value.")
    ElseIf value.ToString().Length > MAXLENGTH Then
        Throw New SPFieldValidationException(Me.Title & " cannot be longer than " & MAXLENGTH.ToString())
    End If
    Return MyBase.GetValidatedString(value)
End Function

用户界面中的验证

如果用户可在标准"新建"或"编辑"(列表项)表单以外的用户界面中设置字段的值,则还应验证用户输入到字段的用户界面控件的数据。特别建议:如果字段必须包含值,则应在用户界面级别强制执行此要求。如果使用从 BaseFieldControl 派生的内置 SharePoint Foundation 类之一来呈现字段,则可以依赖其内部验证来强制执行 Required。如果从 BaseFieldControl 或它的派生之一来派生自己的控件并重写 ValidateCreateChildControls 方法,则将需要提供 Required 的强制执行以及其他任何要执行的用户界面级别验证。

用户界面验证逻辑可以使用 Validate 方法或 CreateChildControls 方法,也可以结合使用这两种方法。将验证逻辑放入 CreateChildControls 方法的一个缺点是,仅当在表单上呈现字段时,才会调用该方法,因此如果更新对象模型中的值,则此验证不会发生。

Validate 方法的替代应通过以下方式来报告其结果:将 IsValid 属性设置为 true 或 false,并且在后一种情况下,将 ErrorMessage 设置为相应的消息。

以下是替代 Validate 方法的示例。它首先检查当前控件模式是否为"显示"(在该模式中,字段是否无效无关紧要,因为无论如何,该字段都无法更改)。该方法还通过检查 IsValid 属性来检查 Value 属性是否已知无效。如果任一项检查的结果为是,则它不执行任何操作。如果两项检查的结果都为否,则该方法会调用 Validate 基方法,如果该基方法发现 Value 属性出错,则将 IsValid 设置为 false,并设置相应的 ErrorMessage。(BaseFieldControl.Validate 方法不执行任何操作,因此如果要替代其 Validate 方法的类是直接从 BaseFieldControl 派生的,则可以忽略对 Validate 基方法的调用。)最后,该方法检查 Required 的值并强制执行该值。

public override void Validate()
{
    if (ControlMode == SPControlMode.Display || !IsValid)
    {
        return;
    }

    base.Validate();

    if (Field.Required && 
        (Value == null || Value.ToString().Length == 0))
    {
        this.ErrorMessage = Field.Title + " must have a value."
        IsValid = false;
        return;
    }
}
Public Overrides Sub Validate()
    If ControlMode = SPControlMode.Display OrElse (Not IsValid) Then
        Return
    End If

    MyBase.Validate()

    If Field.Required AndAlso (Value Is Nothing OrElse Value.ToString().Length = 0) Then
        Me.ErrorMessage = Field.Title & " must have a value."
        IsValid = False
        Return
    End If
End Sub

备注

使用 RenderValidationMessage 方法呈现 ErrorMessage

请参阅

任务

演练:创建自定义字段类型

概念

自定义字段类型

如何:创建自定义字段类