Exemplarische Vorgehensweise: Erstellen eines benutzerdefinierten Feldtyps

Letzte Änderung: Freitag, 25. Juni 2010

Gilt für: SharePoint Foundation 2010

Inhalt dieses Artikels
Einrichten des Projekts
Erstellen der Gültigkeitsprüfungsregelklasse
Erstellen der benutzerdefinierten Feldklasse
Erstellen des Feldrendering-Steuerelements
Erstellen der Feldrenderingvorlage
Erstellen der Feldtypdefinition
Erstellen des XSLT-Stylesheets
Erstellen und Testen des benutzerdefinierten Feldtyps
Unterschiede beim Feldrendering für mobile Geräte und für Computer

Dieses Thema liefert schrittweise Anweisungen für das Erstellen eines benutzerdefinierten Feldtyps. Sie werden ein Feld erstellen, das eine zehnstellige ISBN-Nummer (International Standard Book Number) aufnehmen soll.

Eine Übersicht über die Schritte zum Erstellen eines benutzerdefinierten Feldtyps und Definieren der Darstellung finden Sie unter Vorgehensweise: Erstellen eines benutzerdefinierten Feldtyps.

Voraussetzungen

Microsoft Visual Studio 2010

Einrichten des Projekts

So richten Sie das Projekt für ein benutzerdefiniertes Feld ein

  1. Erstellen Sie in Visual Studio ein leeres SharePoint-Projekt. Erstellen Sie eine Farmlösung, keine Sandkastenlösung, und geben Sie ihr den Namen ISBN_Field_Type.

  2. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, und wählen Sie Eigenschaften aus.

  3. Geben Sie im Dialogfeld Eigenschaften auf der Registerkarte AnwendungContoso.SharePoint.ISBN_Field_Type als Wert für Assemblyname und Contoso.SharePoint als Wert für Standardnamespace ein. Belassen Sie die Einstellung für Zielframework auf .NET Framework 3.5.

  4. Wenn im Feld Projektmappenplattformen im Visual Studio Standardmenü nicht Beliebige CPU oder x64 angezeigt wird, öffnen Sie die Registerkarte Erstellen, und legen Sie für Zielplattform entweder Beliebige CPU oder x64 fest. Informationen zum Festlegen dieser Einstellung finden Sie unter Gewusst wie: Festlegen des richtigen Zielframeworks und der CPU.

  5. Klicken Sie auf der Symbolleiste auf die Schaltfläche zum Speichern aller Dateien.

  6. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, und wählen Sie dann Hinzufügen | Neues Element aus.

  7. Wählen Sie im Dialogfeld Neues Element hinzufügen in der Struktur Installierte Vorlagen die Option Visual C# | Code (oder Visual Basic | Code) aus.

  8. Wählen Sie im Feld Vorlagen die Option Klasse aus, und geben Sie ISBN.Field.cs (oder ISBN.Field.vb) in das Feld Name ein. Klicken Sie auf Hinzufügen.

  9. Wiederholen Sie den vorherigen Schritt, um eine zweite Klasse zu erstellen. Geben Sie aber dieses Mal ISBN.FieldControl.cs (oder ISBN.FieldControl.vb) in das Feld Name ein. Klicken Sie auf Hinzufügen.

  10. Fügen Sie auf die gleiche Weise eine dritte Klasse hinzu, und geben Sie ISBN10ValidationRule.cs (oder ISBN10ValidationRule.vb) in das Feld Name ein. Klicken Sie auf Hinzufügen.

  11. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, und wählen Sie Hinzufügen und dann Zugeordneter SharePoint-Ordner aus.

  12. Ordnen Sie in der daraufhin geöffneten Strukturansicht den Ordner TEMPLATE\ControlTemplates zu, und klicken Sie auf OK.

  13. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den neuen Ordner ControlTemplates (nicht auf den Projektnamen), und wählen Sie dann Hinzufügen | Neues Element aus.

  14. Wählen Sie im Dialogfeld Neues Element hinzufügen in der Struktur Installierte Vorlagen den Eintrag SharePoint | 2010 aus.

  15. Wählen Sie im Feld Vorlagen ein SharePoint-Benutzersteuerelement aus, und nennen Sie die ASCX-Datei ISBNFieldControl.ascx. Klicken Sie auf Hinzufügen. In Visual Studio wird die Datei automatisch zum SharePoint-Lösungsmanifest hinzugefügt und festgelegt, dass sie in %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\ControlTemplates bereitgestellt wird. Außerdem wird zu diesem Zeitpunkt die Assembly dem Manifest hinzugefügt und festgelegt, dass sie im globalen Assemblycache bereitgestellt wird.

    TippTipp

    Fügen Sie das Benutzersteuerelement nicht durch Rechtsklicken auf den Projektnamen im Projektmappen-Explorer hinzu. Wenn ein Benutzersteuerelement auf diese Weise hinzugefügt wird, wird es in Visual Studio in einem Unterordner von TEMPLATE\ControlTemplates abgelegt. Wenn es nicht verschoben wird, wird es von Visual Studio auch in einem entsprechenden Unterordner von %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\ControlTemplates bereitgestellt. Renderingvorlagen in Unterordnern werden nicht geladen.

  16. Löschen Sie die Dateien ISBNFieldControl.ascx.cs und ISBNFieldControl.ascx.designer.cs (oder ISBNFieldControl.ascx.vb und ISBNFieldControl.ascx.designer.vb), die automatisch unter der Datei ISBNFieldControl.ascx erstellt wurden. Sie werden für dieses Projekt nicht benötigt. Der Standardinhalt von ISBNFieldControl.ascx bezieht sich auf die soeben gelöschte Datei ISBNFieldControl.ascx.cs (oder ISBNFieldControl.ascx.vb). Wenn Sie das Projekt jetzt erstellen, erhalten Sie im Compiler eine Warnung über die fehlende Datei. Ignorieren Sie diese Warnung: Der Standardinhalt wird in einem späteren Schritt in diesem Thema geändert.

  17. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, und wählen Sie Hinzufügen und dann Zugeordneter SharePoint-Ordner aus.

  18. Ordnen Sie in der daraufhin geöffneten Strukturansicht den Ordner TEMPLATE\XML zu, und klicken Sie auf OK.

  19. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den neuen Ordner XML (nicht auf den Projektnamen), und wählen Sie dann Hinzufügen | Neues Element aus.

  20. Wählen Sie im Dialogfeld Neues Element hinzufügen im Fenster Vorlagen die Option Visual C# | Daten (oder Visual Basic | Daten) und dann XML-Datei aus.

  21. Geben Sie im Feld Name die Zeichenfolge fldtypes_ISBNField.xml ein, und klicken Sie auf Hinzufügen.

  22. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, und wählen Sie Hinzufügen und dann Zugeordneter SharePoint-Ordner aus.

  23. Ordnen Sie in der daraufhin geöffneten Strukturansicht den Ordner TEMPLATE\LAYOUTS\XSL zu, und klicken Sie auf OK.

  24. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den neuen Ordner XSL (nicht auf den Projektnamen), und wählen Sie dann Hinzufügen | Neues Element aus.

  25. Wählen Sie im Dialogfeld Neues Element hinzufügen im Fenster Vorlagen die Option Visual C# | Daten (oder Visual Basic | Daten) und dann XSLT-Datei aus.

  26. Geben Sie im Feld Name die Zeichenfolge fldtypes_ISBNField.xsl ein, und klicken Sie auf Hinzufügen. Der Name ist nahezu mit dem der zuletzt erstellten Datei identisch. Die beiden Dateien haben allerdings unterschiedliche Aufgaben und werden in verschiedenen Ordnern bereitgestellt. Passen Sie auf, dass Sie sie im weiteren Verlauf dieses Themas nicht verwechseln.

  27. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Knoten Verweise, klicken Sie auf Verweis hinzufügen, und wählen Sie PresentationFramework.dll auf der Registerkarte .NET im Dialogfeld Verweis hinzufügen aus. Klicken Sie auf OK. (Diese Assembly enthält die Definition der ValidationRule-Klasse, die Sie im nächsten Verfahren erstellen.)

