Freigeben über


Gewusst wie: Erstellen eines mobilen Adapters

Letzte Änderung: Donnerstag, 17. März 2011

Gilt für: SharePoint Foundation 2010

In diesem Thema wird das Erstellen einer mobilen Adapterklasse erläutert, mit der ein Webpart auf einer Microsoft SharePoint Foundation-Seite für mobile Geräte zur Verfügung gestellt wird.

Ein konkretes Beispiel für das Anpassen eines Webparts finden Sie unter Exemplarische Vorgehensweise: Erstellen eines mobilen Adapters.

Einrichten der Entwicklungsumgebung

Vorausgesetzte Entwicklungsaufgaben

  1. Falls die Webpartseiten, die Sie für mobile Geräte zur Verfügung stellen möchten, noch nicht vorhanden sind, müssen Sie diese erstellen. Weitere Informationen finden Sie unter Webpartinfrastruktur in SharePoint Foundation und WebPartPage.

    HinweisHinweis

    Es werden keine Seiten der WebPartMobilePage-Klasse erstellt. Diese werden zur Laufzeit erstellt, wenn eine Webpartseite (WebPartPage) von einem mobilen Gerät angefordert wird.

  2. Falls die Webparts, die Sie für den mobilen Zugriff anpassen möchten, noch nicht vorhanden sind, müssen Sie diese erstellen. Weitere Informationen finden Sie unter Webpartinfrastruktur in SharePoint Foundation und Web Parts Overview.

