close

Development

AllgemeinDevelopment, CodingHow-To, Tutorial, SzenarioKonfiguration, DeploymentOn-PremisesScripting, PowerShellSharePoint 2013

SharePoint 2013: Client Side Managed Meta Data Service

Wer schon mal versucht hat, die seit SharePoint 2013 neue Assembly Microsoft.SharePoint.Client.Taxonomy zu verwenden um mittels CSOM auf das Managed Meta Data Service zuzugreifen, hat vielleicht schon mal folgende Fehlermeldung gesehen.

Cannot invoke method or retrieve property from null object.
Object returned by the following call stack is null.
„GetDefaultSiteCollectionTermStore
Microsoft.SharePoint.Taxonomy.TaxonomySession.GetTaxonomySession“

Das Code-Fragment, das diese Fehlermeldung verursacht sieht beispielsweise so aus.

Anmerkung: Dieses Beispiel legt einen Termset “Intrigen der Macht, mit den Titeln von drei Büchern an, in der Gruppe “Books”.

(mehr …)

mehr lesen
AllgemeinDevelopment, CodingHow-To, Tutorial, SzenarioKonfiguration, DeploymentScripting, PowerShellSharePoint 2013SharePoint 2016

SharePoint 2013 und Unit Tests mit Visual Studio 2013

In der Vergangenheit war es nicht immer einfach die von Visual Studio mitgebrachte Möglichkeit für Unit Tests in Verbindung mit SharePoint zu nutzen. In den aktuellen Versionen (SharePoint 2013 und Visual Studio 2013) ist dies einfacher geworden und sollte auch anregen daran zu denken, wenn man SharePoint Apps entwickelt. Gerade wenn man an Auto-hosted Apps denkt, bei denen die Businesslogik außerhalb des SharePoints, in beispielsweise einem Azure Service gehostet wird, sollte man Unit Tests unbedingt nutzen.

Aber nicht nur für SharePoint Apps sind sie eine wichtige Möglichkeit Qualität in eine Lösung zu bringen, sondern auch für die traditionellen (Full-trusted) Lösungen, wie man sie hinlänglich kennt. Unit Tests im Zusammenspiel mit Full-trusted Solutions waren eben mitunter recht schwierig umzusetzen.

Beispielsweise kann man damit einen Unit Test schreiben, um Eventreceiver einer Liste zu testen. Legt man ein SharePoint Projekt an, dann ist es relativ leicht auch ein Unit Test Projekt zu erstellen, um das Ausführen von Eventreceivern zu testen. Geht man von einem Eventreceiver aus, der z.B. ein Datumsfeld setzt, wenn ein neues Item angelegt wird, so braucht man anschließend nur einen Unit Test, der genau diesen Fall überprüft, erstellen.

(mehr …)

mehr lesen
AllgemeinDevelopment, CodingHow-To, Tutorial, SzenarioOn-PremisesSharePoint 2013

SharePoint 2013 DEV: AngularJS

AngularJS ist die Werkzeugkiste schlecht hin. Mit dem Open-Source-Framework von Google lassen sich ganz leicht Single Page Applications (SPA) erstellen. AngularJS fügt HTML ein neues Konstrukt hinzu. Die Implementierung der AnuglarJS Library in ein SharePoint 2013 App Projekt ist auch nicht kompliziert, da zunächst die Library selbst von dem AngularJS Server heruntergeladen werden sollte. Anschließend wird im Projekt auf diese JavaScript-Datei verweisen mittels folgendem Tag
<script type=“text/javascript“ src=“Pfad/angular.js“></script>
wobei “Pfad” durch den richtigen Dateipfad zu ersetzten ist. Alternativ kann auch die Url des CDN verwendet werden:
https://ajax.googleapis.com/ajax/libs/angularjs/1.2.25/angular.min.js

Da die Library nun eingebunden und einsatzbereit ist, kann die Zwei-Wege-Datenbindung von AngularJS verwendet werden. Änderungen in der Ansicht (View) wirken sich so automatisch im Datenmodell (Model) aus und werden in den entsprechenden Elementen der Ansicht (View) direkt angezeigt.

Hier ein kleines Beispiel:

