Überprüfung von benutzerdefinierten Felddaten

Letzte Änderung: Samstag, 13. März 2010

Gilt für: SharePoint Foundation 2010

Die benutzerdefinierte Feldklasse kann die Datenüberprüfung enthalten. Jeder benutzerdefinierte Feldtyp kann die Überprüfung von der übergeordneten Feldklasse erben, er kann die Überprüfung der übergeordneten Klasse außer Kraft setzen oder sogar die Überprüfung der übergeordneten Klasse als Teil der eigenen Überprüfungslogik aufrufen. Sie geben die benutzerdefinierte Datenüberprüfung und die Verarbeitungslogik vor dem Update für die benutzerdefinierte Feldklasse in einer Außerkraftsetzung der GetValidatedString-Methode an. (Bei der Standardimplementierung wird einfach die ToString-Methode der Wertklasse aufgerufen. Wenn die Feldklasse direkt von SPField erbt oder von einer abgeleiteten Klasse, die selbst nicht die GetValidatedString-Methode außer Kraft setzt, müssen Sie daher GetValidatedString außer Kraft setzen, um bei Bedarf Überprüfungslogik bereitzustellen.)

Durchführen einer Datenüberprüfung

Sie können zwar eine Datenüberprüfung an mehreren Stellen im Code, einschließlich Formularsteuerelementen, durchführen, es wird jedoch dringend empfohlen, dass Sie serverseitige benötigte Datenüberprüfungslogik der GetValidatedString-Methode der benutzerdefinierten Feldklasse hinzufügen. Dadurch wird sichergestellt, dass die erforderliche Datenüberprüfung auf die Daten im Feld und auf die Daten in der Inhaltsdatenbank angewendet wird.

In Fällen, in denen Daten über eine der folgenden Arten aktualisiert werden:

  • mithilfe des Formularsteuerelements

  • über die Benutzeroberfläche oder

  • programmgesteuert über das Objektmodell,

ruft SharePoint Foundation die GetValidatedString-Methode auf, sobald Daten in einer SPField-Klasse oder einer abgeleiteten Klasse gespeichert wird. Beispielsweise ruft SharePoint Foundation die GetValidatedString-Methode auf, wenn ein Feldwert in einem SPListItem-Objekt mithilfe der SPListItem.this["field name"]-Methode festgelegt wird.

HinweisHinweis

Benutzer können die Daten in einem Feld in einer Art aktualisieren, bei der die GetValidatedString-Methode nicht aufgerufen wird und daher auch keine in der Methode enthaltene Datenüberprüfungslogik aufgerufen wird. Dazu gehört die Verwendung von nicht verwaltetem Code oder von Webdienstmethoden, die das SPListItem-Objekt nicht aufrufen, um die Felddaten zu aktualisieren. Wenn ein Benutzer z. B. mithilfe der Datenblattansicht Listenelementdaten aktualisiert, werden die Listenelemente ohne Aufrufen der GetValidatedString-Methode aktualisiert.

Mit der GetValidatedString-Methode können Sie darüber hinaus Fehlermeldungen als Zeichenfolgen an die aufrufende Anwendung oder das Formular zurückgeben, sodass Sie Datenüberprüfungsfehler für die Feldklasse ordnungsgemäß anzeigen und behandeln können.

Zum Zurückgeben einer Fehlermeldung sollte die GetValidatedString-Methode eine SPFieldValidationException als Fehler ausgeben. Sie können die entsprechende Fehlermeldung als Zeichenfolgenparameter für den SPFieldValidationException-Konstruktor bereitstellen. Wenn der Benutzer in SharePoint Foundation einen ungültigen Wert in das Formular eingibt und auf OK klickt, wird die Meldung als roter Text neben dem Feld in den Standardformularen Neu und Bearbeiten (Listenelement) angezeigt.

Im folgenden Beispiel wird eine außer Kraft gesetzte Version von GetValidatedString gezeigt, mit der überprüft wird, dass das Feld einen Wert besitzt, wenn es sich um ein Pflichtfeld handelt, und dass die Zeichenfolgenversion des Werts einen angegebenen Grenzwert nicht übersteigt. (Mit der Required-Eigenschaft wird erfasst, ob das Feld erforderlich ist.)

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

Überprüfung auf der Benutzeroberfläche

Wenn Benutzer den Wert des Felds auf einer Benutzeroberfläche festlegen anstatt in den Standardformularen Neu oder Bearbeiten (Listenelement), sollten Sie auch Daten überprüfen, die Benutzer in das Benutzeroberflächen-Steuerelement des Felds eingeben. Es wird insbesondere empfohlen, dass diese Anforderung bei einem erforderlichen Feld auf der Ebene der Benutzeroberfläche erzwungen wird. Wenn Sie eine der integrierten SharePoint Foundation-Klassen verwenden, die von BaseFieldControl zum Rendern des Felds abgeleitet werden, dann können Sie auf die interne Überprüfung zum Erzwingen von Required vertrauen. Wenn Sie ein eigenes Steuerelement von BaseFieldControl oder einer abgeleiteten Klasse ableiten und die Methode Validate oder CreateChildControls außer Kraft setzen, dann müssen Sie die Erzwingung von Required und jeder anderen gewünschten Überprüfung auf Ebene der Benutzeroberfläche bereitstellen.

Die Benutzeroberflächen-Überprüfungslogik kann entweder in der Validate-Methode oder der CreateChildControls-Methode oder in einer Kombination der beiden enthalten sein. Das Platzieren der Überprüfungslogik in der CreateChildControls-Methode besitzt den Nachteil, dass die Methode nur aufgerufen wird, wenn das Feld in einem Formular gerendert wird, sodass die Überprüfung nicht auftritt, wenn der Wert im Objektmodell aktualisiert wird.

Eine Außerkraftsetzung der Validate-Methode sollte das Ergebnis melden, indem die IsValid-Eigenschaft auf true oder false festgelegt wird. Und im letzteren Fall sollte dann ErrorMessage auf eine entsprechende Meldung festgelegt sein.

Es folgt ein Beispiel für eine Außerkraftsetzung der Validate-Methode. Es wird zunächst überprüft, ob der aktuelle Steuerelementmodus auf den Anzeigemodus festgelegt ist, wobei es dann keine Rolle spielt, ob das Feld ungültig ist, da es nicht geändert werden kann. Von der Methode wird auch überprüft, ob die Value-Eigenschaft bereits als ungültig bekannt ist, indem die IsValid-Eigenschaft überprüft wird. Falls eine der Überprüfungen True ergibt, wird keine Aktion ausgeführt. Wenn keine der beiden Überprüfungen True ergibt, wird von der Methode die Standardmethode Validate aufgerufen, mit der IsValid auf false festgelegt wird, falls mit der Value-Eigenschaft etwas nicht stimmt. Dann wird ein entsprechender ErrorMessage-Wert festgelegt. (Von der BaseFieldControl.Validate-Methode wird keine Aktion ausgeführt, wenn also die Klasse, deren Validate-Methode außer Kraft gesetzt ist, direkt von BaseFieldControl abgeleitet ist, dann kann der Aufruf der Validate-Standardmethode übersprungen werden.) Schließlich wird von der Methode der Wert von Required überprüft und dieser Wert erzwungen.

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
HinweisHinweis

Verwenden Sie die RenderValidationMessage-Methode zum Rendern von ErrorMessage.

Siehe auch

Aufgaben

Exemplarische Vorgehensweise: Erstellen eines benutzerdefinierten Feldtyps

Konzepte

Benutzerdefinierte Feldtypen

Gewusst wie: Erstellen einer benutzerdefinierten Feldklasse