Maximieren der Nutzung von „modernen“ Listen und Bibliotheken

In diesem Artikel wird behandelt, wie Sie erreichen, dass die größte Anzahl von Listen und Bibliotheken automatisch mithilfe der modernen Benutzeroberfläche angezeigt wird.

Sie können noch nicht alle Listen und Bibliotheken in einer modernen Benutzeroberfläche anzeigen, denn:

  • Bestimmte Typen von Listen und Bibliotheken, sind vom SharePoint-Team noch nicht für die Anzeige in einer modernen Benutzeroberfläche entwickelt worden, zum Beispiel eine Aufgabenliste oder eine Ereignisliste. Sie können entweder warten, bis das SharePoint-Team eine moderne Version implementiert oder sie verwenden eine alternative Option. Sie können beispielsweise Microsoft Planner anstelle einer klassischen Aufgabenliste oder den Kalender Ihrer Microsoft 365-Gruppe statt eines klassischen SharePoint-Ereignislisten-Kalenders verwenden.

  • Bestimmte Typen von Listen und Bibliotheken können in der modernen Benutzeroberfläche angezeigt werden, aber sie werden aufgrund einer inkompatiblen Konfiguration oder Anpassung blockiert. Dem können Sie abhelfen.

Wichtig

Modernisierungstools und alle anderen PnP-Komponenten sind Open-Source-Werkzeuge, die von einer aktiven Community unterstützt werden. Es gibt keine SLA für die Unterstützung von Open-Source-Tools durch offizielle Microsoft-Supportkanäle.

Listenvorlagen, die mit einer modernen Benutzeroberfläche angezeigt werden

Im Folgenden finden Sie die am häufigsten verwendeten Vorlagentypen für Listen, die SharePoint derzeit in der modernen Benutzeroberfläche (Stand Oktober 2018) darstellen kann:

  • Liste (100)
  • Dokumentbibliothek (101)
  • Liste von Links (103)
  • Ankündigungsliste (104)
  • Kontaktliste (105)
  • Bildbibliothek (109)
  • Formularbibliothek (115)
  • Websiteseiten-Bibliothek (119)
  • Benutzerdefiniertes Raster (120)
  • Liste höher gestufter Links (170)
  • Veröffentlichungsseitenbibliothek (850)
  • Objektbibliothek (851)
  • Problemverfolgungsliste (1100)

In diesem Abschnitt erfahren Sie, wie Sie Listen erkennen, die nicht als moderne Liste angezeigt werden, warum dies geschieht und wie Sie dies (sofern möglich) korrigieren. Bevor wir uns damit befassen, ist es jedoch wichtig zu wissen, dass die meisten Listen für Mandanten ohne Einschränkungen modern geladen werden. Listen, die nicht modern geladen werden, bleiben klassisch (z. B. Kalender oder Aufgabenliste) oder können durch Korrektur freigegeben werden entfernt, womit sich diese Artikelreihe befasst. Listen, die nicht als moderne Liste geladen werden, können zu 100 % verwendet werden, werden vollständig unterstützt und sollten Sie nicht davon abhalten, die moderne Benutzeroberfläche für Listen und Bibliotheken für Ihren Mandanten zu aktivieren.

Wichtig

SharePoint zeigt Listen und Bibliotheken automatisch in der modernen Darstellung an, wechselt bei Bedarf aber auch automatisch zur klassischen Darstellung. Dadurch wird sichergestellt, dass alle Listen, die modern dargestellt werden können, als moderne Listen dargestellt werden, während Listen, die nicht modern dargestellt werden können, einfach zur klassischen Darstellung wechseln.

Erkennen von Listen und Bibliotheken, die nicht die moderne Benutzeroberfläche verwenden

