In zwei Blog-Artikeln habe ich bereits über Control Adapter und ihre Funktionalität berichtet. Im Rahmen meiner Projektarbeit habe ich nun eine weitere, höchst interessante Option für ihren Einsatz gefunden, die ich hiermit publik machen möchte.

Als ich das erste Mal mit Control Adaptern gearbeitet habe, um die Darstellung von Standard-SharePoint Controls nachträglich zu modifizieren (bspw., im Zuge von Barrierefreiheitsmaßnahmen), dachte ich noch, dass der IIS eigentlich nur das Rendering des Controls dem Adapter überlässt. Quasi als Schicht über dem Control. Dem ist allerdings nicht so. Der Control Adapter läuft den kompletten Lebenszyklus neben dem Control her. Und besser noch, er hat währenddessen Einfluss auf das Control!

Wo kann uns das helfen? Hier ein Beispiel:

Die Masterseite von Teamsites sollte aus diversen Gründen nicht angepasst und im Rollout-Szenario verwendet werden. Dieses Feature ist nur im Publishing Umfeld von SharePoint üblich!

Hat man aber bspw. einen eigenen Navigation Provider implementiert und aktiviert diesen für einen Teamsite-Bereich, dann wird man feststellen müssen, dass das Hauptmenü einer Teamsite nur eine dynamische Navigationsebenen anzeigt. Egal wie viele Ebenen der Navigation Provider liefert! Der Grund dafür ist ein Eintrag direkt in der Masterseite (v4.master).

<SharePoint:AspMenu
      ID=”TopNavigationMenuV4″
      Runat=”server”
      EnableViewState=”false”
      DataSourceID=”topSiteMap”
      AccessKey=”<%$Resources:wss,navigation_accesskey%>”
      UseSimpleRendering=”true” 
      UseSeparateCss=”false”
      Orientation=”Horizontal”
      StaticDisplayLevels=”2″
      MaximumDynamicDisplayLevels=”1″
      SkipLinkText=””
      CssClass=”s4-tn” />

Mit einem Control Adapter kann ich nun allerdings die Eigenschaft “MaximumDynamicDisplayLevels” zur Laufzeit anpassen. Dies muss relativ früh im Lebenszyklus geschehen. Zum Beispiel, wie nachfolgend zu sehen, im OnLoad.

/// <summary> /// Use this adapter to set the menu controls "MaximumDynamicDisplayLevels" /// </summary> public class MenuControlAdapter : System.Web.UI.Adapters.ControlAdapter { protected override void OnLoad(EventArgs e) { base.OnLoad(e); AspMenu menu = Control as AspMenu; if (menu.ID.Equals("TopNavigationMenuV4") &amp;&amp; menu.MaximumDynamicDisplayLevels != 5) { menu.MaximumDynamicDisplayLevels = 5; } } protected override void Render(HtmlTextWriter oOutput) { StringBuilder sb = new StringBuilder(); HtmlTextWriter htw = new HtmlTextWriter(new StringWriter(sb)); base.Render(htw); string output = sb.ToString().Trim(); // you can modify the output here (if nesseccary). oOutput.Write(output); } }

Sobald der Control Adapter registriert ist und somit die Anzahl der dynamischen Ebenen erhöht wurde, sind die tieferen Navigationsebenen erreichbar.

image

Zusammenfassend ist zu sagen, dass man mit einem Control Adapter nicht nur das Rendering eines Controls nachträglich anpassen kann, sondern auch bereits vorher aktiv die Einstellungen des Controls beeinflussen kann und hat somit ein extrem mächtiges Werkzeug zur Hand. Controls, die man nicht anpassen kann oder darf, sind jetzt beliebig anpassbar.

Leave a comment

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload the CAPTCHA.