(mehr …)

mehr lesen
AllgemeinDevelopment, CodingHow-To, Tutorial, SzenarioOn-PremisesSharePoint 2013

SharePoint 2013 DEV: Apps, Apps, Apps

Sharepoint Apps sind die Zukunft. Nur leider ist die Zukunft in diesem Fall schlecht und oft auch fehlerhaft dokumentiert. Die einfachsten Implementierungen können so schnell viel Zeit kosten, weil Fehler an der falschen Stelle gesucht werden, geht man doch nicht davon aus, dass die Dokumentation in diversen Büchern und auf guten Developerseiten einfach falsch ist.

Ein gutes Beispiel dafür sind Rest-Services, die schnell und damit hervorragend zur App-Entwicklung eingesetzt werden können. Zu Beachten dabei ist, dass die Verwendung von “ajax” zum Aufruf selbiger nicht funktioniert. Warum? Weil jede App in ihrer eigenen Domäne läuft und deshalb jeder Zugriff Cross-Domain ist. Damit bleibt der “/_layouts/15/SP.RequestExecutor.js” als einzige Möglichkeit übrig, diesen Zugriff durchzuführen.

Die notwendige Url dafür gestaltet sich noch einmal so schwierig, denn bei vielen Anleitungen wird das notwendig setzen des “Targets” gar nicht erwähnt. Eine mögliche Url wäre:

appweburl + „/_api/SP.AppContextSite(@target)/web/getfolderbyserverrelativeurl(‚“ + listname + „‚)/files?@target='“ + hostweburl + „‚&$top=“ + 10+ „&$skip=“ + 10;

Und aufpassen, nicht vertippen, denn Compiler-Checks für einen String gibt es natürlich nicht.

Für viele andere Cross-Domain Aufrufe findet sich leider nicht so leicht ein möglicher Weg. Somit ist wieder einmal die Kreativität des Entwicklers gefragt, um solche Dinge zu umschiffen.

Happy Coding!

Published: 01.08.2014 08:51

Source: New feed

mehr lesen
AllgemeinDevelopment, CodingHow-To, Tutorial, SzenarioOn-PremisesSharePoint 2013

Kleine feine API: SPQuery mit Camlex.Net

Ein Assembly, das es schon seit einigen Jahren gibt und das mir bei einem meiner letzten Projekte sehr geholfen hat, ist Camlex.Net.

Dabei handelt es sich, um die Möglichkeit SPQuery Abfragen auf Basis von “Expression Trees” zu erstellen. Somit ist es nicht notwendig CAML Abfragen manuell zu erstellen. Wie fehleranfällig bzw. wie unflexibel die dynamische Erweiterung von solchen Abfragen ist, weiß jeder, der es einmal versucht hat. Die Fehlermeldungen, die man im Fehlerfall erhält, wenn Abfragen falsch sind, geben auch selten Informationen über das tatsächliche Problem.