Erstellen der Gültigkeitsprüfungsregelklasse

So erstellen Sie eine Gültigkeitsprüfungsregelklasse

  1. Öffnen Sie die Datei ISBN10ValidationRule.cs (oder ISBN10ValidationRule.vb), und fügen Sie die folgenden Anweisungen hinzu.

    using System.Text.RegularExpressions;
    using System.Windows.Controls;
    using System.Globalization;
    
    Imports System.Text.RegularExpressions
    Imports System.Windows.Controls
    Imports System.Globalization
    
  2. Ändern Sie den Namespace so, dass er den Richtlinien in Richtlinien für die Namespacebenennung entspricht. In dieser exemplarischen Vorgehensweise verwenden Sie Contoso.System.Windows.Controls.

  3. Ersetzen Sie die Klassendeklaration durch den folgenden Code.

    public class ISBN10ValidationRule : ValidationRule
    {
        private const Int32 ISBNMODULO = 11;
    
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            String iSBN = (String)value;
            String errorMessage = "";
    
            Regex rxISBN = new Regex(@"^(?'GroupID'\d{1,5})-(?'PubPrefix'\d{1,7})-(?'TitleID'\d{1,6})-(?'CheckDigit'[0-9X]{1})$");
    
            if (!rxISBN.IsMatch(iSBN))
            {
                errorMessage = "An ISBN must have this structure:\n1-5 digit Group ID, hyphen, \n1-7 digit Publisher Prefix, hyphen, \n1-6 digit Title ID, hyphen, \n1 Check Digit (which can be \"X\" to indicate \"10\").\n";
            }
    
            if (errorMessage == "") // Matched the RegEx, so check for group length errors.
            {
                Match mISBN = rxISBN.Match(iSBN);
                GroupCollection groupsInString = mISBN.Groups;
    
                String groupID = groupsInString["GroupID"].Value;
                String pubPrefix = groupsInString["PubPrefix"].Value;
    
                if ((groupID.Length + pubPrefix.Length) >= 9)
                {
                    errorMessage = "The Group ID and Publisher Prefix can total no more than 8 digits.\n";
                }
    
                String titleID = groupsInString["TitleID"].Value;
    
                if (((groupID.Length + pubPrefix.Length) + titleID.Length) != 9)
                {
                    errorMessage = errorMessage + "The Group ID, Publisher Prefix, and \nTitle ID must total exactly 9 digits.\n";
                }
    
                if (errorMessage == "") //No group length errors, so verify the check digit algorithm.
                {
                    Int32 checkDigitValue;
                    String checkDigit = groupsInString["CheckDigit"].Value;
    
                    // To ensure check digit is one digit, "10" is represented by "X".
                    if (checkDigit == "X")
                    {
                        checkDigitValue = 10;
                    }
                    else
                    {
                        checkDigitValue = Convert.ToInt32(checkDigit);
                    }
    
                    String iSBN1st3Groups = groupID + pubPrefix + titleID; //Concatenate without the hyphens.
    
                    // Sum the weighted digits.
                    Int32 weightedSum = (10 * Convert.ToInt32(iSBN1st3Groups.Substring(0, 1))) +
                                         (9 * Convert.ToInt32(iSBN1st3Groups.Substring(1, 1))) +
                                         (8 * Convert.ToInt32(iSBN1st3Groups.Substring(2, 1))) +
                                         (7 * Convert.ToInt32(iSBN1st3Groups.Substring(3, 1))) +
                                         (6 * Convert.ToInt32(iSBN1st3Groups.Substring(4, 1))) +
                                         (5 * Convert.ToInt32(iSBN1st3Groups.Substring(5, 1))) +
                                         (4 * Convert.ToInt32(iSBN1st3Groups.Substring(6, 1))) +
                                         (3 * Convert.ToInt32(iSBN1st3Groups.Substring(7, 1))) +
                                         (2 * Convert.ToInt32(iSBN1st3Groups.Substring(8, 1))) +
                                          checkDigitValue;
    
                    Int32 remainder = weightedSum % ISBNMODULO;  // ISBN is invalid if weighted sum modulo 11 is not 0.
    
                    if (remainder != 0)
                    {
                        errorMessage = "Number fails Check Digit verification.";
                    }
    
                    if (errorMessage == "") // Passed check digit verification. 
                    {
                        return new ValidationResult(true, "This is a valid ISBN.");
                    }// end check digit verification passed
    
                    else // the check digit verification failed
                    {
                        return new ValidationResult(false, errorMessage);
                    }
    
                }// end no group length errors
    
                else // There was some error in a group length
                {
                    return new ValidationResult(false, errorMessage);
                }
    
            }// end RegEx match succeeded
    
            else // There was a RegEx match failure
            {
                  return new ValidationResult(false, errorMessage);
            }
    
        }// end Validate method 
    
    }// end ISBN10ValidationRule class
    
    Public Class ISBN10ValidationRule
        Inherits ValidationRule
        Private Const ISBNMODULO As Int32 = 11
    
        Public Overrides Function Validate(ByVal value As Object, ByVal cultureInfo As CultureInfo) As ValidationResult
            Dim iSBN As String = CType(value, String)
            Dim errorMessage As String = ""
    
            Dim rxISBN As New Regex("^(?'GroupID'\d{1,5})-(?'PubPrefix'\d{1,7})-(?'TitleID'\d{1,6})-(?'CheckDigit'[0-9X]{1})$")
    
            If Not rxISBN.IsMatch(iSBN) Then
                errorMessage = "An ISBN must have this structure:" & vbLf & "1-5 digit Group ID, hyphen, " & vbLf & "1-7 digit Publisher Prefix, hyphen, " & vbLf & "1-6 digit Title ID, hyphen, " & vbLf & "1 Check Digit (which can be ""X"" to indicate ""10"")." & vbLf
            End If
    
            If errorMessage = "" Then ' Matched the RegEx, so check for group length errors.
                Dim mISBN As Match = rxISBN.Match(iSBN)
                Dim groupsInString As GroupCollection = mISBN.Groups
    
                Dim groupID As String = groupsInString("GroupID").Value
                Dim pubPrefix As String = groupsInString("PubPrefix").Value
    
                If (groupID.Length + pubPrefix.Length) >= 9 Then
                    errorMessage = "The Group ID and Publisher Prefix can total no more than 8 digits." & vbLf
                End If
    
                Dim titleID As String = groupsInString("TitleID").Value
    
                If ((groupID.Length + pubPrefix.Length) + titleID.Length) <> 9 Then
                    errorMessage = errorMessage & "The Group ID, Publisher Prefix, and " & vbLf & "Title ID must total exactly 9 digits." & vbLf
                End If
    
                If errorMessage = "" Then 'No group length errors, so verify the check digit algorithm.
                    Dim checkDigitValue As Int32
                    Dim checkDigit As String = groupsInString("CheckDigit").Value
    
                    ' To ensure check digit is one digit, "10" is represented by "X".
                    If checkDigit = "X" Then
                        checkDigitValue = 10
                    Else
                        checkDigitValue = Convert.ToInt32(checkDigit)
                    End If
    
                    Dim iSBN1st3Groups As String = groupID & pubPrefix & titleID 'Concatenate without the hyphens.
    
                    ' Sum the weighted digits.
                    Dim weightedSum As Int32 = (10 * Convert.ToInt32(iSBN1st3Groups.Substring(0, 1))) + (9 * Convert.ToInt32(iSBN1st3Groups.Substring(1, 1))) + (8 * Convert.ToInt32(iSBN1st3Groups.Substring(2, 1))) + (7 * Convert.ToInt32(iSBN1st3Groups.Substring(3, 1))) + (6 * Convert.ToInt32(iSBN1st3Groups.Substring(4, 1))) + (5 * Convert.ToInt32(iSBN1st3Groups.Substring(5, 1))) + (4 * Convert.ToInt32(iSBN1st3Groups.Substring(6, 1))) + (3 * Convert.ToInt32(iSBN1st3Groups.Substring(7, 1))) + (2 * Convert.ToInt32(iSBN1st3Groups.Substring(8, 1))) + checkDigitValue
    
                    Dim remainder As Int32 = weightedSum Mod ISBNMODULO ' ISBN is invalid if weighted sum modulo 11 is not 0.
    
                    If remainder <> 0 Then
                        errorMessage = "Number fails Check Digit verification."
                    End If
    
                    If errorMessage = "" Then ' Passed check digit verification.
                        Return New ValidationResult(True, "This is a valid ISBN.") ' end check digit verification passed
    
                    Else ' the check digit verification failed
                        Return New ValidationResult(False, errorMessage)
                    End If
                    ' end no group length errors
    
                Else ' There was some error in a group length
                    Return New ValidationResult(False, errorMessage)
                End If
                ' end RegEx match succeeded
    
            Else ' There was a RegEx match failure
                Return New ValidationResult(False, errorMessage)
            End If
    
        End Function ' end Validate method
    
    End Class ' end ISBN10ValidationRule class
    

    Die soeben erstellte Gültigkeitsprüfungsregelklasse enthält sämtliche Details der Überprüfungslogik. Weitere Informationen zu Gültigkeitsprüfungsregelklassen finden Sie unter System.Text.RegularExpressions und ValidationRule.

