Ich hatte letztens eine Anforderung während eines SharePoint-Projekts einen WebPart zu bauen und Dokumente aus einer Liste zu verlinken.
An sich keine schwierige Aufgabe. Danach kam die nächste Anforderung: Die Datei soll sich wenn möglich bitte in den Office Web Apps öffnen.
Momentan wurden die Dateien als Download angeboten.

Ich wusste zuerst nicht wie ich das machen soll. Vor allem in client-seitigem Code. Ich habe ja einfach nur die Dateien verlinkt.
Zum Glück hat mir mein Kollege Helge de Vries einen super Tipp gegeben:

Mach’s wie SharePoint und hänge ?web=1 an die URL!

Und siehe da, es funktioniert einwandfrei.

Der Grund dafür ist, dass die Erweiterung ?web=1 die Anfrage ändert und SharePoint auffordert die Datei im Browser zu öffnen.
Gibt es für die Datei einen Handler, wie z.B. die Office Web Apps für docx-Dateien, wird das Word Dokument in den Office Web Apps geöffnet.
Für Dateien die vom Browser nicht geöffnet werden können, wird weiterhin ein Download angeboten. Genauso verhält sich eine Datei auch, wenn kein Handler vorhanden ist. Beim Klick auf ein Word-Dokument ohne installierte Office Web Apps wird auch ein Download angeboten.

Bei einfachen Dateien, die vom Browser interpretiert werden können sollte man bei dieser Methode aber aufpassen.
txt-Dateien z.B. werden einfach im Browser angezeigt.

Das System funktioniert natürlich auch anders herum. Hat man Dateien die nicht im Browser oder Office Web Apps geöffnet werden sollen kann man mit dem Parameter ?web=0 dagegen vorgehen.

Arbeitet man mit aufwendigen Display Templates, so muss man diese auch manchmal debuggen. Ein einfacher Weg das zu tun ist das Einbauen des JavaScript Befehls debugger in den Display Template Code. Der Befehl macht genau dasselbe wie sein .NET Pendant Debugger.Launch(), nur eben für JavaScript.

Der Befehl funktioniert in Chrome, in Firefox (mit installiertem Firebug) und im Internet Explorer 11.
Die Developer Tools müssen dabei in allen Browsern geöffnet sein

Im Beispiel mit dem Suchergebnis Item:

<html xmlns:mso="urn:schemas-microsoft-com:office:office" xmlns:msdt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882">
<head>
<title>Testelement</title>

<!--[if gte mso 9]><xml>
<mso:CustomDocumentProperties>
<mso:TemplateHidden msdt:dt="string">0</mso:TemplateHidden>
<mso:MasterPageDescription msdt:dt="string">Zeigt die Standardergebniselement-Vorlage an.</mso:MasterPageDescription>
<mso:ContentTypeId msdt:dt="string">0x0101002039C03B61C64EC4A04F5361F385106603</mso:ContentTypeId>
<mso:TargetControlType msdt:dt="string">;#SearchResults;#</mso:TargetControlType>
<mso:HtmlDesignAssociated msdt:dt="string">1</mso:HtmlDesignAssociated>
<mso:ManagedPropertyMapping msdt:dt="string">'Title':'Title','Path':'Path','Description':'Description','EditorOWSUSER':'EditorOWSUSER','LastModifiedTime':'LastModifiedTime','CollapsingStatus':'CollapsingStatus','DocId':'DocId','HitHighlightedSummary':'HitHighlightedSummary','HitHighlightedProperties':'HitHighlightedProperties','FileExtension':'FileExtension','ViewsLifeTime':'ViewsLifeTime','ParentLink':'ParentLink','FileType':'FileType','IsContainer':'IsContainer','SecondaryFileExtension':'SecondaryFileExtension','DisplayAuthor':'DisplayAuthor'</mso:ManagedPropertyMapping>
<mso:HtmlDesignConversionSucceeded msdt:dt="string">True</mso:HtmlDesignConversionSucceeded>
<mso:HtmlDesignStatusAndPreview msdt:dt="string">http://dl-sp15l:40510/sites/s01/_catalogs/masterpage/Display Templates/Custom/Item_Test.html, Konvertierung erfolgreich.</mso:HtmlDesignStatusAndPreview>
</mso:CustomDocumentProperties>
</xml><![endif]-->
</head>
<body>
    <div id="Item_Test">