Um Camlex.Net verwenden zu können, braucht man lediglich die Camlex.Net.dll (oder für den Client-Zugriff die Camlex.Client.dll). Diese kann man auf Codeplex (http://camlex.codeplex.com/) herunterladen oder per Install-Package installieren. Wichtig dabei ist, wenn man es in einer SharePoint Lösung verwendet, muss diese DLL im Package inkludiert werden, falls sie nicht am Ziel SharePoint vorhanden ist. Zusätzlich muss man noch ein using System.Linq im Source Code hinzufügen und schon kann man mit Hilfe von LINQ komfortable Abfragen erstellen.

Eine einfache Abfrage

Stellen wir uns vor, wir suchen in einer Liste, die Büchertitel speichert, ein bestimmtes Buch mit dem Titel “Intrigen der Macht”. Diese Abfrage sieht mit Camlex.Net wie folgt aus.

var camlQuery = Camlex.Query()

.Where(item => (string)item[„Title“] == „Intrigen der Macht“);

Man erhält dadurch eine Instanz vom Type IQuery zurück, die eine Methode implementiert, um daraus ein SPQuery Objekt zu erzeugen.

camlQuery.ToSPQuery() liefert ein SPQuery Objekt zurück, das anschließend an die Methode SPLiist.GetItems(SPQuery) wie gewohnt übergeben werden kann.

Dieses einfache Beispiel zeigt, die Abfrage für konstante Werte.

Eine Abfrage mit dynamischen Werten

Nehmen wir aber an, man will einen dynamischen nicht konstanten Ausdruck, der über ein entsprechendes Interface übergeben wurde, abfragen. Das nachfolgende Beispiel ist die Umsetzung einer TextBox (TitleTextBox) in einer ApplicationPage und einem entsprechenden Code-Behind File.

Func<object> booktitle = () => TitleTextBox.Text;

var camlQuery = Camlex.Query()

.Where(item => (string)item[„Title“] == booktitle());

Dieses Beispiel entspricht nun schon eher einem echten Anwendungsfall, gehen wir aber noch einen Schritt weiter.

Eine dynamische Abfrage

Wenn man z.B. ein Suchformular hat, das es ermöglicht nach dem Titel und nach dem Autor zu suchen, wobei der Autor als optionaler Suchparameter mitgegeben werden kann, so muss man eine dynamische Abfrage erstellen. Dies würde dann mit Hilfe von Camlex.Net wie folgt umgesetzt werden:

Func<object> booktitle = () => TitleTextBox.Text;

Func<object> bookautor = () => AuthorTextBox.Text;

var expressions = new List<Expression<Func<SPListItem, bool>>>();

expressions.Add(item => (string)item[„Title“] == booktitle());

if (!string.IsNullOrEmpty(AuthorTextBox.Text))

expressions.Add(x => (string)item[„Author“] == bookauthor());

var camlQuery = Camlex.Query()

.WhereAll(expressions);

(Die Methode für OR wäre im obigen Beispiel .WhereAny(expressions).)

Somit hat man eine dynamische SPQuery, die nur den Autor in der Filterbedingung berücksichtigt, wenn dieser tatsächlich auch über das Suchformular eingegeben wird.

An dieser Stelle sei auch erwähnt, dass die Abfrage von verschiedenen Typen (Lookup, Int, DateTime, usw.), die Kombination von And und Or Operatoren, die Sortierung und die Gruppierung möglich sind.

Dem interessierten Leser empfehle ich folgende Links:

http://camlex.codeplex.com/ hier im Speziellen die Dokumentation und das Diskussionsforum.

http://camlex-online.org.

Published: 04.07.2014 15:16

Source: New feed

mehr lesen
AllgemeinCloudDevelopment, CodingHow-To, Tutorial, SzenarioHybridOffice 365On-PremisesSharePoint 2013SharePoint OnlineTool, Bot, App, Add-In

SharePoint 2013: Apps, Apps überall!

… und jetzt auch für SharePoint 2013. Ich wurde unlängst von einem Kunden gefragt, warum es nun SharePoint Apps gibt, wo es doch ohnehin schon die server- und clientseitigen Möglichkeiten gibt, SharePoint „anzuprogrammieren“.

Also die Antwort darauf aus Microsoft Sicht ist durch aus nachvollziehbar und auch sinnvoll. Viele Entwickler und Systemadministration werden dem beipflichten, denn die technischen Gründe dafür sind absolut vertretbar. Bevor ich aber die Frage beantworte, blicken wir doch mal kurz in die Vergangenheit.

Mit SharePoint 2010 war es möglich Managed Code für SharePoint Farmen in Form von Full-trust Lösungen oder sogenannte Sandboxed-Solutions, die in einer eingeschränkten Umgebung laufen sollen, zu programmieren. Sandboxed-Solutions waren gedacht als die Lösung für Office 365, d.h. die Lösung die uns Entwicklern es ermöglicht SharePoint Lösungen für Office 365 zu programmieren.

Wer das jemals versucht hat, weiß, dass das eher eine sub-optimale Möglichkeit ist und war. Denn Sandboxed Solutions unterliegen gewaltigen Einschränkungen. Näher möchte ich darauf nicht eingehen. Aus Entwicklersicht kann ich aber behaupten, dass ich sehr glücklich bin, dass es dazu eine Alternative gibt. (mehr …)

mehr lesen