Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
+49 (0) 351/850 33-0

Sharepoint, ARF – Menü & Open Link in new window

Wohl jeder Sharepoint Entwickler welcher sich je mit Barrierefreiheit befasst hat, wird schon einmal von dem Alternative Rendering Framework von SPWorks gehört haben. ARF ist ein Open Source Project, welches von Vincent Rothwell entwickelt wurde um Sharepoint etwas barrierefreier zu gestalten. Das Framework beinhaltet mehr als 30 Controls für die Entwicklung barrierefeier Publishing Seiten. Alle Controls erzeugen XML welches mit Hilfe von XSLT letztendlich zu HTML Seiten gerendert werden kann.

Eines dieser Controls, welches aktuell bei uns verwendet wird, ist das ARF Navigations Control. Beim Anlegen einer Überschrift mit Link, kann optional ausgewählt werden, ob die Seite in einem neuen oder in dem aktuellen Fenster geöffnet wird.  Dabei ist mir aufgefallen, dass das ARF Menü diese Checkbox schlechthin ignoriert.

Properties

Nach kurzer Forschungsarbeit, haben mein Kollege Vojta und ich den Ursprung des Fehlers gefunden. In der Menu-Klasse innerhalb des Namespaces „ARF.Web.Controls“ befindet sich die Methode „WriteNavigationNodes“, in welcher alle XML Attribute, für die spätere Ausgabe beschrieben werden. Das Target Attribut der MenuItems war jedoch stets leer, egal  ob die Checkbox aktiviert war oder nicht.

w.WriteAttributeString("Target", oItem.Target);

Das Problem war schnell gefunden. Das ARF Menü erbt von der Klasse „System.Web.Ui.Webcontrols.Menu“, und nicht von „Microsoft.SharePoint.WebControls.Menu“. Aus diesem Grund wurde die Target Eigenschaft des MenuItems nie beschrieben. Da die Sharepoint Menu Klasse auch von „System.Web.Ui.Webcontrols.Menu“ erbt, mussten die Sharepoint Entwickler dafür sorgen, dass die originalen Sharepoint MenuItems , dass Target Attribut konsumieren können. Der Zeitpunkt, in dem das Data Binding der Menu Items stattfindet, schien uns als perfekt geeignet dafür.

Innerhalb des OnMenItemDataBound Events kann über die EventArgs, auf die aktuelle SiteMapNode zugegriffen werden. Dabei handelt es sich diesmal jedoch um eine Sharepoint Node. Von dieser kann jetzt direkt auf das Target Attribut ausgelesen werden (dataItem[„Target“]).

protected override void OnMenuItemDataBound(MenuEventArgs e)
        {
            base.OnMenuItemDataBound(e);

            SiteMapNode dataItem = e.Item.DataItem as SiteMapNode;
            if (dataItem != null)
            {
                string str = dataItem["Target"];
                if (!string.IsNullOrEmpty(str))
                {
                    if(e.Item != null)
                    e.Item.Target = str;
                }
            }
        }

Jetzt ist es möglich per folgendem Programmcode, das Target Attribut abzurufen. Und diesmal mit Inhalt

w.WriteAttributeString("Target", oItem.Target);

1 Kommentar

Gerade einen Blogbeitrag über #ARF #Menü #Bug in #Sharepoint geschrieben. #Communardo #Techblog http://bit.ly/20UBnh
This comment was originally posted on Twitter

Kommentar hinterlassen


Pin It on Pinterest