Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
0800 1 255 255

Sharepoint 2007 Masterpage Unterscheidung für Gäste und Nutzer

Steht man vor der Aufgabe einen Sharepoint optisch anpas­sen zu müs­sen, ist oft die Masterpage anzu­pas­sen. Wird der Sharepoint ledig­lich als inter­ner Portalserver ver­wen­det, wel­cher nur von einer bestimm­ten Zielgruppe genutzt wird, reicht dazu meist das Anlegen einer eige­nen Masterpage aus.

In einem aktu­el­len Projekt stand ich jedoch vor dem Problem, Gästen sowie Administratoren jeweils eine eigene Masterpage zur Verfügung zu stel­len. Sharepoint sel­ber bie­tet keine Möglichkeit zu unter­schei­den ob gerade ein Gast oder ein Nutzer auf eine Seite zugreift und eine ent­spre­chende Masterpage aus­zu­lie­fern.

Auf der Suche nach einer Lösung im Internet wurde ich rela­tiv schnell fün­dig, jedoch funk­tio­nier­ten die ange­bo­te­nen Lösungen nicht für Publishing Pages oder Template Redirection Pages.

Um die Masterpage dyna­misch für Publishing Pages zu ändern, ver­wen­det man die nach­fol­gende Eigenschaft:

SPContext.Current.Web.CustomMasterUrl

Die nächste Eigenschaft kann nur ver­wen­det wer­den, wenn es sich nicht um Publishing Pages han­delt oder man die "application.master" ver­än­dern will.

page.MasterPageFile = "/_catalogs/masterpage/default.master"

Auf Basis die­ser Informationen kann nun ein Skript geschrie­ben wer­den, wel­ches abhän­gig davon ob ein Nutzer ange­mel­det ist oder nicht, die Masterpage set­zen kann. Als Ergänzung dazu kann inner­halb der "page_PreInit" die application.master auf eine eigene Masterpage ein­ge­stellt wer­den.

Alles was man dazu tun muss, ist, sich ein neues dll Projekt anzu­le­gen und die fer­tig kom­pi­lierte dll in dem Global Assembly Cache abzu­le­gen. Dabei ist es wich­tig die dll zu signie­ren.

using System;
using System.Web;
using System.Web.UI;
using System.IO;
using Microsoft.SharePoint.Publishing;
using Microsoft.SharePoint;

public class MasterPageSwitch : IHttpModule
{
        public void Init(HttpApplication context)
        {
            context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
        }

     void context_PreRequestHandlerExecute(object sender, EventArgs e)
        {
            Page page = HttpContext.Current.CurrentHandler as Page;

            if (page is PublishingLayoutPage || page is TemplateRedirectionPage)
            {
                HttpApplication currentApp = sender as HttpApplication;
                string parameter = "";
                if (HttpContext.Current.User.Identity.IsAuthenticated)
                {
                    parameter = "/_catalogs/masterpage/adminMaster.master";
                }
                else
                {
                    parameter = "/_catalogs/masterpage/guestMaster.master";
                }
                if (parameter != null)
                {
                    SPContext.Current.Web.CustomMasterUrl = parameter;
                }
            }
            else
            {
                if (page != null)
                    page.PreInit += new EventHandler(page_PreInit);
            }
        }

         void page_PreInit(object sender, EventArgs e)
        {
            Page page = sender as Page;
            if (page != null)
            {
                if (page.MasterPageFile != null)
                {
                    if (page.MasterPageFile.Contains("application.master"))
                    {
                      //auskommentiert da wir die Änderung der application.master nicht benötigen
                      //page.MasterPageFile = "/_catalogs/masterpage/default.master";
                    }
                }
            }
        }

        public void Dispose()
        {
        }
}

Als letz­ten Schritt fügt man inner­halb der web.config unter der Sektion fol­gen­den Eintrag hinzu :

<add name="MasterPageSwitch" type="MasterPageSwitch, MasterPageSwitch, Version=1.0.0.0, Culture=neutral, PublicKeyToken=................"/>

Related Posts

Pin It on Pinterest