Die empfohlene Vorgehensweise, um herauszufinden, welche Listen und Bibliotheken nicht in der modernen Benutzeroberfläche angezeigt werden können, ist das Ausführen des SharePoint-Modernisierungsscanners. Dieses Tool führt eine umfassende Analyse aller Listen und Bibliotheken in Ihrem Mandanten aus und erstellt Berichte, in denen Sie Details dazu erhalten, welche Listen und Bibliotheken nicht in einer modernen Benutzeroberfläche angezeigt werden, und vor allem, warum das so ist. Basierend auf den Scanner-Ergebnissen können Sie die Blockierung von Listen und Bibliotheken aufheben, indem Sie sie korrigieren. Darum geht es im nächsten Kapitel.

Aufheben der Blockierung von Listen und Bibliotheken

Eine Liste kann aus einem oder mehreren Gründen blockiert werden, die alle in der Scannerausgabe aufgeführt sind. Nachfolgend finden Sie die typischen Ursachen und Lösungsansätze.

Inkompatible Anpassungen

Eine inkompatible Anpassung ist die häufigste Ursache dafür, dass Listen in der modernen Benutzeroberfläche nicht angezeigt werden. Das ist in der Regel auf einen der folgenden Gründe zurückzuführen:

  • Die Verwendung von JSLink
  • Die Verwendung von benutzerdefinierten Benutzeraktionen mit JavaScript-Einbettung

In diesen Fällen können Sie entweder die Anpassung entfernen (falls diese nicht mehr geschäftsrelevant ist) oder eine alternative Lösung erstellen. Weitere Informationen zum Erstellen von Anpassungen, die kompatibel mit der moderne Benutzeroberfläche für Listen und Bibliotheken sind, finden Sie im Artikel Modernisieren der Anpassungen. Da JSLink auf Webpart-Ebene verhindert, dass die Seite die moderne Benutzeroberfläche für Listen und Bibliotheken verwendet, müssen Sie diese Konfiguration entfernen. Sie können dies manuell tun, indem Sie ?ToolPaneView=2&pagemode=edit an die Seiten-URL anfügen, um die Seite in den Bearbeitungsmodus zu setzen, und dann die Webpart-Eigenschaften aktualisieren. Programmgesteuert können Sie das Webpart über die LimitedWebPartManager-Klasse abrufen und dann die entsprechenden Eigenschaften, wie im folgenden Codeausschnitt gezeigt, aktualisieren. Sie können diesen Codeausschnitt mit dem umfangreicheren und später auf dieser Seite gezeigten Code kombinieren, um eine vollständige Lösung zu erhalten.

webPart.Properties["JSLink"] = "";
webPart.SaveWebPartChanges();
cc.ExecuteQuery();

Vorhandensein von bestimmten Feldtypen

Bestimmte Feldtypen („BCS external data“, „Geolocation“, „OutcomeChoice“ im Bearbeitungsmodus, „Image“, „Html“ und „SummaryLinks“) funktionieren (noch) nicht in einer modernen Benutzeroberfläche. In diesen Fällen können Sie wie folgt vorgehen:

  • Entfernen Sie das Feld aus den Ansichten. Das Feld ist dabei immer noch vorhanden. Sie erhalten also eine klassische Bearbeitungsoberfläche, aber die Ansichten sind modern.
  • Migrieren Sie die Felddaten in ein neues Feld, das mit der modernen Benutzeroberfläche kompatibel ist.
  • Löschen Sie das Feld vollständig, wenn es nicht verwendet wird.

Blockieren der modernen Benutzeroberfläche und der Bibliotheksoberfläche auf Website- oder Webebene

Die Benutzeroberfläche für moderne Listen und die Bibliothek kann für eine vollständige Websitesammlung (Websiteebene) oder für eine oder mehrere Websites (Webebene) blockiert sein. Die Behebung dieses Problems erfolgt über Deaktivierung der entsprechenden Website- oder Webbereichsfeatures, wie im folgenden PnP-PowerShell-Codeausschnitt dargestellt:

$minimumVersion = New-Object System.Version("2.24.1803.0")
if (-not (Get-InstalledModule -Name SharePointPnPPowerShellOnline -MinimumVersion $minimumVersion -ErrorAction Ignore))
{
    Install-Module SharePointPnPPowerShellOnline -MinimumVersion $minimumVersion -Scope CurrentUser
}
Import-Module SharePointPnPPowerShellOnline -DisableNameChecking -MinimumVersion $minimumVersion

