Sorry, this entry is only available in Deutsch.
Auf zum 2. Tag der Basta! Hauptkonferenz – und damit dem ersten der beiden SharePoint Days. Heute gibt es keine morgendliche Keynote, sondern es geht gleich in die Sessions – für mich ist das als erstes Sehenswertes aus SharePoint 2010 mit Tom Wendel. Erstaunlich für mich, dass nur ca. ein Drittel der anwesenden Entwickler Sharepoint 2010 überhaupt schon gesehen hat. Dementsprechend “basic” fällt die Vorstellung der Neuerungen aus – weshalb ich hier auch auf eine detaillierte Auflistung verzichte. Trotzdem ein paar “Bruchstücke”, die mir nennenswert erscheinen: reading the complete article »
Für alle, die sich mit dem neuen Visual Studio und dem .NET Framework 4.0 vertraut machen wollen oder mehr erfahren möchten, hat Microsoft das neu aktualisierte Visual Studio 2010 and .NET Framework 4 Training Kit veröffentlicht. Das am 11.01.2010 veröffentlichte 151 MB große Paket enthält eine Vielzahl von Präsentationen, Demos und Tutorials. Genau genommen 17 Präsentationen, 21 Demos und 26 Tutorials sowie 10 Videos. In dieser Version des Kits wird auch auf die Themen Office, SharePoint und Application Lifecycle Management eingegangen. Der Download lohnt sich auf alle Fälle.
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.

Neugierig geworden von der diesjährigen Basta! und Oliver Scheers Vortrag über Silverlight und das .NET RIA Framework, wollte ich das Gehörte heute einmal versuchen in die Praxis umzusetzen.
Das .NET Rich Internet Application (RIA) Framework unterstützt den Entwickler bei der Erstellung n- schichtiger Applikationen. Die .NET RIA Services bilden dabei ein Datenzugriffsmodell welche aus einem Objektmodell (z.B. ADO.NET Entity Framework) einen sogenannten Domain Service zur Verfügung stellen können. Die Hauptzielgruppe dieser Technologie sind .NET Entwickler welche sich vorrangig in Silverlight sowie ASP.NET Anwendungen heimisch fühlen.
Die erste Version der .NET RIA Services kann hier heruntergeladen werden. Es sollte beachtet werden, dass es sich dabei um eine frühe CTP Version handelt.
Nach dem ersten Installationsversuch der .NET RIA Services erhielt ich folgende Fehlermeldung.
The following required components are missing. Microsoft Silverlight 3 Developer Runtime Microsoft Silverlight 3 Beta SDK Microsoft Silverlight 3 Tools.

Da ich die komplette Silverlight 3 Runtime inkl. Silverlight Tools bereits installiert hatte, erschien mir die Fehlermeldung etwas irreführend. Nach kurzer Suche fand ich heraus, dass die .NET RIA Services nicht mit einer deutschen Installation von Visual Studio zusammenarbeiten. Aber wie so oft gibt es auch hier einen nicht dokumentierten Weg um an das Ziel zu kommen
Voraussetzung:
1. Nachdem die .NET RIA Services heruntergeladen wurden in das Downloadverzeichnis wechseln
2. Folgenden Befehl ausführen msiexec /i RiaServices.msi NOCHECK=true
3. Sofern die Installation fehlerfrei abgelaufen ist, folgen nun weitere wichtige Schritte:
4. Nun die Kommandozeile aufrufen und in folgendes Verzeichnis wechseln C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE
5. Von dort aus folgenden Befehl ausführen: devenv /installvstemplates
Sollte die nachstehende Fehlermeldung erscheinen: “Der angeforderte Vorgang erfordert erhöhte Rechte”, muss die Kommandozeile als Administrator ausgeführt werden.
Nach dem Neustart von Visual Studio sollte nun in der Projektvorlagenübersicht .NET RIA Service Class Library

und in dem Dialog Hinzufügen -> Neues Element die Domain Service Class auswählbar sein.