Erstellen und Bereitstellen einer mobilen Adapterklasse

  1. Fügen Sie in einem Visual Studio-Klassenbibliotheksprojekt einen Verweis auf System.Web und Microsoft.SharePoint.dll hinzu, und fügen Sie dann eine using-Anweisung (Imports in Visual Basic) für den Namespace Microsoft.SharePoint.WebPartPages hinzu. Möglicherweise müssen Sie using-Anweisungen für andere Namespaces hinzufügen, dies hängt von den Einzelheiten der Adapterimplementierung ab. In der Regel werden von mobilen Adaptern Aufrufe für Typen in System.Web.UI.MobileControls, Microsoft.SharePoint und Microsoft.SharePoint.MobileControls gestartet.

  2. Fügen Sie eine Klasse mit dem Namen WebPartClassMobileAdapter hinzu, wobei WebPartClass der Name des Webparts ist, den Sie anpassen. Falls es sich bei dem Webpart z. B. um StockListWebPart handelt, geben Sie als Namen für die Adapterklasse StockListWebPartMobileAdapter an. Legen Sie fest, dass von WebPartMobileAdapter geerbt wird.

  3. Legen Sie den Namespace so fest, dass er den Richtlinien in Richtlinien für die Namespacebenennung entspricht. Verwenden Sie für einen mobilen Adapter einen Namen wie MyCompany.SharePoint.WebPartPages.MobileAdapters.

  4. Obwohl die WebPartMobileAdapter.Control-Eigenschaft nicht mit virtual oder override (Overridable und Overrides in Visual Basic) gekennzeichnet ist, müssen Sie sie möglicherweise überschreiben, indem Sie sie ausblenden und ersetzen. Deklarieren Sie hierzu eine neue Control-Eigenschaft in der abgeleiteten Klasse, indem Sie das new-Schlüsselwort (Shadows in Visual Basic) verwenden. Weitere Informationen zu Gründen, dies zu tun, und zum auszuführenden Verfahren finden Sie im entsprechenden Thema zu WebPartMobileAdapter.Control.

  5. Überschreiben Sie die CreateControlsForSummaryView()-Methode, falls die Standardimplementierung für den mobilen Zugriff auf das Webpart nicht geeignet ist. Bei einer Überschreibung sollten grundsätzlich alle benötigten untergeordneten Steuerelemente erstellt und der Controls-Auflistung in der Reihenfolge hinzugefügt werden, in der sie auf einem mobilen Gerät angezeigt werden sollen. In der Regel soll zumindest ein kleines Symbol und ein Titel für das Webpart in der Zusammenfassungsansicht auf einem mobilen Gerät angezeigt werden. (Falls nur dies in der Zusammenfassungsansicht angezeigt werden soll, müssen Sie CreateControlsForSummaryView() nicht überschreiben.) Zur Erleichterung werden zwei Hilfsmethoden bereitgestellt: CreateWebPartIcon(WebPartMobileAdapter.WebPartIconLink) und CreateWebPartLabel().

    Manchmal werden jedoch mehr Informationen benötigt, sogar in der Zusammenfassungsansicht. Angenommen, das angepasste Webpart besitzt mehrere untergeordnete Elemente, alle vom selben Typ. Sie können der Zusammenfassungsansicht die Summe der untergeordneten Elemente mit einem Label-Steuerelement hinzufügen, das auf das Symbol und den Titel folgt. Im folgenden Code wird gezeigt, wie Sie dabei vorgehen müssen.

    Wichtiger HinweisWichtig

    In diesem Beispiel gelten zwei Voraussetzungen: Erstens besitzt das angepasste Webpart eine Count-Eigenschaft vom Typ String, die die Summe der untergeordneten Elemente zurückgibt. Und zweitens kann auf diese Eigenschaft zugegriffen werden, da die Control-Eigenschaft ausgeblendet wurde und wie im vorhergehenden Schritt angedeutet ersetzt wurde.

    protected override void CreateControlsForSummaryView()
    {
        Image iconImage = this.CreateWebPartIcon(WebPartIconLink.LinkToDetailView);
        iconImage.BreakAfter = false;
        this.Controls.Add(iconImage);
    
        Label titleLabel = this.CreateWebPartLabel();
        titleLabel.BreakAfter = false;
        this.Controls.Add(titleLabel);
    
        Label count = new Label() { Text=this.Control.Count.ToString() }
        this.Controls.Add(count);
    }
    
    Protected Overrides Sub CreateControlsForSummaryView()
            Dim iconImage As Image = Me.CreateWebPartIcon(WebPartIconLink.LinkToDetailView)
            iconImage.BreakAfter = False
            Me.Controls.Add(iconImage)
    
            Dim titleLabel As Label = Me.CreateWebPartLabel()
            titleLabel.BreakAfter = False
            Me.Controls.Add(titleLabel)
    
            Dim count As New Label() With {.Text=Me.Control.Count.ToString()} 
            Me.Controls.Add(count)
    End Sub
    

    Beachten Sie, dass beim Übergeben von LinkToDetailView an die CreateWebPartIcon(WebPartMobileAdapter.WebPartIconLink)-Methode wie in diesem Beispiel gezeigt ein Pfeilspitzensymbol gerendert wird, das als klickbares Steuerelement verwendet werden kann und das Erweiterungsskript von SharePoint Foundation Mobile Adapter Framework ausführt, vorausgesetzt, dass der Browser auf dem Gerät CSS und ECMAScript 1.0 oder höher unterstützt. Wenn ein Benutzer auf das Steuerelement klickt, wird das Webpart in die Detailansicht erweitert und das Symbol ändert sich zu einer nach unten zeigenden Pfeilspitze (die ein Steuerelement zum Ausführen des Reduzierungsskripts ist). Falls der Browser keine Unterstützung für CSS und ECMAScript 1.0 oder höher bietet, wird ein anderes Symbol gerendert, und wenn auf dieses Symbol geklickt wird, wird der Benutzer zu einer Seite (mblwpdetail.aspx) geführt, die eine Detailansicht des Webparts enthält. Falls Sie nicht möchten, dass eine Detailansicht des Webparts auf mobilen Seiten angezeigt wird, übergeben Sie stattdessen NoLink an CreateWebPartIcon(WebPartMobileAdapter.WebPartIconLink).

    Es folgen einige weitere Aktionen, die Sie beim Außerkraftsetzen von CreateControlsForSummaryView() möglicherweise ausführen möchten:

    • Falls in der Renderinglogik angenommen wird, dass bestimmte Entitäten nicht null sind oder dass andere Bedingungen true ergeben, sollten Sie die Außerkraftsetzung so entwerfen, dass die Annahmen getestet werden und entweder nichts geschieht oder ein alternatives Rendering bereitgestellt wird, falls die Bedingungen nicht true ergeben. Wenn von dem angepassten Webpart z. B. eine Listenansicht gerendert wird, können Sie ermitteln, ob die Ansicht als mobile Ansicht entworfen wurde, indem Sie this.Control.View.MobileView testen. Weitere Informationen finden Sie unter MobileView.

    • Falls Aspekte des angepassten Webparts nicht nur durch ein Symbol oder einen Titel dargestellt werden, sollten Sie kleine Versionen von diesen für die Zusammenfassungsansicht erstellen. Wenn z. B. ein Kreisdiagramm Teil des Webparts ist, kann die Außerkraftsetzung von CreateControlsForSummaryView() eine kleine Abbildung des Kreisdiagramms enthalten. Wenn das Webpart hingegeben ein Foto enthält, kann die Außerkraftsetzung eine sehr kleine Version des Bilds enthalten.

  6. Setzen Sie die CreateControlsForDetailView()-Methode außer Kraft, wenn die Standardimplementierung für den mobilen Zugriff auf das Webpart nicht geeignet ist. In der Standardimplementierung wird ein Symbol und ein Titel für ein Webpart gefolgt von der Meldung gerendert, dass für das Webpart keine Detailansicht verfügbar ist. Falls Sie CreateControlsForSummaryView() außer Kraft gesetzt haben und keine Detailansicht zur Verfügung stellen möchten, setzen Sie CreateControlsForDetailView() außer Kraft und verbinden Sie damit keine Aktion, wie im folgenden Beispiel gezeigt.

    protected override void CreateControlsForDetailView(){}
    
    Protected Overrides Sub CreateControlsForDetailView()
    End Sub
    

    Falls eine Detailansicht vorhanden sein soll, verwenden Sie denselben Prozess zum Außerkraftsetzen von CreateControlsForDetailView() wie beim Außerkraftsetzen von CreateControlsForSummaryView(), jedoch mit der Ausnahme, dass Sie mehr Details des Webparts anzeigen. Falls das Webpart z. B. mehrere untergeordnete Elemente vom selben Typ enthält, können Sie die ersten paar davon in der Detailansicht anzeigen. Im folgenden Beispielcode wird die CreateControlsForDetailView()-Methode außer Kraft gesetzt, sodass bis zu drei Elemente der aktuellen Liste als untergeordnetes Element unter dem Symbol und Titel des Webparts angezeigt werden. Eine ausführlichere Erläuterung zu diesem Code finden Sie unter Exemplarische Vorgehensweise: Erstellen eines mobilen Adapters.

    protected override void CreateControlsForDetailView()
    {
        Image iconImage = this.CreateWebPartIcon(WebPartIconLink.LinkToSummaryView);
        iconImage.BreakAfter = false;
        this.Controls.Add(iconImage);
    
        Label titleLabel = this.CreateWebPartLabel();
        this.Controls.Add(titleLabel);
    
        SPSite siteCollection = SPContext.Current.Site;
        SPUser currentUser = SPContext.Current.Web.CurrentUser;
        SPList taskList = siteCollection.AllWebs["MyGPSite"].Lists["Tasks"];
        SPListItemCollection allTasks = taskList.GetItems(taskList.DefaultView);
    
        // Use LINQ to filter out other users ... 
        var lightweightTasksOfUser = from SPListItem task in allTasks
                                     where task["AssignedTo"].ToString().EndsWith(currentUser.Name)
                                     select new {task.Title, Priority=task["Priority"]}; // ... and unneeded columns.
    
        Int16 itemCount = 1;
        foreach (var lightweightTask in lightweightTasksOfUser)
        {
            Image taskIcon = new Image() { ImageUrl = this.ItemBulletIconUrl,
                                           BreakAfter = false};
            this.Controls.Add(taskIcon);
    
            Label taskTitle = new Label { Text = lightweightTask.Title,
                                          BreakAfter = false};
            taskTitle.Font.Bold = BooleanOption.True;
            this.Controls.Add(taskTitle);
    
            Label priority = new Label() { Text = " " + lightweightTask.Priority };
            priority.Font.Size = FontSize.Small; 
            this.Controls.Add(priority);
    
            this.Controls.Add(new LiteralText());
    
            // Render no more than 3 tasks, but provide link to others.
            if (itemCount++ >= 3)
            {
                Link moreItemLink = new Link
                {
                    Text = "All my tasks",
                    href = SPMobileUtility.GetViewUrl(taskList, taskList.Views["My Tasks"])
                };
                this.Controls.Add(moreItemLink);
                break;
            } // end "if limit has been reached"
    
        } // end "for each lightweight task of the current user"
    } // end CreateControlsForDetailView
    
    Protected Overrides Sub CreateControlsForDetailView()
        Dim iconImage As Image = Me.CreateWebPartIcon(WebPartIconLink.LinkToSummaryView)
        iconImage.BreakAfter = False
        Me.Controls.Add(iconImage)
    
        Dim titleLabel As Label = Me.CreateWebPartLabel()
        Me.Controls.Add(titleLabel)
    
        Dim siteCollection As SPSite = SPContext.Current.Site
        Dim currentUser As SPUser = SPContext.Current.Web.CurrentUser
        Dim taskList As SPList = siteCollection.AllWebs("MyGPSite").Lists("Tasks")
        Dim allTasks As SPListItemCollection = taskList.GetItems(taskList.DefaultView)
    
        ' Use LINQ to filter out other users ... 
        Dim lightweightTasksOfUser = From task As SPListItem In allTasks
                                     Where task("AssignedTo").ToString().EndsWith(currentUser.Name)
                                     Select New With {Key task.Title, Key .Priority = task("Priority")} '... and unneeded columns.
    
        Dim itemCount As Int16 = 1
        For Each lightweightTask In lightweightTasksOfUser
            Dim taskIcon As New Image() With {.ImageUrl = Me.ItemBulletIconUrl, .BreakAfter = False}
            Me.Controls.Add(taskIcon)
    
            Dim taskTitle As Label = New Label With {.Text = lightweightTask.Title, .BreakAfter = False}
            taskTitle.Font.Bold = BooleanOption.True
            Me.Controls.Add(taskTitle)
    
            Dim priority As New Label() With {.Text = " " & lightweightTask.Priority}
            priority.Font.Size = FontSize.Small
            Me.Controls.Add(priority)
    
            Me.Controls.Add(New LiteralText())
    
            ' Render no more than 3 tasks, but provide link to others.
    
            If itemCount >= 3 Then
                itemCount += 1
                Dim moreItemLink As Link = New Link With {.Text = "All my tasks", .href = SPMobileUtility.GetViewUrl(taskList, taskList.Views("My Tasks"))}
                Me.Controls.Add(moreItemLink)
                Exit For
            End If ' end "if limit has been reached"
            itemCount += 1
        Next  ' end "for each lightweight task of the current user"
    End Sub ' end CreateControlsForDetailView
    
  7. Falls Sie benutzerdefinierte Logik während der Ereignisse Init, Load, PreRender oder Unload benötigen, setzen Sie entsprechend die Methode OnLoadForMobile(EventArgs), OnInitForMobile(EventArgs), OnPreRenderForMobile(EventArgs) oder OnUnloadForMobile(EventArgs) außer Kraft.

  8. Wenn mobile Benutzer zu einer benutzerdefinierten Seite mit Zusammenfassungsansicht oder Detailansicht umgeleitet werden sollen anstatt zu den Seiten, die von den integrierten Standardseiten bereitgestellt werden, setzen Sie die Eigenschaft SummaryViewPageUrl oder DetailViewPageUrl außer Kraft.

  9. Setzen Sie zum Ändern des Symbols, das neben dem Webparttitel angezeigt wird, mindestens eine der folgenden Eigenschaften außer Kraft:

    • SummaryViewTitleIconUrl – Das neben dem Titel angezeigte Symbol, wenn das Webpart reduziert ist.

    • DetailViewTitleIconUrl – Das neben dem Titel angezeigte Symbol, wenn das Webpart erweitert ist.

    • TitleIconUrl– Das neben dem Titel angezeigte Symbol, wenn das Erweiterungs-/Reduzierungsskript vom mobilen Gerät nicht unterstützt wird.

    Der folgende Code ist ein Beispiel zum Außerkraftsetzen einer dieser Eigenschaften. Wenn das Webpart beim Außerkraftsetzen von TitleIconUrl eine Liste anzeigt und die Liste ein eigenes Symbol in der ImageUrl-Eigenschaft enthält, wird dieses Symbol angezeigt.

    protected override string TitleIconUrl
    {
        get
        { 
            SPContext context = SPContext.GetContext(HttpContext.Current);
    
            if (String.IsNullOrEmpty(context.List.ImageUrl))
            {
                return base.TitleIconUrl;
            }
            return context.List.ImageUrl;
        }
    }
    
    Protected Overrides ReadOnly Property TitleIconUrl() As String
        Get
            Dim context As SPContext = SPContext.GetContext(HttpContext.Current)
    
            If String.IsNullOrEmpty(context.List.ImageUrl) Then
                Return MyBase.TitleIconUrl
            End If
            Return context.List.ImageUrl
        End Get
    End Property
    
  10. Kompilieren Sie die Assembly, legen Sie einen starken Namen fest, und stellen Sie sie im globalen Assemblycache (Global Assembly Cache, GAC), oder im \BIN-Ordner der Webanwendung auf jedem Front-End-Webserver in der Farm bereit. Hierzu wird das Bereitstellen des Adapters mit einer SharePoint Foundation-Projektmappe empfohlen. Zur Vereinfachung wird in diesem Thema vorausgesetzt, dass die Bereitstellung im GAC erfolgt. Weitere Informationen zu dieser Auswahl finden Sie unter Ablegen der Assembly im Ordner "Bin" oder globalen Assemblycache. Wenn Sie die Assembly nur im GAC des Entwicklungscomputers bereitstellen möchten, verwenden Sie das Hilfsprogramm gacutil.exe. Am einfachsten können Sie sicherstellen, dass jede neue Version des Adapters im GAC installiert wird, indem Sie das Hilfsprogramm aus einer Batchdatei ausführen, die mit einem Postbuildereignis in Visual Studio gestartet wird. Die Batchdatei muss die folgende Zeile enthalten, wobei AssemblyName durch den Namen der Assembly ersetzt wird.

    HinweisHinweis

    Bei diesem Code wird vorausgesetzt, dass Sie die Empfehlungen in Vorgehensweise: Hinzufügen von Toolverzeichnissen zur PATH-Umgebungsvariablen befolgt haben.

    gacutil –if bin\debug\AssemblyName.dll
    