Connect-PnPOnline -Url "<your site url>"

# Disable the modern list site level blocking feature
Disable-PnPFeature -Identity "E3540C7D-6BEA-403C-A224-1A12EAFEE4C4" -Scope Site
# Disable the modern list web level blocking feature
Disable-PnPFeature -Identity "52E14B6F-B1BB-4969-B89B-C4FAA56745EF" -Scope Web

Hinweis

PnP PowerShell ist eine Open Source-Lösung mit aktiver Community, die Support dafür bietet. Es gibt keine SLA für den Support des Open-Source-Tools durch Microsoft.

Blockieren der modernen Benutzeroberfläche und der Bibliotheksoberfläche auf erster Ebene

Eine Liste kann so definiert werden, dass die klassische Oberfläche immer auf Listenebene (ListExperienceOptions auf ClassicExperience eingestellt) ausgeführt wird. Um dies rückgängig zu machen, kann der folgende Codeausschnitt verwendet werden:

// Load the list you want to update
var list = context.Web.Lists.GetByTitle(title);
context.Load(list);
context.ExecuteQuery();

// Possible options are Auto (= defaults to modern), NewExperience (= "modern") and ClassicExperience
list.ListExperienceOptions = ListExperience.Auto;

// Persist the changes
list.Update();
context.ExecuteQuery();

Listen, die mit BaseTemplate = 0 angezeigt werden

Jede Liste verfügt über eine Basisvorlage, aber in einigen Fällen werden möglicherweise Listen mit dem Basisvorlagenwert 0 in der Ausgabe des Scanners angezeigt. Dies liegt daran, dass für diese Listen keine Ansicht als Standard markiert ist oder gar keine Ansicht vorhanden ist. Die Lösung für diese Listen besteht darin, zur Seite "Listeneinstellungen" (_layouts/15/listedit.aspx?List=%7B<list id>%7D) zu navigieren und der Liste eine Ansicht zuzuordnen.

Angepasste Listenansichtsseiten mit mehr Inhalt als nur das XSLTListViewWebPart für die Liste

Klassische Listenansichts- und -bearbeitungsseiten können von Benutzern bearbeitet werden. Sie könnten daher beispielsweise zusätzliche Webparts auf einer Listenansichtsseite hinzufügen. Wenn Sie damit fertig sind, wird die Liste nicht mehr in der modernen Benutzeroberfläche angezeigt. In diesem Fall können Sie nur eins tun: die hinzugefügten Webparts aus den Listenseiten löschen. Sie können diese Fälle manuell prüfen, indem Sie zu der Liste wechseln und ?ToolPaneView=2&pagemode=edit an die URL der Liste anfügen. Die Seite wird im Bearbeitungsmodus mit den zusätzlichen Webparts angezeigt, die Sie dann entfernen können. Wenn Sie dies programmgesteuert durchführen möchten, ist der Codeausschnitt unten ein guter Ausgangspunkt. Dieser Ausschnitt hängt von der Hauptbibliothek der PnP-Websites ab, die Sie über das SharePointPnPCoreOnline-NuGet-Paket in Ihrem Visual Studio-Projekt installieren können.

using Microsoft.SharePoint.Client;
using Microsoft.SharePoint.Client.WebParts;
using OfficeDevPnP.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security;

