Aus der Praxis – Die View eines XsltListViewWebPart anpassen
avatar

In meinen Projekten hatte ich des Öfteren die Anforderung ein List View Webpart programmatisch auf einer Seite zu platzieren. Das Einfügen des Webparts ist noch recht einfach; sobald aber die View angepasst werden muss, wird es schwieriger.

Im Internet gibt es viele Lösungsansätze dazu, die aber unter anderem schlicht weg nicht funktionieren. Daher habe ich nachfolgend den aus meiner Sicht besten Ansatz skizziert.

In der XML Webpart Definition kann der Teil, in dem die View Informationen angegeben werden einfach ignoriert werden. Der Hintergrund ist, dass beim Platzieren des Webparts auf der Seite automatisch eine versteckte View auf der referenzierten Liste erstellt wird.

 public const string ListView = "<webParts Zone=\"wpz\" Index=\"2\">" +
                                    "<webPart xmlns=\"http://schemas.microsoft.com/WebPart/v3\">" +
                                      "<metaData>" +
                                        "<type name=\"Microsoft.SharePoint.WebPartPages.XsltListViewWebPart, Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c\" />" +
                                        "<importErrorMessage>Dieses Webpart kann nicht importiert werden.</importErrorMessage>" +
                                      "</metaData>" +
                                      "<data>" +
                                        "<properties>" +
                                          "<property name=\"ListUrl\" type=\"string\">{RelativeSiteCollectionUrl}</property>" +
                                          "<property name=\"ListName\" type=\"string\">{{listId}}</property>" +
                                          "<property name=\"ChromeType\" type=\"chrometype\">Default</property>" +
                                          "<property name=\"Title\" type=\"string\">{Title}</property>" +
                                          "</properties>" +
                                      "</data>" +
                                    "</webPart>" +
                                  "</webParts>";

Daher muss im ersten Schritt lediglich das Webpart auf der Seite platziert werden. Dies geschieht mit nachfolgenden C# Code mit CSOM. (Dabei werden einige Werte aus der oben definierten XML Definition durch dynamische Werte ersetzt. Daher die Platzhalter “{…}”)

 internal static WebPartDefinition PlaceWebpartByDefinition(ClientContext context, Web web, string relativePageUrl, string wpDefinition, string zoneId, int index, string title)
        {
            var page = web.GetFileByServerRelativeUrl(relativePageUrl);
            context.Load(page);
            context.ExecuteQuery();

            if (page.CheckOutType != CheckOutType.Online)
            {
                page.CheckOut();
            }
            wpDefinition = wpDefinition.Replace(WebpartDefinitions.PlaceholderTitle, title);
            var wpm = page.GetLimitedWebPartManager(Microsoft.SharePoint.Client.WebParts.PersonalizationScope.Shared);
            context.Load(wpm);

            WebPart importingWebPart = wpm.ImportWebPart(wpDefinition).WebPart;
            var wpd= wpm.AddWebPart(importingWebPart, zoneId, index);
            context.Load(page);
            context.Load(wpd);
            context.ExecuteQuery();
            return wpd;
        }

internal static WebPartDefinition PlaceAllDocumentsWebpart(ClientContext context, Web web, string relativePageUrl, string wpDefinition, string zoneId, int index, string title)
        {
            var pagesLib = ConfigurationManager.AppSettings["SPPageLibrray"];
            // Get Pages Library
            List pagesLibrary = web.Lists.GetByTitle(pagesLib);
            context.Load(pagesLibrary, p => p.Id, p => p.Views);
            context.ExecuteQuery();

            var definition = wpDefinition.Replace("{RelativeSiteCollectionUrl}", web.ServerRelativeUrl + "/" + pagesLib);
            definition = definition.Replace("{listId}", pagesLibrary.Id.ToString());
            definition = definition.Replace("{pageUrl}", web.ServerRelativeUrl + "/" + pagesLib + "/startpage.aspx");
            definition = definition.Replace(WebpartDefinitions.PlaceholderTitle, title);

            WebPartDefinition wpd = PlaceWebpartByDefinition(context, web, relativePageUrl, definition, zoneId, index, title);
            return wpd;
        }

Nach dem Ausführen des Codes existiert eine neue, versteckte View auf der Bibliothek. Diese View muss nun im zweiten Schritt ermittelt und bearbeitet werden. Die ID der View kann über das platzierte Webpart ermittelt werden.

Hat man die View im Zugriff, können nun die Felder, die Sortierung und andere Einstellungen angepasst werden.

internal static void PlaceLatestModiefiedDocumentsWebpart(ClientContext context, Web web, string relativePageUrl, string zoneId, int index)
        {
            var wpTitle = "Zuletzt geänderte Dokumente";
            WebPartDefinition webPartDefinition = PlaceAllDocumentsWebpart(context, web, relativePageUrl, WebpartDefinitions.ListView, zoneId, index, wpTitle);

            var pagesLibName = ConfigurationManager.AppSettings["SPPageLibrray"];
            // Get Pages Library to edit view
            List pagesLibrary = web.Lists.GetByTitle(pagesLibName);
                 
            context.Load(pagesLibrary, p => p.Id, p => p.Views);
            context.ExecuteQuery();

            string[] viewFields = { "DocIcon", "LinkFilename", "Modified" };
            var listView = pagesLibrary.Views.GetById(webPartDefinition.Id);
            context.Load(listView, lv => lv.ViewFields);
            context.ExecuteQuery();

            listView.ViewFields.RemoveAll();
            foreach (var viewField in viewFields)
            {
                listView.ViewFields.Add(viewField);
            }

            listView.ViewQuery = "<OrderBy><FieldRef Name='Modified' Ascending='False' /></OrderBy>";
            listView.RowLimit = 10;
            listView.Update();
            context.ExecuteQuery();
        }

Ich hoffe der Code kann euch helfen!

Schreibe einen Kommentar