Bearbeiten der Datei "compat.browser"

  1. Öffnen Sie die Datei \\Inetpub\wwwroot\wss\VirtualDirectories\port_number\App_Browsers\compat.browser, wobei port_number der Port der Webanwendung ist, in einem Texteditor, und navigieren Sie zum <browser>-Element mit dem refID-Attributwert default. Es hat ein untergeordnetes <controlAdapters>-Element, das so ähnlich wie in dem folgenden Beispiel aussieht:

    <controlAdapters>
      <adapter controlType="Microsoft.SharePoint.WebPartPages.XsltListViewWebPart, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
        adapterType="Microsoft.SharePoint.WebPartPages.XsltListViewWebPartMobileAdapter, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
      <adapter controlType="Microsoft.SharePoint.WebPartPages.ListViewWebPart, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
        adapterType="Microsoft.SharePoint.WebPartPages.ListViewWebPartMobileAdapter, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
      <adapter controlType="Microsoft.SharePoint.Applications.GroupBoard.WebPartPages.WhereaboutsWebPart, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
        adapterType="Microsoft.SharePoint.WebPartPages.WhereaboutsWebPartMobileAdapter, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
      <adapter controlType="Microsoft.SharePoint.WebPartPages.ImageWebPart, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
        adapterType="Microsoft.SharePoint.WebPartPages.ImageWebPartMobileAdapter, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
    </controlAdapters>
    
  2. Fügen Sie ein <adapter>-Element als untergeordnetes Element des <controlAdapters>-Elements hinzu, um die Adapterklasse dem Webpart zuzuordnen, von dem es adaptiert wird, wobei das Muster im Beispiel oben befolgt wird. Beachten Sie, dass die controlType- und adapterType-Attribute erforderlich sind. Beides sind die vollqualifizierten Namen der Klasse und der aus vier Teilen bestehende Name der Assembly. Sie können das öffentliche Schlüsseltoken der Adapterassembly abrufen, indem Sie in Visual Studio das Get Assembly Public Key-Element im Menü Extras verwenden. (Falls das Element nicht vorhanden ist, finden Sie hier weitere Informationen: Gewusst wie: Erstellen eines Tools zum Abrufen des öffentlichen Schlüssels einer Assembly.) Weitere Informationen zu diesem XML-Markup finden Sie unter Schema der Browserdefinitionsdatei (browsers-Element).

    Es folgen Beispiele für die neuen <adapter>-Elemente. Das erste gilt für ein Contoso-Steuerelement, das das im Lieferumfang von SharePoint Foundation enthaltene UserTasksWebPart adaptiert. Das zweite wird für das Northwinds-Steuerelement verwendet, das ein Northwinds-Webpart in derselben Northwinds-Projektmappe adaptiert.

      <adapter controlType="Microsoft.SharePoint.WebPartPages.UserTasksWebPart, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c "
        adapterType="Contoso.SharePoint.WebPartPages.UserTasksWebPartMobileAdapter, Contoso, Version=1.0.0.0, Culture=neutral, PublicKeyToken=eedb3d3ba3b4c675" />
    
      <adapter controlType="NorthWinds.SharePoint.WebPartPages.VotingWebPart, Northwinds, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ffec2e2af2b4c675"
        adapterType="NorthWinds.SharePoint.WebPartPages.VotingWebPartMobileAdapter, NorthWinds, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ffec2e2af2b4c675" />
    
    HinweisHinweis

    Wenn Sie die Adapterklasse für eine Serverfarm bereitstellen möchten, müssen Sie die compat.browser-Datei wie weiter oben beschrieben auf jedem Front-End-Webserver ändern. Die vorhandene compat.browser-Datei sollte nicht mit einer eigenen compat.browser-Datei überschrieben werden, denn sonst können Adapterzuordnungen unterbrochen werden, die von anderen SharePoint Foundation Lösungsanbietern erstellt wurden. Sie können den Adapter als Teil eines SharePoint Foundation-Features bereitstellen. Fügen Sie im FeatureActivated(SPFeatureReceiverProperties)-Ereignishandler Code zum Erstellen eines Zeitgeberauftrags (SPJobDefinition) hinzu, von dem das erforderliche <adapter>-Element der compat.browser-Datei auf jedem Front-End-Webserver hinzugefügt wird. Detaillierte Information zum programmgesteuerten Bearbeiten der Datei compat.brower auf allen Servern mithilfe eines Zeitgeberauftrags finden Sie unter Gewusst wie: Ausführen von Code auf allen Webservern.