Erstellen der benutzerdefinierten Feldklasse

So erstellen Sie eine benutzerdefinierte Feldklasse

  1. Öffnen Sie die Datei ISBN.Field.cs (oder ISBN.Field.vb).

  2. Fügen Sie die folgenden Anweisungen hinzu.

    using Microsoft.SharePoint;
    using Microsoft.SharePoint.WebControls;
    using Microsoft.SharePoint.Security;
    
    using System.Windows.Controls;
    using System.Globalization;
    using System.Runtime.InteropServices;
    using System.Security.Permissions;
    
    Imports Microsoft.SharePoint
    Imports Microsoft.SharePoint.WebControls
    Imports Microsoft.SharePoint.Security
    
    Imports System.Windows.Controls
    Imports System.Globalization
    Imports System.Runtime.InteropServices
    Imports System.Security.Permissions
    
  3. Fügen Sie die folgenden Anweisungen hinzu. Damit ermöglichen Sie es der Klassenimplementierung, auf andere Klassen zu verweisen, die Sie in späteren Schritten erstellen. Bis Sie diese Klassen erstellt haben, erscheinen möglicherweise Compilerwarnungen über diese Anweisungen.

    using Contoso.SharePoint.WebControls;
    using Contoso.System.Windows.Controls;
    
    Imports Contoso.SharePoint.WebControls
    Imports Contoso.System.Windows.Controls
    
  4. Stellen Sie sicher, dass als Namespace Contoso.SharePoint festgelegt ist.

  5. Die Klasse muss ISBNField heißen, und Sie müssen die Deklaration so ändern, dass sie von SPFieldText erbt.

    public class ISBNField : SPFieldText
    {
    }
    
    Public Class ISBNField
        Inherits SPFieldText
    
    End Class
    
  6. Fügen Sie der Klasse die folgenden erforderlichen Konstruktoren hinzu.

    public ISBNField(SPFieldCollection fields, string fieldName)
            : base(fields, fieldName)
    {
    }
    
    public ISBNField(SPFieldCollection fields, string typeName, string displayName)
            : base(fields, typeName, displayName)
    {
    }
    
    Public Sub New(fields as SPFieldCollection, fieldname as String)
            MyBase.New(fields, fieldName)
    End Sub
    
    Public Sub New(fields as SPFieldCollection, typeName as String, displayName as String)
            MyBase.New(fields, typeName, displayName)
    End Sub
    
  7. Fügen Sie der Klasse die folgende Außerkraftsetzung von FieldRenderingControl hinzu. Die ISBNFieldControl-Klasse erstellen Sie in einem späteren Schritt.

    public override BaseFieldControl FieldRenderingControl
    {
         [SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)]
        get
        {
            BaseFieldControl fieldControl = new ISBNFieldControl();
            fieldControl.FieldName = this.InternalName;
    
            return fieldControl;
        }
    }
    
    Public Overrides ReadOnly Property FieldRenderingControl() As BaseFieldControl
        Get
            Dim fieldControl As BaseFieldControl = New ISBNFieldControl()
            fieldControl.FieldName = Me.InternalName
            Return fieldControl
        End Get
    End Property
    
  8. Fügen Sie der ISBNField-Klasse die folgende Außerkraftsetzung der GetValidatedString-Methode hinzu.

    public override string GetValidatedString(object value)
    {
        if ((this.Required == true)
           &&
           ((value == null)
            ||
           ((String)value == "")))
        {
            throw new SPFieldValidationException(this.Title 
                + " must have a value.");
        }
        else
        {
            ISBN10ValidationRule rule = new ISBN10ValidationRule();
            ValidationResult result = rule.Validate(value, CultureInfo.InvariantCulture);
    
            if (!result.IsValid)
            {
                throw new SPFieldValidationException((String)result.ErrorContent);
            }
            else
            {
                return base.GetValidatedString(value);
            }
        }
    }// end GetValidatedString
    
    Public Overrides Function GetValidatedString(ByVal value As Object) As String
        If (Me.Required = True) AndAlso ((value Is Nothing) OrElse (CType(value, String) = "")) Then
            Throw New SPFieldValidationException(Me.Title & " must have a value.")
        Else
            Dim rule As New ISBN10ValidationRule()
            Dim result As ValidationResult = rule.Validate(value, cultureInfo.InvariantCulture)
    
            If Not result.IsValid Then
                Throw New SPFieldValidationException(CType(result.ErrorContent, String))
            Else
                Return MyBase.GetValidatedString(value)
            End If
        End If
    End Function ' end GetValidatedString
    

    Diese Außerkraftsetzung verdeutlicht ein allgemeines Muster für Außerkraftsetzungen von GetValidatedString:

    • Außerkraftsetzungen der GetValidatedString-Methode überprüfen, ob das Feld erforderlich ist. Ist dies der Fall, löst die außer Kraft gesetzte Methode eine SPFieldValidationException-Ausnahme aus, wenn der Wert null oder ein leerer String ist. Diese Ausnahme wird von den Seiten Neues Element und Element bearbeiten abgefangen, wenn der Benutzer versucht, das erstellte oder bearbeitete Listenelement zu speichern. In diesem Fall bleibt die Seite geöffnet, und die Message()-Eigenschaft der Ausnahme sorgt dafür, dass unter dem leeren Feld eine Fehlermeldung erscheint.

    • Außerkraftsetzungen von GetValidatedString lösen eine SPFieldValidationException aus, wenn der Wert ungültig ist, woraufhin unter dem ungültigen Feld eine Fehlermeldung erscheint.

    • Außerkraftsetzungen von GetValidatedString senden einen Aufruf an GetValidatedString, wenn der Wert die benutzerdefinierte Gültigkeitsprüfung bestanden hat.

  9. Speichern und schließen Sie die Datei.

