Beiträge von Christian Heindel

26Mrz

Die Standard-MasterPage von SharePoint (default.master) wurde ohne Angabe eines DOCTYPE geschrieben. Dadurch fällt der IE beim Rendern in den Quirks Mode zurück. Entsprechend wurden SharePoint-eigene Funktionalitäten wie das Verschieben eines WebParts auf Grundlage des Quirks Mode geschrieben.

Wenn man sich nun aber an Standards halten, und einen DOCTYPE angeben möchte, bekommt man u.U. Probleme in SharePoint.

So bringt zum Beispiel des Einfügen der Angabe

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

einen Fehler beim Ausführen der JavaScript-Methode “MSOLayout_GetRealOffset” hervor, wenn sich der WebPart in einem relativ positionierten DIV befindet:

Message: Objekt erforderlich
Line: 1572
Char: 3
Code: 0
URI: http://SERVER/_layouts/1031/ie55up.js?rev=Ni7%2Fj2ZV%2FzCvd09XYSSWvA%3D%3D

Mögliche Lösungen für dieses Problem sind:

1. Anpassen der JavaScript-Methode

Dies sollte jedoch nicht direkt in der <12>\TEMPLATE\LAYOUTS\1033\IE55UP.JS geschehen, da es dort durch Updates überschrieben werden kann. Und spätestens beim Deployen auf einer Farm wird es umständlich.

Daher sollte man die Anpassung lieber in seiner Masterpage vornehmen. Dazu überschreibt man einfach die “fehlerhafte” Methode indem man nach SPWebPartManager folgenden Code einfügt:

<script language="javascript" type="text/javascript">
   1: 
   2:     function MSOLayout_GetRealOffset(StartingObject, OffsetType, EndParent)
   3:     {
   4:         var realValue=0;
   5:         if (!EndParent) EndParent=document.body;
   6:         for (var currentObject=StartingObject; currentObject && currentObject !=EndParent && currentObject != document.body; currentObject=currentObject.offsetParent)
   7:         {             var offset = eval('currentObject.offset'+OffsetType);
   8:             if (offset) realValue+=offset;
   9:         }
  10:         return realValue;
  11:     }
</script>

oder 2. Vermeiden von position:relative bei Containern für WebParts

Stattdessen kann man z.B. float verwenden. Dazu gibt es diverse MasterPage-Vorlagen.

oder 3. Entfernen der DOCTYPE-Angabe in der MasterPage

Das ist eine schnelle Lösung, aber kein optimales HTML. Eine Triple-A Conformance für “Premium”-Barrierefreiheit wird man dadurch nicht erreichen können. Andererseits: Die default.master wird ja auch so ausgeliefert… ;-)

Englischsprachige Quellen zu diesem Thema:

Technorati Tags: , , ,

15Nov

Wer unter Windows mit virtuellen Maschinen arbeitet, hat vermutlich öfter einmal eine Remote Desktop Verbindung offen und verwendet zwei Monitore.

Mit Windows Vista bzw. Terminal Services Client 6.0 (für XPSP2 und Server 2003) (KB925876) gibt es nun eine Option, die den Remote Desktop über alle angeschlossenen Montiore ausdehnt:

mstsc /span

Technorati Tags:

09Nov

Damit man gezielt versionsbezogenen Support leisten kann, muss der Kunde die aktuelle Version z.B. eines SharePoint Webparts mitteilen können.

Es bietet sich an, dafür die Version der Assembly zu verwenden. Per Default ist diese jedoch auf [assembly: AssemblyVersion("1.0.0.0")] eingestellt und ändert sich nicht von allein. Man kann durch Einsatz von Sternchen diese Versionierung automatisieren. Visual Studio zählt dann von selbst hoch. (Mehr Informationen: AssemblyVersionAttribute-Klasse)

Für schnellen und gezielten Support wäre es aber besser, wenn der Kunde die Subversion Revisionsnummer des Quellcodes nennen könnte.

Dazu sind folgende Schritte notwendig:

  1. In der AssemblyInfo.cs den Eintrag
    [assembly: AssemblyDescription("")]
    zu
    [assembly: AssemblyDescription("$Rev$ $Author$ $LastChangedDate$")]
    ändern.
  2. Im SVN-Client die Property “svn:keywords” für die AssemblyInfo.cs anlegen und den Wert auf “Rev Author LastChangedDate” setzen.

    Subversion Property

  3. Nun setzt Subversion zukünftig immer die aktuellen Werte bei Commit der AssemblyInfo.cs ein.

    Achtung: Die Ersetzung in der AssemblyInfo.cs findet wirklich nur bei Commit genau dieser Datei statt. Ändert sie sich nicht, sondern wurden z.B. nur Änderungen an anderen Dateien vorgenommen, so wird auch nichts ersetzt.

    Dieses Problem lässt sich wie folgt lösen:

    1. Vor jedem Release sollte vom Entwickler der Wert von AssemblyVersion nach einem festgelegtem Muster erhöht werden. Z.B. erster Teil “bei neuer Hauptversion”, zweiter Teil “bei Erweiterungen”, dritter Teil “bei Bugfixes”, vierter Teil “immer 0″.So hat man zusätzlich zu der eher maschinennahen Revisionsnummer auch noch eine menschenlesbare Nummer, an der man schnell Umfang und Art der Änderungen ablesen kann.

      oder

    2. Ist auf dem Entwickler-Rechner TortoiseSVN installiert, so kann man dessen Kommandozeilentool SubWCRev.exe verwenden. Dann muss nicht erst eine manuelle Änderung in der AssemblyInfo.cs vorgenommen werden.

      Dazu kopiert man die AssemblyInfo.cs zu AssemblyInfo.cs.Template, ändere den Platzhalter in der AssemblyInfo.cs.Template von
      [assembly: AssemblyDescription("$Rev$ $Author$ $LastChangedDate$")]
      zu
      [assembly: AssemblyDescription("$WCREV$ $WCDATE$")]
      und rufe im Pre-Build Event das Tool wie folgt auf:

      Pre-Build

      C:\Program Files\TortoiseSVN\bin\SubWCRev.exe $(SolutionDir) $(ProjectDir)\Properties\AssemblyInfo.cs.Template $(ProjectDir)\Properties\AssemblyInfo.cs

      Wichtig: Man man muss hier mit einem Template arbeiten, da sonst die Ersetzung nur beim ersten Mal funktioniert.

      Jetzt hat man bei jedem Build eine aktuelle AssemblyInfo.cs ohne das man erst jedes Mal ein Commit ausführen muss.

    Da im Gegensatz zu CVS bei SVN die Revisionsnummer nicht für jede Datei einzeln erhöht wird, sondern für das gesamte Repository, haben wir mit der Revisionsnummer eine optimale Angabe um den Versionsstand des Kunden nachzustellen. Der Kunde kann die Version nun in der gelieferten DLL ablesen. (Rechte Maustaste auf Eigenschaften…)

    DLL properties

  4. Um dem Kunden das Ablesen zu vereinfachen, zeigt man die Information aber besser im Impressum der Anwendung an, führt sie in Logfiles mit, etc. So funktioniert das Auslesen mit C#:

    Versionsnummer der Assembly:
    Assembly.GetExecutingAssembly().GetName().Version

    Subversion-Informationen:
    string svnInfo = string.Empty;
    object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), true);
    if ( attributes.Length > 0 ) {
    AssemblyDescriptionAttribute descriptionAttribute = attributes[0] as AssemblyDescriptionAttribute ;
    svnInfo = descriptionAttribute.Description;
    }

Nun geht’s schneller beim nächsten Bug… ;-)

Technorati Tags: ,