如何:创建自定义字段值类

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

适用范围: SharePoint Foundation 2010

本文内容
用于自定义字段值类的构造函数
使用 [Serializable] 指令
从自定义字段类访问自定义字段值

如果您创建一个自定义字段类,该字段类要求字段数据采用特殊数据结构,而从中派生您的自定义字段类的父字段类又不支持此结构,则可以创建一个字段值类以包含您的字段数据。

备注

自定义数据类型可以是一个结构("struct")和一个类;但为了便于进行说明,Microsoft SharePoint Foundation 2010 软件开发工具包 (SDK) 假定始终使用类。

不需要从任何特定的类派生您的自定义字段值类。即使对于从已经具有相关字段值类的字段类派生的自定义字段类,也是如此。例如,如果您创建一个从 SPFieldMultiColumn 类继承的自定义字段类,则该自定义字段类的字段值类不需要从 SPFieldMultiColumnValue 类继承。

建议您对自定义值类使用以下命名约定:

字段类型名称FieldValue

例如,TargetDateFieldValueRegularExpressionFieldValue 均是正确的已命名类。(在确定此命名约定之前已创建 SharePoint Foundation 附带的特殊值类,这些值类采用的格式为 SPField字段类型名称Value,例如 SPFieldMultiColumnValue。)

用于自定义字段值类的构造函数

自定义字段值类必须至少实现两个构造函数,并且通常仅实现两个构造函数。通常,一个构造函数不具有任何参数,而另一个构造函数采用 String 参数(只有极少数例外情况)。第二个构造函数将 String 转换为自定义类型的值。如果此自定义类型比较复杂,则 String 必须具有一个可分析的结构。

如果此类派生自 SPField字段类型名称Value 类之一,则这两个构造函数通常将只调用基构造函数。以下是值类派生自另一个类时的典型值类构造函数的示例:

public RegularExpressionFieldValue()
  : base() { }

public RegularExpressionFieldValue(string value)
  : base(value) { }
Public Sub New()
    MyBase.New()
End Sub

Public Sub New(ByVal value As String)
    MyBase.New(value)
End Sub

在某些情况下,您可能需要其他构造函数。例如,如果您的自定义类型基于一个内部数组字段,则您可能需要一个使用 Int32 参数来初始化数组大小(而非任何特定数组成员)的构造函数。您可能还需要对这两个基本构造函数使用其他参数。例如,如果您的自定义类型的值包含与上下文相关的组件,则您可能需要添加一个 SPContext 参数,或者可能添加一个 SPWebSPSite 参数。有关示例,请参阅 SPField字段类型名称Value 类的构造函数。

使用 [Serializable] 指令

几乎 所有字段值类声明中都会添加 [Serializable] 指令,以便序列化其对象。这意味着您也应该添加此指令,以声明自定义字段值类。但是,如果通过某一方式使类的对象值与上下文相关,而此方式将导致保留和还原这些对象值没有意义,则无需执行此操作。SPFieldLookupValue 是一个其声明不使用 [Serializable] 指令的字段值类的示例:此类型的值始终是临时值。

当使用 [Serializable] 指令标记类时,应实现 ToString 方法以将字段值转换为用于数据存储的字符串格式。(但是,若您的类继承自另一个字段值类,则无需重写此方法。)

备注

SharePoint Foundation 附带的可序列化的所有 SPField字段类型名称Value 类都将重写 ToString 方法,而不是实现 ISerialization 类。建议您遵循此模式:不实现 ISerialization 接口。

有关 SerializableAttribute 的详细信息,请参阅 SerializableAttribute

从自定义字段类访问自定义字段值

要求使用自定义字段值类的自定义字段类通常需要重写 SPField 类的一个或多个方法及属性,尤其是那些用于读取或写入自定义字段值对象的方法和属性。

备注

对于这些成员中的大多数成员,SPField 中的实现毫无意义;例如,GetFieldValue 仅返回传递给它的内容,而 GetValidatedString 仅调用值类(不包含任何验证逻辑)的 ToString 方法。为此,如果字段类型类直接派生自 SPField,则您必须 提供针对需要用于实现其预期用途的任意此类成员的重写。向您提供以下建议:只要有可能,就从派生自 SPField 的类之一派生自定义字段类。

  • DefaultValue   将默认值作为字符串返回,当特定列表项在某个字段中不具有值时,可将此默认值用于此字段。

  • DefaultValueTyped   返回默认值,当特定列表项在某个字段中不具有值时,可将此默认值用于此字段。

  • FieldValueType   返回字段值类型。

  • GetFieldValue   将指定字符串转换为字段类型值对象。当调用 M:Microsoft.SharePoint.SPField.GetFieldValue(System.String) 方法时,自定义字段对象应返回自定义字段值对象。当调用 SPListItem.this["field name"] 方法时,SharePoint Foundation 将返回此字段值对象。通常,若在确认 String 不为空或 null 后重写此方法,则只需调用采用字符串参数的自定义字段值类的构造函数即可(请参阅上文)。

  • GetFieldValueAsText   将字段数据值作为字符串返回。

  • GetFieldValueAsHtml   将字段数据值作为 HTML 格式的字符串返回。此 HTML 格式的字段值最常用于在页面上直接呈现字段值。例如,在列表项的版本历史记录页上使用此字段值。不过,显示表单上不会使用此 HTML 格式的字段值。通常,显示表单的字段呈现与列表视图的呈现相同;也就是说,它将通过字段类型的 fldtype*.xml 文件中的协作应用程序标记语言 (CAML)DisplayPattern 元素来呈现。

  • GetValidatedString   此方法将验证字段类型值对象并将其转换成序列化的字符串。接下来,此方法可以使用字段值对象的 ToString 方法以将此字段值对象转换为字符串。

  • PreviewValueTyped   为显示和编辑模式中的字段控件的设计时视图返回字段数据的预览值。

请参阅

任务

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

概念

自定义字段类型

如何:创建自定义字段类

自定义字段数据验证