Registrieren des Adapters als sicheres Steuerelement

  1. Sie müssen die Adapterklasse als sicheres Steuerelement registrieren.

    TippTipp

    Es wird empfohlen, dass Sie den Adapter durch das Bereitstellen des Adapters mit einer SharePoint Foundation-Lösung registrieren. Die in diesem Abschnitt erläuterten Schritte sind nur erforderlich, wenn der Entwicklungscomputer ein einzelner Front-End-Webserver ist. Wenn Sie eine SharePoint Foundation-Lösung verwenden, können Sie Steuerelemente auf allen Front-End-Webservern automatisch registrieren, wenn die Lösung bereitgestellt wird. Weitere Informationen zum Verwenden der Lösungsbereitstellung zum Registrieren von Steuerelementen als sicher finden Sie unter Übersicht über Lösungen, Manuelles Erstellen einer Lösung und Solution-Schema.

  2. Fügen Sie im Visual Studio-Projekt eine XML-Datei mit einem Namen im Format webconfig.*.xml hinzu, wobei * durch den Namen des Unternehmens oder durch einen anderen Namen ersetzt wird, der aller Wahrscheinlichkeit nach nicht von einem anderen SharePoint Foundation-Lösungsanbieter verwendet wird.

  3. Fügen Sie der Datei wie im Markup unten zu sehen ein <action>-Element hinzu. Das TypeName-Attribut des <SafeControl>-Elements kann der Name der Adapterklasse sein, beispielsweise UserTasksWebPartMobileAdapter. Falls Sie mehrere Adapterklassen in demselben Namespace besitzen, können Sie "*" als Wert für TypeName verwenden. Der folgende Code ist ein Beispiel dafür.

    <action>
      <remove path="configuration/SharePoint/SafeControls/SafeControl[@Assembly=MyCompany.SharePoint.WebPartPages.MobileAdapters3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=yourAssemblyPublicKeyToken']" />
    
      <add path="configuration/SharePoint/SafeControls">
        <SafeControl
          Assembly="MyCompany.SharePoint.WebPartPages.MobileAdapters3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=yourAssemblyPublicKeyToken"
          Namespace="MyCompany.SharePoint.WebPartPages.MobileAdapters3"
          TypeName="*"
          Safe="True"
          AllowRemoteDesigner="True"
        />
      </add>
    </action>
    
    VorsichtVorsicht

    Durch die Verwendung von "*" als Wert für TypeName wird jede Klasse im Namespace als sicheres Steuerelement festgelegt. Falls in der Assembly einige Klassen enthalten sind, die nicht als sicher festgelegt werden sollen, verschieben Sie diese in eine andere Assembly, oder vermeiden Sie die Verwendung von "*".

    Weitere Informationen zum <SafeControl>-Element und zu webconfig.*.xml-Dateien finden Sie unter Gewusst wie: Erstellen einer ergänzenden .config-Datei und Arbeiten mit Web.config-Dateien.

  4. Speichern Sie die Datei. Sie muss nun in den Ordner %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\CONFIG auf dem Entwicklungscomputer kopiert werden. Am einfachsten können Sie dies auf dem Entwicklungscomputer ausführen, indem Sie die folgenden Zeilen einer Postbuildereignis-Befehlszeile oder einer Batchdatei hinzufügen, die in einer Postbuildereignis-Befehlszeile ausgeführt wird.

    HinweisHinweis

    Bei diesem Code wird vorausgesetzt, dass Sie die Empfehlungen in Vorgehensweise: Hinzufügen von Toolverzeichnissen zur PATH-Umgebungsvariablen befolgt haben.

    xcopy /y webconfig.MyCompany.xml "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\CONFIG"
    stsadm –o copyappbincontent
    
  5. Der stsadmn.exe-Befehl copyappbincontent führt das <action>-Element aus, das in der Datei webconfig.*.xml definiert ist. In diesem Fall wird das neue <SafeControl>-Element für den Adapter in die web.config-Datei am Stamm der Webanwendung eingefügt. (Zuerst werden alle vorhandenen <SafeControl>-Elemente für den Adapter entfernt. Dadurch können Sie den stsadm-Vorgang mit jeder Erstellung ausführen, ohne dass das <SafeControl>-Element dupliziert wird.) Weitere Informationen zu copyappbincontent und stsadm.exe finden Sie unter Befehlszeilentool "Stsadm" (Windows SharePoint Services) und Copyappbincontent: Stsadm-Vorgang (Office SharePoint Server)