Ein Teil unserer Kernkompetenzen im Umgang mit Sharepoint, ist die Migration von Altsystemen zu Sharepoint. Ein aktuelles Projekt stellte uns vor die Herausforderung, Inhalte, Stylevorgaben und Meta-Daten mittels XML Import aus einem bestehenden Content Management System 1:1 nach SharePoint zu übernehmen. Besonders problematisch war dabei der Fakt, dass sich innerhalb der Daten Parameter für die Businesslogik versteckten. Diese Logik musste in SharePoint zum Teil nachgebaut und beim Import berücksichtigt werden.
Eine Teilaufgabe des Imports bestand in der Übernahme der eigentlichen Inhalte der Seiten. Diese lagen als barrierefreies HTML vor und mussten deshalb original so in die SharePoint Seite importiert werden.
Meine Aufgabe bestand nun darin, den originalen HTML Inhalt der zu migrierenden Seite in eine Sharepoint Seite zu importieren. Möglichst sollten die Optik (Styles, Bilder, etc.) sowie der Inhalt (inkl. Links, Tabellen etc.) unangetastet bleiben.
Sharepoint bietet dem geneigten Entwickler mit seiner API reichlich Werkzeug um diese Aufgabe zu bewältigen. So kann eine Seite ohne Probleme mit folgenden Programmcode angelegt werden:
PublishingWeb currPublishingWeb = PublishingWeb.GetPublishingWeb(webContext);
PublishingPageCollection pages = currPublishingWeb.GetPublishingPages();
PublishingPage currentPage = pages.Add(pageFileName, layout);
Auf diese Weise ist eine Publishing Page schnell erstellt. Soll diese jetzt auch noch mit Inhalt versehen werden, wird das SPField, das für den Inhalt einer PublishingPage zuständig ist, benötigt.
Das SPField für Inhalte ist das PublishingPageContent Field, das über die FieldId Klasse verwendet werden kann.
SPListItem newFileItem = newFile.Item;
newFileItem[FieldId.PublishingPageContent] = htmlContent;
newFileItem.Update();
Bis hier wurde alles ordnungsgemäß von Sharepoint ausgeführt. Die Seite wurde angelegt und der Inhalt wurde auch gesetzt. Beim näheren Betrachten der neu Erstellten Seite wurde ich jedoch misstrauisch:
Durch dieses Verhalten wurden die importierten Seiten “wertlos” für mich. Alle darauf folgenden Versuche den Inhalt in die Seite zu schreiben schlug fehl. Versucht habe ich folgende Wege:
Da ich das Problem gerne ohne “Dirty Hacks” lösen wollte, entschied ich mich eine Supportanfrage bei Microsoft zu stellen. Dazu sei erwähnt, dass die Anfragen über den Microsoft Support sehr schnell und kompetent beantwortet und abgewickelt werden. Ich sollte meine Antwort von Microsoft bekommen; Leider hieß diese “By design” oder kurz auf deutsch: abgewiesen.
Die Begründung: Mirosoft Sharepoint nutzt einen sogenannten XSS (Cross side scripting) Protection Mechanismus. Dieser sollte verhindern das schädlicher Inhalte (Code) in Sharepoint eingepflegt werden kann.
Davon betroffen ist allerdings auch das HTML Texteingabe Control. Beispielsweise würde dieser Programm – Code wie folgt abgeändert:
original: Das ist ein gutes <SCRIPT>void:alert("hello world")</SCRIPT> Script
verfälscht: Das ist ein gutes Script
Auch “<” oder “>” Zeichen würden wie folgt abgeändert: > – <. Ich empfinde dieses Verhalten als vollkommen richtig und auch nachvollziehbar, wenn es dabei bleiben würde. Es stellte sich herraus dass dieser XSS Filter auch für die Kürzung meiner HTML Inhalte zuständig war. Microsoft selbst kann sich nicht erklären warum dieser Filter solch drastische Änderungen am HTML Quellcode vornimmt. Man riet mir von Seiten Microsoft ernsthaft entweder ein 3rd Party AddOn als Ersatz für den RichTextEditor einzusetzen oder aber die Daten nicht innerhalb Sharepoints zu halten, sondern extern. Keiner der beiden angebotetenen Lösungen erschien mir für unser Projekt auch nur ansatzweise logisch beziehungsweise umsetzbar.
Um die Inhalte dennoch wie gefordert 1:1 importieren zu können, musste nun ein Workaround gefunden werden. Dazu bot sich eine Codierung der beim Import beanstandeten HTML-Tags an. Nach der erfolgreichen Integration der Methoden in unseren Import können nun alle Inhalte wie gefordert übernommen werden.
Crystal Reports ist ein leistungsfähiges Berichtserstellungstool (mittlerweile) aus dem Hause SAP, vorher von Business Objects, noch davor von Crystal Decisions (nein, Seagate Software erwähne ich jetzt nicht auch noch…) am Markt angeboten. Die Crystal Reports Runtime ist für Microsoft-Entwickler (bzw. deren Anwendungen) kostenlos nutzbar, solange ich mich zurückerinnern kann (und das geht immerhin abwärts bis Visual Basic 5.0 – in was für Sprachen man so alles mal programmiert hat…).
Jedenfalls gilt dies auch im Zeitalter von .Net und C# und es ist gängige Praxis, als Firma einige wenige Crystal Reports Vollversionen zu erwerben, die für die reine Berichtserstellung genutzt werden (in der Regel nicht von Programmierern) und dazu eine Anwendung (vorzugsweise eine Webanwendung) zu erstellen, die den kostenlosen Crystal Reports Viewer mit all seinen Features (Parameterübergabe, Filtern, Export in verschiedene Formate etc.) integriert. Dabei kann man je nach Anforderungen die diversen Funktionalitäten des Viewers entweder out-of-the-box über dessen Toolbar nutzen oder selbst recht komfortabel über die Runtime-API programmieren. Das funktioniert sogar in SharePoint, indem man den Viewer in einen Webpart einbindet. Eigentlich eine feine Sache.
Um die Crystal Reports Runtime in ein eigenes Setup einzubinden, werden von SAP sogenannte Merge Module zum Download bereitgestellt. Diese muss man nur in Visual Studio.Net einem Setup-Projekt hinzufügen – und die Welt ist schön.
Mit Visual Studio.Net ist außerdem eine Art Spar-Edition von Crystal Reports gebundelt. Wer will, kann also auch hier Berichte erstellen, allerdings ist die Oberfläche etwas gewöhnungsbedürftig, wenn man die Vollversion kennt. Außerdem sind die gebundelten Versionen nicht gerade die aktuellsten: Die zur Zeit aktuelle Version ist Crystal Reports 2008 (entspricht Version 12), mit Visual Studio.Net werden folgende Versionen ausgeliefert:
Das sehr verbreitete Crystal Reports XI kann nur mit einer Vollversion zur Berichtserstellung genutzt werden, es gibt aber verschiedene Runtime-Versionen für alle .Net Framework-Versionen von 1.1 bis 3.5. Bis hierher also alles im grünen Bereich.
Etwas befremdlich wird es allerdings, wenn man darüber nachdenkt, den Webserver/SharePoint auf einem 64-Bit-System zu installieren (was ja im Jahre 2009 keine sehr vermessene Idee scheint und z.B. von Microsoft für den SharePoint Server empfohlen wird):
Hat man allerdings in der bisherigen Anwendung ein Feature genutzt, das es in Crystal Reports 10 noch nicht gab, dann wird man wohl als 2. Sieger aus dem Rennen gehen…
Seit Herbst 2008 bietet Microsoft mit den Microsoft Chart Controls für Microsoft .NET Framework 3.5 sowohl für ASP.NET als auch für WinForms-Anwendungen kostenlose Controls an, mit denen man schnell ansprechende und aussagekräftige Diagramme generieren kann.
Die Installation zusätzlicher Runtimes auf dem Server bzw. Client, wie z.B. bei Crystal Reports, entfällt. Einzige Voraussetzung ist ein installiertes .NET Framework 3.5 SP1.
Zu den Hauptmerkmalen gehören:
Hier bekommt man also eine ganze Menge geboten. Ich finde das ist definitiv einen Blick wert. Es ist sicher nicht so mächtig wie manch andere Werkzeuge für das Reporting, aber um einfach nur ein paar Diagramme zu erzeugen, ist es zumindest eine willkommene Alternative.
Der Einbau in eine ASP.NET Seite kann so einfach aussehen:

Die Ergebnisse können z.B. so aussehen:

Links:
Möchte man den ModalPopupExtender aus dem ASP.NET AJAX Control Toolkit verwenden, dann geht das nur mit dem DOCTYPE “XHTML 1.0 Transitional” so richtig reibungslos. Beim CollapsiblePanel gibt es dazu einen Hinweis in der Dokumentation, beim ModalPopup fehlt dieser Hinweis. Das Problem besteht aber auch dort.
Symptome: Das Popup wird nicht korrekt positioniert, zentriert sich nicht und viel zu lange Scrollbalken entstehen.
Gerade wenn man WebParts für SharePoint erstellt, hat man aber nicht immer Einfluss auf den DOCTYPE. Oder wenn man schon Einfluss auf den DOCTYPE hat, kann man ihn nicht immer einfach so ändern, weil dann evtl. andere Komponenten nicht mehr richtig funktionieren oder nicht mehr richtig dargestellt werden.
Der beschriebene Workaround aus der Dokumentation des AJAX Control Toolkit fällt damit als Lösung für uns aus.
Ein anderer Lösungsweg ist, ein Custom Build des ASP.NET AJAX Control Toolkit zu erstellen und darin das “fehlerhafte” Stück JavaScript zu korrigieren.
Dazu besorgt man sich den Quellcode via Codeplex und nimmt die folgenden zwei Modifkationen vor:
switch (Sys.Browser.agent) {
case Sys.Browser.InternetExplorer:
if (document.documentElement && document.documentElement.clientWidth)
clientWidth = document.documentElement.clientWidth;
else if (document.body)
clientWidth = document.body.clientWidth;
//clientWidth = document.documentElement.clientWidth;
if (document.documentElement && document.documentElement.clientHeight)
clientHeight = document.documentElement.clientHeight;
else if (document.body)
clientHeight = document.body.clientHeight;
//clientHeight = document.documentElement.clientHeight;
break;
case Sys.Browser.Safari:
clientWidth = window.innerWidth;
clientHeight = window.innerHeight;
break;
case Sys.Browser.Opera:
clientWidth = Math.min(window.innerWidth, document.body.clientWidth);
clientHeight = Math.min(window.innerHeight, document.body.clientHeight);
break;
default: // Sys.Browser.Firefox, etc.
clientWidth = Math.min(window.innerWidth, document.documentElement.clientWidth);
clientHeight = Math.min(window.innerHeight, document.documentElement.clientHeight);
break;
}
Diese Modifikation bringt dem Toolkit bei, Höhe und Breite ein bisschen besser auszulesen.
Achtung:
Hat man bereits an anderen Stellen im eigenen Code Anpassungen aufgrund dieses Problems vorgenommen, indem man z.B. via CSS oder JavaScript nachträglich die Position eines AutoComplete Feldes korrigiert, so ist dies jetzt möglicherweise nicht mehr notwendig und/oder funktioniert nicht mehr richtig. Hier also nochmal kontrollieren!
this._backgroundElement.style.position = 'fixed';
ersetzen zu
this._backgroundElement.style.position = 'absolute';//'fixed';
Ein paar Zeilen weiter unten:
his._foregroundElement.style.position = 'fixed';
ersetzen zu
this._foregroundElement.style.position = 'absolute';//'fixed';
Diese Modifikation beeinflusst andere Controls nicht, und sorgt nur für die ordentliche Positionierung des Popups.
Außerdem zu beachten:
Wenn man das Control Toolkit mit dem mitgelieferten Schlüssel kompiliert, so wir der selbe PublicKeyToken wie beim Original erzeugt. Daraus entstünde dann möglicherweise folgendes Problem:
Verwenden andere Komponenten auf dem Server auch das AJAX Control Toolkit, so bekommen sie die oben vorgenommenen Änderungen durchgereicht, sofern sie nicht explizit gegen eine bestimmte Version kompiliert wurden.
Man sollte also lieber einen neuen PublicKeyToken erzeugen, um möglichen Kompatibilitätsproblemen im Voraus zu entgehen.
Quelle:
Ramesh Bhaskar – Fixing modalpopupextender position problems