Erstellen des Feldrendering-Steuerelements

So erstellen Sie das Feldrendering-Steuerelement

  1. Öffnen Sie die Datei ISBN.FieldControl.cs (oder ISBN.FieldControl.vb).

  2. Fügen Sie die folgenden Anweisungen hinzu.

    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    using System.Runtime.InteropServices;
    using Microsoft.SharePoint;
    using Microsoft.SharePoint.WebControls;
    
    Imports System.Web
    Imports System.Web.UI
    Imports System.Web.UI.WebControls
    
    Imports System.Runtime.InteropServices
    Imports Microsoft.SharePoint
    Imports Microsoft.SharePoint.WebControls
    
  3. Ändern Sie den Namespace in Contoso.SharePoint.WebControls.

  4. Die Klasse muss ISBNFieldControl heißen, und Sie müssen die Deklaration so ändern, dass sie von TextField erbt.

    public class ISBNFieldControl : TextField
    {
    }
    
    Public Class ISBNFieldControl 
        Inherits TextField
    
    End Class
    
  5. Fügen Sie ein geschütztes Feld für ein ASP.NET-Label-Websteuerelement hinzu, das beim Rendern im Modus Neu oder im Bearbeitungsmodus vor jeder ISBN-Nummer das Präfix "ISBN" hinzufügt. Es ist nicht notwendig, ein geschütztes TextBox-Feld für die ISBN-Nummer selbst hinzuzufügen, weil das benutzerdefinierte ISBNFieldControl dieses Feld von TextField erbt.

    protected Label ISBNPrefix;
    
    Protected Label ISBNPrefix
    
  6. Fügen Sie ein weiteres geschütztes Feld für ein ASP.NET-Label-Websteuerelement hinzu, das im Anzeigemodus den aktuellen Wert des Felds rendert.

    protected Label ISBNValueForDisplay;
    
    Protected Label ISBNValueForDisplay
    
  7. Fügen Sie als Nächstes die folgende Außerkraftsetzung der DefaultTemplateName-Eigenschaft hinzu. Der String, den Sie dieser Eigenschaft zuweisen, ist die ID eines RenderingTemplate-Objekts, das Sie später noch zur zuvor erstellten ASCX-Datei hinzufügen werden. (Nach Abschluss des Projekts wird diese Datei im Ordner %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\CONTROLTEMPLATES bereitgestellt.) Wenn weder ControlTemplate noch Template oder TemplateName außer Kraft gesetzt wird, wird RenderingTemplate wie folgt aufgerufen: ControlTemplate gibt Template zurück, und dies gibt wiederum die Template-Eigenschaft von RenderingTemplate zurück, die von TemplateName benannt wurde. Der get-Accessor von TemplateName schließlich gibt DefaultTemplateName zurück. In einer komplexeren Ausgangssituation, beispielsweise mit unterschiedlichen Vorlagen für den Modus Neu und den Bearbeitungsmodus, müssten Sie mindestens eine der vorherigen Eigenschaften sowie wahrscheinlich auch die Eigenschaften AlternateTemplateName oder DefaultAlternateTemplateName außer Kraft setzen.

    protected override string DefaultTemplateName
    {
        get
        {
            if (this.ControlMode == SPControlMode.Display)
            {
                return this.DisplayTemplateName;
            }
            else
            {
                return "ISBNFieldControl";
            }         
        }
    }
    
    Protected Overrides ReadOnly Property DefaultTemplateName() As String
        Get
            If Me.ControlMode = SPControlMode.Display Then
                Return Me.DisplayTemplateName
            Else
                Return "ISBNFieldControl"
        End Get
    End Property
    
  8. Fügen Sie die folgende Außerkraftsetzung von DisplayTemplateName hinzu. Der String, den Sie dieser Eigenschaft zuweisen, ist die ID eines RenderingTemplate-Objekts, das Sie später noch zur zuvor erstellten ASCX-Datei hinzufügen werden. Dieses Objekt rendert im Anzeigemodus den Wert des Felds.

    public override string DisplayTemplateName
    {
        get
        {
            return "ISBNFieldControlForDisplay";
        }
        set
        {
            base.DisplayTemplateName = value;
        }
    }
    
    Public Overrides Property DisplayTemplateName() As String
        Get
                 Return "ISBNFieldControlForDisplay"
        End Get
        Set
                 MyBase.DisplayTemplateName = Value
        End Set
    End Property
    
  9. Fügen Sie die folgende Außerkraftsetzung der CreateChildControls-Methode hinzu. Die Außerkraftsetzung führt keinerlei Funktion aus, wenn das zugrunde liegende ISBNFieldnull ist. (Es ist möglicherweise null, wenn das ISBNFieldControl unabhängig vom set-Accessor für die FieldRenderingControl-Eigenschaft von ISBNField erstellt wird. Siehe dazu die Außerkraftsetzung von FieldRenderingControl in ISBN.Field.cs [oder ISBN.Field.vb].)

    protected override void CreateChildControls()
    {
        if (this.Field != null)
        {
    
    
        }// end if there is a non-null underlying ISBNField 
    
      // Do nothing if the ISBNField is null.
    }
    
    Protected Overrides Sub CreateChildControls()
        If Me.Field IsNot Nothing Then
    
        End If ' end if there is a non-null underlying ISBNField
    
        ' Do nothing if the ISBNField is null or control mode is Display.
    End Sub
    
  10. Fügen Sie der Basismethode den folgenden Aufruf als erste Zeile der Bedingung hinzu. Ein solcher Aufruf ist in der Regel notwendig, um sicherzustellen, dass die geerbten untergeordneten Steuerelemente erstellt werden, falls sie vollständig oder teilweise von den untergeordneten CreateChildControls und nicht von einer Vorlage gerendert werden. Beispielsweise rendert die Vorlage TextField in DefaultTemplates.ascx (in %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\ControlTemplates) das untergeordnete TextBox-Element, aber die CreateChildControls-Methode passt die maximale Größe des TextBox-Elements an die Höchstgröße des zugrunde liegenden SPFieldText-Felds an. Die Basis-CreateChildControls können auch dynamische BaseValidator-Steuerelemente erzeugen. Üblicherweise haben Sie aber keinen Zugriff auf den Quellcode der Basismethode, sodass Sie nur durch Ausprobieren ermitteln können, ob ein Aufruf erforderlich ist und wenn ja, wo in der Außerkraftsetzung er erfolgen sollte.

    // Make sure inherited child controls are completely rendered.
    base.CreateChildControls();
    
    ' Make sure inherited child controls are completely rendered.
    MyBase.CreateChildControls()
    
  11. Fügen Sie die folgenden Zeilen hinzu, um die untergeordneten Steuerelemente in den Renderingvorlagen den untergeordneten Steuerelementfeldern zuzuordnen, die im benutzerdefinierten Feldsteuerelement deklariert wurden (oder vom übergeordneten Element geerbt werden). Sie müssen dies an dieser Stelle tun, weil dieser Aufruf der Basis-CreateChildControls die geerbten untergeordneten Steuerelemente mit den Renderingvorlagen verknüpft, die das übergeordnete Element der benutzerdefinierten Feldklasse verwendet, und nicht mit den benutzerdefinierten Renderingvorlagen. Die Basisverknüpfung muss also durch eine neue ersetzt werden.

    // Associate child controls in the .ascx file with the 
    // fields allocated by this control.
    this.ISBNPrefix = (Label)TemplateContainer.FindControl("ISBNPrefix");
    this.textBox = (TextBox)TemplateContainer.FindControl("TextField");
    this.ISBNValueForDisplay = (Label)TemplateContainer.FindControl("ISBNValueForDisplay");
    
    ' Associate child controls in the .ascx file with the 
    ' fields allocated by this control.
    Me.ISBNPrefix = CType(TemplateContainer.FindControl("ISBNPrefix"), Label)
    Me.textBox = CType(TemplateContainer.FindControl("TextField"), TextBox)
    Me.ISBNValueForDisplay = CType(TemplateContainer.FindControl("ISBNValueForDisplay"), Label)
    
  12. Fügen Sie unter dem Steuerelement-Verknüpfungscode die folgende Struktur hinzu. Das Feld verwendet im Anzeigemodus eine andere Renderingvorlage (die Sie später in diesem Thema erstellen) als im Modus Neu und im Bearbeitungsmodus. Entsprechend werden je nach Modus unterschiedliche untergeordnete Steuerelemente initialisiert.

    if (this.ControlMode != SPControlMode.Display)
    {
    
    }
    else // control mode is Display 
    {                 
    
    }// end control mode is Display
    
    If Not Me.ControlMode = SPControlMode.Display Then
    
    Else ' control mode is display
    
    End If ' end control mode is Display
    
  13. Fügen Sie innerhalb der "if"-Klausel (oder "If"-Klausel) der bedingten Struktur, die Sie im vorherigen Schritt erstellt haben, die folgende innere bedingte Struktur hinzu. Der Code sollte bei einem Postback keine Aktion ausführen, da die erneute Initialisierung bei einem Postback eventuelle Änderungen eines Benutzers an den Werten der untergeordneten Steuerelemente ungültig machen würde.

    if (!this.Page.IsPostBack)
    {
    
    }// end if this is not a postback 
    
    //Do not reinitialize on a postback.
    
    If Not Me.Page.IsPostBack Then
    
    End If ' end if this is not a postback
    
    'Do not reinitialize on a postback.
    
  14. Fügen Sie innerhalb der bedingten Struktur, die Sie im letzten Schritt hinzugefügt haben, die folgende innere Bedingung hinzu, um das untergeordnete TextBox-Steuerelement im Steuerelementmodus Neu mit einem standardmäßigen ISBN-Wert zu initialisieren.

    if (this.ControlMode == SPControlMode.New)
    {
        textBox.Text = "0-000-00000-0";
    
    } // end assign default value in New mode
    
    If Me.ControlMode = SPControlMode.New Then
       textBox.Text = "0-000-00000-0"
    
    End If ' end assign default value in New mode
    
  15. Fügen Sie im else-Block (oder Else-Block), der im Steuerelementmodus Anzeige ausgeführt wird, den folgenden Code hinzu, um das Feld mit dem aktuellen Wert aus der Inhaltsdatenbank zu initialisieren.

    // Assign current value from database to the label control
    ISBNValueForDisplay.Text = (String)this.ItemFieldValue;
    
    ' Assign current value from database to the label control
    ISBNValueForDisplay.Text = CType(Me.ItemFieldValue, String)
    
  16. Im Bearbeitungsmodus ist keine Aktion erforderlich, weil die OnLoad-Methode ISBNFieldControl.Value mit dem Wert von ItemFieldValue initialisiert, also dem aktuellen Wert des Felds in der Inhaltsdatenbank. An diesem Punkt sollte die Außerkraftsetzung von CreateChildControls folgendermaßen aussehen.

    protected override void CreateChildControls()
    {
        if (this.Field != null)
        {
            // Make sure inherited child controls are completely rendered.
            base.CreateChildControls();
    
            // Associate child controls in the .ascx file with the 
            // fields allocated by this control.
            this.ISBNPrefix = (Label)TemplateContainer.FindControl("ISBNPrefix");
            this.textBox = (TextBox)TemplateContainer.FindControl("TextField");
            this.ISBNValueForDisplay = (Label)TemplateContainer.FindControl("ISBNValueForDisplay");
    
            if (this.ControlMode != SPControlMode.Display)
            {
                if (!this.Page.IsPostBack)
                {
                    if (this.ControlMode == SPControlMode.New)
                    {
                        textBox.Text = "0-000-00000-0";
    
                    } // end assign default value in New mode
    
                 }// end if this is not a postback 
    
              // Do not reinitialize on a postback.
    
            }// end if control mode is not Display
            else // control mode is Display 
            {                 
                // Assign current value from database to the label control
                ISBNValueForDisplay.Text = (String)this.ItemFieldValue;
    
            }// end control mode is Display
    
        }// end if there is a non-null underlying ISBNField 
    
        // Do nothing if the ISBNField is null.
    }
    
    Protected Overrides Sub CreateChildControls()
        If Me.Field IsNot Then
            ' Make sure inherited child controls are completely rendered.
            MyBase.CreateChildControls()
    
            ' Associate child controls in the .ascx file with the 
            ' fields allocated by this control.
            Me.ISBNPrefix = CType(TemplateContainer.FindControl("ISBNPrefix"), Label)
            Me.textBox = CType(TemplateContainer.FindControl("TextField"), TextBox)
            Me.ISBNValueForDisplay = CType(TemplateContainer.FindControl("ISBNValueForDisplay"), Label)
    
            If Not Me.ControlMode = SPControlMode.Display Then
    
                 If Not Me.Page.IsPostBack Then
                     If Me.ControlMode = SPControlMode.New Then
                         textBox.Text = "0-000-00000-0"
    
                     End If ' end assign default value in New mode
    
                 End If ' end if this is not a postback
    
                 'Do not reinitialize on a postback.
    
            Else ' control mode is display
                ' Assign current value from database to the label control
                ISBNValueForDisplay.Text = CType(Me.ItemFieldValue, String)
    
            End If ' end control mode is Display
    
        End If ' end if there is a non-null underlying ISBNField
    
        ' Do nothing if the ISBNField is null or control mode is Display.
    End Sub
    
  17. Fügen Sie die folgende Außerkraftsetzung der Value-Eigenschaft hinzu. Diese ist der Wert des Felds auf der Benutzeroberfläche. Wenn der Endbenutzer den Wert geändert, aber noch nicht gespeichert hat, entspricht die Value-Eigenschaft u. U. nicht dem tatsächlichen Wert des zugrunde liegenden ISBNField-Objekts (das von SPFieldText abgeleitet wird) oder dem Wert des Felds in der Inhaltsdatenbank. Beachten Sie, dass sowohl der get-Accessor als auch der set-Accessor zuerst EnsureChildControls aufrufen (von dem bei Bedarf wiederum CreateChildControls aufgerufen wird). Der Aufruf von EnsureChildControls ist obligatorisch, es sei denn, (1) Sie rufen zuerst die Basiseigenschaft auf und (2) Sie wissen, dass die set- und get-Accessoren der Basiseigenschaft EnsureChildControls aufrufen. Wenn Sie das zugrunde liegende untergeordnete TextBox-Steuerelement, das von TextField geerbt wird, durch einen gänzlich anderen Steuerelementtyp ersetzen würden (z. B. ein Dropdown-Listenfeld, müssten der set-Accessor und der get -Accessor Ihrer Außerkraftsetzung der Value-Eigenschaft dieses Steuerelement direkt festlegen, anstatt eine Basiseigenschaft aufzurufen. Damit das Steuerelement zuerst mit dem Wert des zugrunde liegenden ISBNField-Objekts geladen wird, legt die OnLoad()-Methode ISBNFieldControl.Value auf den Wert von ItemFieldValue fest. Dies ist der Wert des zugrunde liegenden ISBNField-Objekts.

    public override object Value
    {
        get
        {
            EnsureChildControls();
            return base.Value;
        }
        set
        {
             EnsureChildControls();
             base.Value = (String)value;
             // The value of the ISBNPrefix field is hardcoded in the
             // template, so it is not set here.
        }
    }
    
    Public Overrides Property Value() As Object
        Get
            EnsureChildControls()
            Return MyBase.Value
        End Get
        Set(ByVal value As Object)
            EnsureChildControls()
            MyBase.Value = CType(value, String)
            ' The value of the ISBNPrefix field is hardcoded in the
            ' template, so it is not set here.
        End Set
    End Property
    

Erstellen der Feldrenderingvorlage

So erstellen Sie die Renderingvorlagen

  1. Öffnen Sie die Datei ISBNFieldControl.ascx.

  2. Die folgenden Direktiven sind bereits in der Datei enthalten.

    <%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %>
    <%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
    <%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
    <%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
    <%@ Register Tagprefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
    <%@ Import Namespace="Microsoft.SharePoint" %> 
    <%@ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
    
  3. Unterhalb dieses Markups befindet sich eine <%@ Control-Direktive, die auf Dateien verweist, die Sie in einem vorherigen Schritt gelöscht haben, und die weitere Attribute enthält, die in diesem Projekt nicht verwendet werden. Ersetzen Sie sie daher durch die folgende einfachere Direktive.

    <%@ Control Language="C#" %>
    
  4. Fügen Sie unterhalb der Direktiven folgendes Markup hinzu.

    <SharePoint:RenderingTemplate ID="ISBNFieldControl" runat="server">
      <Template>
        <asp:Label ID="ISBNPrefix" Text="ISBN" runat="server" />
        &nbsp;
        <asp:TextBox ID="TextField" runat="server"  />
      </Template>
    </SharePoint:RenderingTemplate>
    

    Beachten Sie folgende Fakten in diesem Markup:

    • Die ID von RenderingTemplate muss mit der Zeichenfolge identisch sein, die Sie in der Außerkraftsetzung der DefaultTemplateName-Eigenschaft verwendet haben.

    • Das Text-Attribut des Label-Steuerelements wird hier in der Vorlage festgelegt, weil es unveränderlich ist.

    • Zwischen den beiden Steuerelementen befindet sich ein HTML-Element "&nbsp;".

    • Die TextBox-Definition ist mit der in der RenderingTemplateTextField in %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\CONTROLTEMPLATES\DefaultTemplates.ascx identisch. Die Definition muss allerdings hier wiederholt werden, weil die Außerkraftsetzung von DefaultTemplateName auf diese benutzerdefinierte Vorlage und nicht auf die Vorlage TextField zeigt. In der benutzerdefinierten Vorlage wird dieselbe ID verwendet, weil die CreateChildControls-Basismethode (siehe oben) u. U. über die ID auf das Steuerelement verweist.

  5. Fügen Sie unmittelbar unter der ersten die folgende zusätzliche RenderingTemplate hinzu.

    <SharePoint:RenderingTemplate ID="ISBNFieldControlForDisplay" runat="server">
      <Template>
        <asp:Label ID="ISBNValueForDisplay" runat="server" />
      </Template>
    </SharePoint:RenderingTemplate>
    

    Diese RenderingTemplate wird von der CreateChildControls-Methode als Standardvorlage für den Anzeigemodus angegeben.

Erstellen der Feldtypdefinition

So erstellen Sie die Feldtypdefinition

  1. Erstellen Sie das Projekt in Visual Studio. Das Projekt ist noch nicht fertig, aber Sie müssen es jetzt erstellen, um eine GUID und ein öffentliches Schlüsseltoken für die Assembly zu generieren.

  2. Öffnen Sie die Datei fldtypes_ISBNField.xml, und ersetzen Sie ihren Inhalt durch folgendes Markup.

    <?xml version="1.0" encoding="utf-8" ?>
    <FieldTypes>
      <FieldType>
        <Field Name="TypeName">ISBN</Field>
        <Field Name="ParentType">Text</Field>
        <Field Name="TypeDisplayName">ISBN</Field>
        <Field Name="TypeShortDescription">ISBN for a book</Field>
        <Field Name="UserCreatable">TRUE</Field>
        <Field Name="ShowOnListCreate">TRUE</Field>
        <Field Name="ShowOnSurveyCreate">TRUE</Field>
        <Field Name="ShowOnDocumentLibraryCreate">TRUE</Field>
        <Field Name="ShowOnColumnTemplateCreate">TRUE</Field>
        <Field Name="FieldTypeClass">Contoso.SharePoint.ISBNField, $SharePoint.Project.AssemblyFullName$</Field>
      </FieldType>
    </FieldTypes>
    

    Diese Datei definiert den benutzerdefinierten Feldtyp für SharePoint Foundation. Einzelheiten zum Zweck und zur Bedeutung ihrer Elemente finden Sie unter Vorgehensweise: Erstellen einer benutzerdefinierten Feldtypdefinition, Grundlegendes zur Datei "FldTypes.xml", FieldTypes-Element (Feldtypen), FieldType-Element (Feldtypen) und Field-Element (Feldtypen). Beachten Sie, dass sich das <Field Name="FieldTypeClass">-Element vollständig auf einer Zeile befinden muss.

  3. Der Wert des <Field Name="FieldTypeClass">-Elements ist der vollqualifizierte Name der benutzerdefinierten Feldklasse gefolgt von einem Komma und einem Visual Studio 2010-Token ($SharePoint.Project.AssemblyFullName$). Wenn Sie das Projekt kompilieren, wird eine Kopie dieser Datei erstellt, in der das Token durch den vollständigen, vierteiligen Namen der Assembly ersetzt wird. Diese Kopie wird dann bereitgestellt, wenn Sie in Visual Studio im Menü Erstellen von Visual Studio 2010 auf Lösung bereitstellen klicken. Wenn Sie nicht Visual Studio 2010 verwenden, müssen Sie das Projekt jetzt kompilieren, obwohl es noch nicht fertig ist, um ein öffentliches Schlüsseltoken zu generieren. Anschließend können Sie das unter Gewusst wie: Erstellen eines Tools zum Abrufen des vollständigen Namens einer Assembly beschriebene Tool verwenden, um den vollständigen, vierteiligen Namen abzurufen und manuell anstelle des Tokens einzufügen.

Erstellen des XSLT-Stylesheets

So erstellen Sie das XSLT-Stylesheet

  • Öffnen Sie die Datei fldtypes_ISBNField.xsl, und ersetzen Sie alles unterhalb des <?xml version="1.0" encoding="utf-8"?>-Tags durch folgendes Markup.

    <xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema"
                    xmlns:d="https://schemas.microsoft.com/sharepoint/dsp"
                    version="1.0"
                    exclude-result-prefixes="xsl msxsl ddwrt"
                    xmlns:ddwrt="https://schemas.microsoft.com/WebParts/v2/DataView/runtime"
                    xmlns:asp="https://schemas.microsoft.com/ASPNET/20"
                    xmlns:__designer="https://schemas.microsoft.com/WebParts/v2/DataView/designer" 
                    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                    xmlns:SharePoint="Microsoft.SharePoint.WebControls"
                    xmlns:ddwrt2="urn:frontpage:internal">
    
      <xsl:template match="FieldRef[@Name = 'ISBN']" mode="Text_body">
    
        <xsl:param name="thisNode" select="." /> 
    
        <span style="background-color:lightgreen;font-weight:bold">
    
          <xsl:value-of select="$thisNode/@*[name()=current()/@Name]" />
    
        </span>
    
      </xsl:template >
    
    </xsl:stylesheet>
    

    Mit dem XSLT-Stylesheet wird das Feld in Listenansichten gerendert. Die Zellen in der ISBN-Spalte von Listenansichten haben einen hellgrünen Hintergrund, der ISBN-Wert ist fett dargestellt.

    Die Spaltenüberschrift in der Listenansicht wird von einem anderen XSLT-Stylesheet gerendert, das in der integrierten Datei fldtypes.xsl in %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATES\LAYOUTS\XSL bereitgestellt wird.

Erstellen und Testen des benutzerdefinierten Feldtyps

So erstellen und testen Sie den benutzerdefinierten Feldtyp

  1. Wählen Sie im Menü Erstellen die Option Bereitstellen aus. Dadurch wird automatisch die Assembly erstellt und im globalen Assemblycache bereitgestellt; die ASCX-Datei wird in %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\ControlTemplates, die Datei fldtypes*.xml in %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\XML und die Datei fldtypes*.xsl in %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\LAYOUTS\XSL bereitgestellt, und die Webanwendung wird neu gestartet.

    HinweisHinweis

    Wenn es sich bei Ihrer Entwicklungsumgebung um eine Farm mit mehreren Servern handelt, erfolgt der Bereitstellungsschritt nicht automatisch. Stellen Sie die Lösung isbn_field_type.wsp über die Seite zur Lösungsverwaltung der Anwendung für die Zentraladministration oder mithilfe eines SharePoint-Verwaltungsshell-Cmdlets bereit.

  2. Öffnen Sie eine Website in Ihrer SharePoint-Webanwendung, und erstellen Sie eine Liste namens Books.

  3. Fügen Sie der Liste eine neue Spalte hinzu. Geben Sie auf der Seite Spalte erstellen "ISBN" als Spaltennamen ein.

  4. Klicken Sie auf das Optionsfeld ISBN for a book.

  5. Klicken Sie auf das Optionsfeld Yes, um das Feld als Pflichtfeld festzulegen.

  6. Lassen Sie das Kontrollkästchen Add to default view aktiviert.

  7. Klicken Sie auf OK.

  8. Fügen Sie der Liste ein Element hinzu.

  9. Überprüfen Sie auf der Seite Neues Element, ob das Feld anfangs auf den Standardwert 0-000-00000-0 festgelegt ist und ob zusätzlich zum Feldtitel ISBN dem Wert selbst ebenfalls unmittelbar die Zeichenfolge "ISBN" vorangestellt ist, wie es in der Renderingvorlage für den Modus Neu und den Bearbeitungsmodus festgelegt ist.

  10. Geben Sie ungültige ISBN-Werte ein, um zu sehen, welche Fehlertypen beim Speichern des Elements auftreten.

  11. Probieren Sie aus, was passiert, wenn Sie das Feld vollkommen leer lassen.

  12. Geben Sie abschließend 0-262-61108-2 oder einen anderen gültigen Wert ein, und klicken Sie auf Speichern. (Wenn bei einer gültigen ISBN-Nummer Fehlermeldungen auftreten, sollten Sie überprüfen, ob am Ende des Werts ein Leerzeichen enthalten ist.)

  13. Überprüfen Sie, ob der Wert in der Listenansicht fett vor hellgrünem Hintergrund dargestellt wird.

  14. Klicken Sie auf den Elementtitel, um die Anzeigeseite zu öffnen. Stellen Sie sicher, dass das Feld mit dem aktuellen Wert in der Inhaltsdatenbank gerendert wird. Ihnen wird auffallen, dass der Feldtitel ISBN zwar vorhanden ist, dem Wert selbst aber nicht wie im Modus Neu und im Bearbeitungsmodus ISBN vorangestellt ist, da dieses Präfix nicht in der Renderingvorlage für den Anzeigemodus festgelegt ist.

  15. Klicken Sie auf Element bearbeiten, um das Feld zu bearbeiten. Überprüfen Sie, ob das Feld anfangs auf den aktuellen Wert festgelegt ist, nicht auf den Standardwert, und ob zusätzlich zum Feldtitel ISBN dem Wert selbst ebenfalls unmittelbar die Zeichenfolge "ISBN" vorangestellt ist, wie es in der Renderingvorlage für den Modus Neu und den Bearbeitungsmodus festgelegt ist.

  16. Ändern Sie das Feld in ungültige Werte, und überprüfen Sie, ob im Bearbeitungsmodus dieselben Gültigkeitsprüfungsfehler auftreten wie im Modus Neu.

Unterschiede beim Feldrendering für mobile Geräte und für Computer

Das Feldrendering mit benutzerdefinierten Feldrendering-Steuerelementen ist in SharePoint Foundation für mobile Geräte ähnlich wie für Computer. Allerdings sind folgende Unterschiede zu beachten:

  • Bei mobilen Seiten handelt es sich um einen vollkommen unabhängigen Satz von Seiten, der nichts mit den Hauptseiten einer SharePoint Foundation-Website zu tun hat (die für Computerbrowser entwickelt wurden). Sie verweisen auf völlig andere RenderingTemplate-Objekte.

  • Mobile RenderingTemplate-Objekte werden in MobileDefaultTemplates.ascx und GbwMobileDefaultTemplates.ascx deklariert, nicht in DefaultTemplates.ascx.

  • Mobile Feldrendering-Steuerelemente haben einen eigenen Namespace, Microsoft.SharePoint.MobileControls, und sie werden von Klassen im ASP.NET-System.Web.UI.MobileControls-Namespace (nicht vom System.Web.UI.WebControls-Namespace) abgeleitet.

  • Die Vererbungshierarchie für mobile Feldrendering-Steuerelemente unterscheidet sich kaum von der für normale Feldrendering-Steuerelemente. So werden die Funktionen von TemplateBasedControl und FormComponent beim normalen Feldrendering in der SPMobileComponent-Klasse kombiniert.

  • Benutzerdefinierte Feldrendering-Steuerelemente, die Sie für mobile Kontexte erstellen, basieren beim Rendern eines Felds mehr auf der CreateChildControls-Methode des Steuerelements und entsprechend weniger auf der Renderingvorlage als benutzerdefinierte Feldrendering-Steuerelemente, die Sie für Computerbrowser erstellen. Außerdem setzen Sie beim Entwickeln von benutzerdefinierten mobilen Renderingsteuerelemente nicht oft die CreateChildControls-Methode selbst außer Kraft. Stattdessen setzen benutzerdefinierte mobile Renderingsteuerelemente typischerweise eine oder mehr der vier Methoden außer Kraft, die von der CreateChildControls -Methode aufgerufen werden:

Siehe auch

Referenz

FieldTypes-Element (Feldtypen)

FieldType-Element (Feldtypen)

Field-Element (Feldtypen)

Namespace Naming Guidelines

RenderPattern-Element (Feldtypen)

AlternateTemplateName

BaseValidator

ControlTemplate

CreateChildControls

DefaultAlternateTemplateName

DefaultTemplateName

EnsureChildControls

FieldRenderingControl

GetValidatedString

ItemFieldValue

Label

OnLoad()

RegularExpressions

RenderingTemplate

SPControlMode

SPFieldText

SPFieldValidationException

Template

TemplateName

TextBox

TextField

ValidationRule

Value

Konzepte

Gewusst wie: Erstellen einer benutzerdefinierten Feldklasse

Vorgehensweise: Erstellen einer benutzerdefinierten Feldtypdefinition

Bereitstellen benutzerdefinierter Feldtypen

Überprüfung von benutzerdefinierten Felddaten

Gewusst wie: Erstellen eines Feldrendering-Steuerelements

Gewusst wie: Erstellen von Feldrenderingvorlagen

Vorgehensweise: Erstellen eines benutzerdefinierten Feldtyps

Übersicht über Lösungen