<!--#_
        if(!$isNull(ctx.CurrentItem) && !$isNull(ctx.ClientControl)){
            debugger;
            var id = ctx.ClientControl.get_nextUniqueId();
            var itemId = id + Srch.U.Ids.item;
			var hoverId = id + Srch.U.Ids.hover;
			var hoverUrl = "~sitecollection/_catalogs/masterpage/Display Templates/Search/Item_Default_HoverPanel.js";
            $setResultItem(itemId, ctx.CurrentItem);
			if(ctx.CurrentItem.IsContainer){
				ctx.CurrentItem.csr_Icon = Srch.U.getFolderIconUrl();
			}
			ctx.currentItem_ShowHoverPanelCallback = Srch.U.getShowHoverPanelCallback(itemId, hoverId, hoverUrl);
            ctx.currentItem_HideHoverPanelCallback = Srch.U.getHideHoverPanelCallback();
_#-->
            <div id="_#= $htmlEncode(itemId) =#_" name="Item" data-displaytemplate="DefaultItem" class="ms-srch-item" onmouseover="_#= ctx.currentItem_ShowHoverPanelCallback =#_" onmouseout="_#= ctx.currentItem_HideHoverPanelCallback =#_">
				_#=ctx.RenderBody(ctx)=#_
                <div id="_#= $htmlEncode(hoverId) =#_" class="ms-srch-hover-outerContainer"></div>
            </div>
<!--#_
        }
_#-->
    </div>
</body>
</html>
Debugger startet im JavaScript

Debugger startet im JavaScript

Heute habe ich die SharePoint WebDAV Shell Extension auf github veröffentlicht. Die SharePoint WebDAV Shell Extension erweitert das Kontextmenü des Windows Explorers sobald man per WebDAV durch SharePoint navigiert.

Context Menü

Context Menü

Ich habe das Tool entwickelt, da ich viel mit dem Windows Explorer arbeite seitdem SharePoint einen WebDAV Support anbietet. Hier kann ich meinen Lieblingseditor benutzen (momentan Sublime Text 2) und bin nicht auf den SharePoint Designer angewiesen. Leider gibt es über WebDAV keine Möglichkeit Dateien aus- und einzuchecken, was bei mir öfters zu der Meldung „Die Datei kann nicht gespeichert werden“ geführt hat.
Nun muss man jedes Mal den umständlichen Weg über den SharePoint Designer oder SharePoint selbst gehen um die Datei die man bearbeiten möchte aus- bzw. einzuchecken. Ich war das ewige Navigieren, vor allem bei Subwebs, einfach leid (meinen Kollegen ging es ähnlich). Darum hab ich mir überlegt ein Tool zu schreiben.

Mit der SharePoint WebDAV Shell Extension kann man Dateien mit einem Klick aus- und einchecken. 🙂

Momentan gibt es die Version v0.1 die noch nicht viele Features enthält. Ich habe mich zuerst einmal auf die wichtigesten Punkte konzentriert. Diese waren für mich Einchecken, Auschecken, Veröffentlichen und Auschecken verwerfen.
Ich möchte dem Tool jedoch so schnell wie möglich weitere Features hinzufügen.

Ich würde mich sehr über Feedback und Bug-Reports freuen.
Eine Installationsanleitung (auf engl.) befindet sich auf github.

Happy coding!

Installation

Installation

Fehler beim auschecken

Fehler beim auschecken