Exemplarische Vorgehensweise: Erstellen eines Dienstobjekts für die Inhaltsverwaltung
Letzte Änderung: Mittwoch, 30. September 2009
Gilt für: SharePoint Foundation 2010
Inhalt dieses Artikels
ContentService-Klassendatei
ContentLocationCollection-Klassendatei
ContentLocation-Klassendatei
Hinzufügen einer benutzerdefinierten Aktion und von ASPX-Seiten
In dieser exemplarischen Vorgehensweise wird erläutert, wie die Logik für einen benutzerdefinierten Dienst zum Verwalten von Websiteinhalten in einer SharePoint Foundation-Bereitstellung definiert wird. Im Beispiel wird das Erstellen von Klassen veranschaulicht, die von Klassen im Microsoft.SharePoint.Administration-Namespace abgeleitet sind, sodass benutzerdefinierte Administratoreinstellungen in der Datenbank erhalten bleiben. Das Beispiel enthält Klassendateien, die Datenstrukturen mit Metadaten zu einer Liste von Speicherorten implementieren. Jeder Inhaltsspeicherort gibt dabei eine URL an, die beibehalten werden muss.
Im Beispiel werden Codedateien für die folgenden Klassen erstellt:
ContentService: Definiert das Objekt der obersten Ebene, das von der SPService-Klasse abgeleitet ist und die Logik zum Verwalten von Inhaltsspeicherorten in einer Bereitstellung angibt. Diese Klasse enthält Konstruktoren zum Initialisieren des ContentService-Objekts sowie Member zum Abrufen des Inhaltsdiensts und der zugehörigen Auflistung von Inhaltsspeicherorten.
ContentLocationCollection: Definiert eine Auflistungsklasse, die von der SPPerisistedChildCollection-Klasse erbt und ein Objekt angibt, das die Inhaltsspeicherorte enthält. Diese Klasse enthält einen Konstruktor und eine Add-Methode.
ContentLocation: Erbt von SPPersistedObject und definiert einen Inhaltsspeicherort. Diese Klasse enthält Konstruktoren und Member für benutzerdefinierte Eigenschaftseinstellungen.
Zusätzlich zum Erstellen einer Assembly mit den früheren Codedateien wird im Beispiel veranschaulicht, wie der Seite Vorgänge mit einem Feature für eine benutzerdefinierte Aktion ein Link hinzugefügt wird, sodass Administratoren auf den Dienst zugreifen können. Darüber hinaus wird beschrieben, wie mithilfe von benutzerdefinierten ASPX-Seiten die erforderliche Benutzeroberfläche zum Verwalten des Inhaltsdiensts und der zugehörigen Inhaltsspeicherorte bereitgestellt wird. Weitere Informationen zum Erstellen eines SharePoint Foundation-Projekts in Microsoft Visual Studio 2005 finden Sie unter Getting Started with Programmatically Customizing a SharePoint Web Site in Visual Studio.
ContentService-Klassendatei
Im folgenden Codebeispiel werden eine FormatType-Enumeration und die ContentService-Klasse der obersten Ebene definiert, die Konstruktoren und die folgenden Member enthält:
Local: Eine statische Eigenschaft zum Abrufen des aktuellen Inhaltsspeicherortdiensts.
Locations: Eine statische Eigenschaft, mit der auf die Auflistung von Inhaltsspeicherorten zugegriffen wird.
GetAllContentLocations: Eine Methode, von der alle durch den Dienst bereitgestellten Inhaltsspeicherorte zurückgegeben werden.
Format: Eine Eigenschaft, mit der der Formattyp für den Inhaltsdienst abgerufen oder festgelegt wird.
Fügen Sie am Anfang der anschließend angezeigten Codedateien eine Direktive zum Importieren des Microsoft.SharePoint.Administration-Namespaces hinzu, wie im folgenden Beispiel veranschaulicht. Legen Sie mithilfe des Persisted-Attributs fest, dass die Eigenschaftseinstellungen in der Datenbank beibehalten werden. Dem benutzerdefinierten Namespace, der im Beispiel Objekte enthält, ist der Name MS.Samples.SharePoint.ContentManager zugewiesen.
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports Microsoft.SharePoint.Administration
Namespace MS.Samples.SharePoint.ContentManager
Public Enum FormatType
HTML
XML
End Enum 'ContentLocationType
<System.Runtime.InteropServices.Guid("BB69A6EB-3230-43ca-B4F5-752EAC39C74A")> _
Public Class ContentService
Inherits SPService
<Persisted()> _
Private formatType As FormatType
Private Shared locations As ContentLocationCollection
Private Shared local As ContentService = Nothing
' A static property that retrieves the content service.
Public Shared ReadOnly Property Local() As ContentService
Get
If ContentService.local Is Nothing Then
ContentService.local = _
SPFarm.Local.Services.GetValue < ContentService > "ContentService"
End If
Return ContentService.local
End Get
End Property
' A static property for accessing the location collection.
Public Shared ReadOnly Property Locations() As ContentLocationCollection
Get
If Me.locations Is Nothing Then
Me.locations = New ContentLocationCollection(Me)
End If
Return Me.locations
End Get
End Property
' An empty public constructor required for serialization.
Public Sub New()
End Sub 'New
Public Sub New(farm As SPFarm)
MyBase.New("ContentService", farm)
' Add code to initialize as needed.
End Sub 'New
' A method to retrieve the content location collection.
Public Function GetAllContentLocations() As ContentLocationCollection
Dim service As ContentService = ContentService.Local
If service Is Nothing Then
Return Nothing
End If
Return service.Locations
End Function 'GetAllContentLocations
Public Property Format () As FormatType
Get
Return Me.formatType
End Get
Set
Me.formatType = value
End Set
End Property
End Class 'ContentService
End Namespace 'MS.Samples.SharePoint.ContentManager
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint.Administration;
namespace MS.Samples.SharePoint.ContentManager
{
public enum FormatType
{
HTML,
XML
}
[System.Runtime.InteropServices.Guid("BB69A6EB-3230-43ca-B4F5-752EAC39C74A")]
public class ContentService : SPService
{
[Persisted]
private FormatType formatType;
private static ContentLocationCollection locations;
private static ContentService local = null;
/* A static property that retrieves the content service. */
public static ContentService Local
{
get
{
if (ContentService.local == null)
{
ContentService.local =
SPFarm.Local.Services.GetValue<ContentService>("ContentService");
}
return ContentService.local;
}
}
/* A static property for accessing the location collection. */
public static ContentLocationCollection Locations
{
get
{
if (this.locations == null)
{
this.locations = new ContentLocationCollection(this);
}
return this.locations;
}
}
/* An empty public constructor required for serialization. */
public ContentService()
{;}
public ContentService(SPFarm farm)
: base("ContentService", farm)
{/* Add code to initialize as needed. */}
/* A method to retrieve the content location collection. */
public ContentLocationCollection GetAllContentLocations()
{
ContentService service = ContentService.Local;
if (service == null)
{
return null;
}
return service.Locations;
}
public FormatType Format
{
get
{
return this.formatType;
}
set
{
this.formatType = value;
}
}
}
}
Definieren Sie eine benutzerdefinierte Provision-Methode, um das ContentService-Objekt der Datenbank hinzuzufügen, wie im folgenden Beispiel veranschaulicht. Diese Methode kann in der vorherigen ContentService-Klasse enthalten sein oder separat aufgeführt werden, sodass sie modulbezogener ist und aus verschiedenen Kontexten aufgerufen werden kann, beispielsweise aus einem Befehlszeilenvorgang oder einem Feature-Installationsprogramm, das Sie zum Installieren des Diensts erstellen können. Die Provision-Methode fügt der Datenbank das ContentService-Objekt hinzu, ohne dass Sie die Assembly und die Klasse angeben müssen.
Hinweis |
---|
Die von Ihnen festgelegte benutzerdefinierte Provision-Methode ist nicht mit der Provision-Methode der SPPersistedObject-Basisklasse identisch. |
Public Sub Provision()
' Add the ContentService administration object to the database.
Dim contentService As ContentService = ContentService.Local
If contentService Is Nothing Then
contentService = New ContentService(SPFarm.Local)
contentService.Update()
End If
End Sub
public void Provision()
{
/* Add the ContentService administration object to the database. */
ContentService contentService = ContentService.Local;
if (contentService == null)
{
contentService = new ContentService(SPFarm.Local);
contentService.Update();
}
}
ContentLocationCollection-Klassendatei
Im folgenden Beispiel wird die ContentLocationCollection-Klasse definiert, die Konstruktoren und eine Add-Methode enthält, mit denen der Auflistung neue Inhaltsspeicherorte hinzugefügt werden.
Public Class ContentLocationCollection
Public Sub New(parent As SPPersistedObject)
MyBase.New(parent)
End Sub
Public Sub Add(url As String)
Dim location As New ContentLocation(String.Empty, Me.Parent)
location.Url = url
location.Update()
End Sub
End Class
public class ContentLocationCollection : SPPersistedChildCollection<ContentLocation>
{
public ContentLocationCollection(SPPersistedObject parent) : base(parent)
{;}
public void Add(String url)
{
ContentLocation location = new ContentLocation(String.Empty, this.Parent);
location.Url = url;
location.Update();
}
}
ContentLocation-Klassendatei
Im folgenden Beispiel werden eine Enumeration (ContentLocationType), mit der der Typ des Inhaltsspeicherorts angegeben wird, sowie eine Klasse (ContentLocation) definiert, die die Eigenschaften für einen Inhaltsspeicherort festlegt. Zu diesen Eigenschaften zählen Anzeigename, Typ, URL und Ausgabepfad. Durch Angeben des Persisted-Attributs wird eine Eigenschaftseinstellung in der Datenbank beibehalten.
Die ContentLocation-Klasse enthält die folgenden Member:
DisplayName: Eigenschaft zum Abrufen des Anzeigenamens des Speicherorts.
Url: Eigenschaft zum Abrufen oder Festlegen der URL für einen Inhaltsspeicherort.
LocationType: Eigenschaft zum Abrufen oder Festlegen des Speicherorttyps.
ContentOutputPath: Eigenschaft zum Abrufen oder Festlegen eines Ausgabepfads.
Public Enum ContentLocationType
Web
List
End Enum 'ContentLocationType
Public Class ContentLocation
Inherits SPPersistedObject
<Persisted()> _
Private locationType As ContentLocationType
<Persisted()> _
Private contentOutputPath As String
<Persisted()> _
Private url As String
Public Sub New()
End Sub 'New
Public Sub New(name As String, parent As SPPersistedObject)
MyBase.New(name, parent)
End Sub 'New
Public Overrides ReadOnly Property DisplayName() As String
Get
Return Me.url
End Get
End Property
Public Property Url() As String
Get
Return Me.url
End Get
Set
If Me.url = value Then
Return
End If
Me.url = value
' The Name property must be unique among multiple children in a
' collection. Use the URL to ensure uniqueness.
Me.Name = Me.url
End Set
End Property
Public Property LocationType() As ContentLocationType
Get
Return Me.locationType
End Get
Set
Me.locationType = value
End Set
End Property
Public Property ContentOutputPath() As String
Get
Return Me.contentOutputPath
End Get
Set
Me.contentOutputPath = value
End Set
End Property
End Class 'ContentLocation
public enum ContentLocationType
{
Web,
List
}
public class ContentLocation : SPPersistedObject
{
[Persisted]
private ContentLocationType locationType;
[Persisted]
private String contentOutputPath;
[Persisted]
private String url;
public ContentLocation()
{}
public ContentLocation(string name, SPPersistedObject parent)
: base(name, parent)
{;}
public override string DisplayName
{
get
{
return this.url;
}
}
public String Url
{
get { return this.url; }
set
{
if (this.url == value)
{
return;
}
this.url = value;
/* The Name property must be unique among multiple children in a collection. Use the URL to ensure uniqueness. */
this.Name = this.url;
}
}
public ContentLocationType LocationType
{
get { return this.locationType; }
set { this.locationType = value; }
}
public String ContentOutputPath
{
get { return this.contentOutputPath; }
set { this.contentOutputPath = value; }
}
}
Hinzufügen einer benutzerdefinierten Aktion und von ASPX-Seiten
Fügen Sie dem Ordner \Admin ASPX-Seiten hinzu, und definieren Sie den zugehörigen CodeBehind in der Assembly. Weitere Informationen zu ASPX-Administratorseiten finden Sie unter Zentraladministrationsseiten. Fügen Sie einer Seite der Zentraladministration mit einem Feature eine benutzerdefinierte Aktion hinzu. Weitere Informationen zum Hinzufügen einer benutzerdefinierten Aktion finden Sie unter Vorgehensweise: Ändern der Benutzeroberfläche mit benutzerdefinierten Aktionen.
Mit der folgenden Datei Elements.xml wird der Seite Vorgänge, die mit der Seite contentman.aspx zum Verwalten von Inhaltsspeicherorten verknüpft ist, im Abschnitt Globale Konfiguration die benutzerdefinierte Aktion Inhaltsexport hinzugefügt.
<?xml version="1.0" encoding="utf-8" ?>
<Elements xmlns="https://schemas.microsoft.com/sharepoint/">
<CustomAction
Id="ContentManagement"
GroupId="GlobalConfiguration"
Location="Microsoft.SharePoint.Administration.Operations"
Sequence="31"
Title="Content export">
<UrlAction Url="/_admin/contentman.aspx" />
</CustomAction>
</Elements>
Die Datei contentman.aspx, auf die die benutzerdefinierte Aktion zeigt, kann Links zu Formularseiten für das Erstellen, Anzeigen oder Bearbeiten von Inhaltsspeicherortelementen enthalten. CodeBehind für die Seite Neues Element kann eine Logik wie im folgenden Beispiel enthalten. Mit dieser werden Speicherortelemente für URLs hinzugefügt, die auf der Seite im Feld urlImportExport eingegeben werden. Außerdem erfolgt eine Umleitung zur Seite contentman.aspx:
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports Microsoft.SharePoint.WebControls
Imports System.Web.UI
Imports System.Web.UI.WebControls
Namespace MS.Samples.SharePoint.ContentManager
Public Class NewContentImportExportPage
Inherits Page
Protected urlImportExport As InputFormTextBox
Protected Sub SaveNewImportExport(sender As Object, eventArgs As EventArgs)
Dim service As ContentService = ContentService.Local
service.Locations.Add(Me.urlImportExport.Text)
Response.Redirect("/_admin/contentman.aspx", True)
End Sub 'SaveNewImportExport
End Class 'NewContentImportExportPage
End Namespace 'MS.Samples.SharePoint.ContentManager
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint.WebControls;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace MS.Samples.SharePoint.ContentManager
{
public class NewContentImportExportPage : Page
{
protected InputFormTextBox urlImportExport;
protected void SaveNewImportExport(object sender, EventArgs eventArgs)
{
ContentService service = ContentService.Local;
service.Locations.Add(this.urlImportExport.Text);
Response.Redirect("/_admin/contentman.aspx", true);
}
}
}
Nachdem Sie den benutzerdefinierten Dienst implementiert haben, können Sie auf seine Daten zugreifen, indem Sie den Dienst instanziieren und seine Member aufrufen. Sie können auch weitere benutzerdefinierte Objekte erstellen, die von anderen beibehaltenen Objekten im Microsoft.SharePoint.Administration-Namespace erben. Sie können beispielsweise eine von der SPJobDefinition-Klasse abgeleitete Klasse erstellen, um einen Zeitgeberauftrag zu implementieren und mit dem Dienst zeitlich gesteuerte Operationen auszuführen. Sie können auch von der SPFeatureReceiver-Klasse erben, um die Ereignisbehandlung zum Registrieren des Diensts zu definieren, wenn dieser als Feature installiert oder aktiviert wird.
Über beibehaltene Objekte können Sie der Datenbank benutzerdefinierte Administrationsobjekte hinzufügen, in denen die Logik und die Daten für eine auf der SharePoint Foundation-Plattform erstellte Webanwendung beibehalten wird.