namespace MultipleWebPartFixer
{
    class Program
    {
        static void Main(string[] args)
        {
            string siteUrl = "https://contoso.sharepoint.com/sites/demo";
            string userName = "joe@contoso.onmicrosoft.com";
            AuthenticationManager am = new AuthenticationManager();
            using (var cc = am.GetSharePointOnlineAuthenticatedContextTenant(siteUrl, userName, GetSecureString("Password")))
            {
                // Grab the list
                var list = cc.Web.Lists.GetByTitle("listtofix");
                list.EnsureProperties(l => l.RootFolder, l => l.Id);

                bool isNoScriptSite = cc.Web.IsNoScriptSite();

                if (isNoScriptSite)
                {
                    throw new Exception("You don't have the needed permissions to apply this fix!");
                }

                // get the current (allitems) form
                var files = list.RootFolder.FindFiles("allitems.aspx");
                var allItemsForm = files.FirstOrDefault();
                if (allItemsForm != null)
                {
                    // Load web part manager and web parts
                    var limitedWPManager = allItemsForm.GetLimitedWebPartManager(PersonalizationScope.Shared);
                    cc.Load(limitedWPManager);

                    // Load the web parts on the page
                    IEnumerable<WebPartDefinition> webParts = cc.LoadQuery(limitedWPManager.WebParts.IncludeWithDefaultProperties(wp => wp.Id, wp => wp.ZoneId, wp => wp.WebPart.ExportMode, wp => wp.WebPart.Title, wp => wp.WebPart.ZoneIndex, wp => wp.WebPart.IsClosed, wp => wp.WebPart.Hidden, wp => wp.WebPart.Properties));
                    cc.ExecuteQueryRetry();

                    List<WebPartDefinition> webPartsToDelete = new List<WebPartDefinition>();
                    if (webParts.Count() > 1)
                    {
                        // List all except the XsltListView web part(s)
                        foreach (var webPart in webParts)
                        {
                            if (GetTypeFromProperties(webPart.WebPart.Properties) != "XsltListView")
                            {
                                webPartsToDelete.Add(webPart);
                            }
                        }

                        if (webPartsToDelete.Count == webParts.Count() - 1)
                        {
                            foreach(var webPart in webPartsToDelete)
                            {
                                webPart.DeleteWebPart();
                            }
                            cc.ExecuteQueryRetry();
                            Console.WriteLine("List fixed!");
                        }
                        else
                        {
                            // Special case...investigation needed. Go to list and append ?ToolPaneView=2&pagemode=edit to the list url to check the page
                            Console.WriteLine("Go to list and append ?ToolPaneView=2&pagemode=edit to the list url to check this page");
                        }
                    }
                }
            }

            Console.WriteLine("Press enter to continue...");
            Console.ReadLine();
        }

        public static string GetTypeFromProperties(PropertyValues properties)
        {
            // Check for XSLTListView web part
            string[] xsltWebPart = new string[] { "ListUrl", "ListId", "Xsl", "JSLink", "ShowTimelineIfAvailable" };
            if (CheckWebPartProperties(xsltWebPart, properties))
            {
                return "XsltListView";
            }

            return "";
        }
        private static bool CheckWebPartProperties(string[] propertiesToCheck, PropertyValues properties)
        {
            bool isWebPart = true;
            foreach (var wpProp in propertiesToCheck)
            {
                if (!properties.FieldValues.ContainsKey(wpProp))
                {
                    isWebPart = false;
                    break;
                }
            }

            return isWebPart;
        }

        private static SecureString GetSecureString(string label)
        {
            SecureString sStrPwd = new SecureString();
            try
            {
                Console.Write(String.Format("{0}: ", label));

                for (ConsoleKeyInfo keyInfo = Console.ReadKey(true); keyInfo.Key != ConsoleKey.Enter; keyInfo = Console.ReadKey(true))
                {
                    if (keyInfo.Key == ConsoleKey.Backspace)
                    {
                        if (sStrPwd.Length > 0)
                        {
                            sStrPwd.RemoveAt(sStrPwd.Length - 1);
                            Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);
                            Console.Write(" ");
                            Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);
                        }
                    }
                    else if (keyInfo.Key != ConsoleKey.Enter)
                    {
                        Console.Write("*");
                        sStrPwd.AppendChar(keyInfo.KeyChar);
                    }

                }
                Console.WriteLine("");
            }
            catch (Exception e)
            {
                sStrPwd = null;
                Console.WriteLine(e.Message);
            }

            return sStrPwd;
        }
    }
}

Siehe auch