SharePoint in Office 365 – Site Collection übergreifend Daten anziehen

In den meisten SharePoint Projekten – sei es on-premise oder in der Cloud – kommt man früher oder später an den Punkt, an dem Daten über Site Collections hinweg angezogen werden sollen. Diese Grenzen sind in on-premise Lösungen mit dem Objektmodel (SPSite, SPWeb, SPList, usw.) relativ einfach zu umgehen. In der Cloud und mittels clientseitigen SharePoint Technologien (z.B. mit CSOM) hingegen kann dies auf den ersten Blick nicht ganz so einfach realisiert werden. Doch mit der ausgebauten REST-Api in SharePoint 2013 ist dies trotzdem auf einfache und effiziente Art und Weise möglich. In einem kleinen Beispiel möchte ich aufzeigen, wie mittels einfachem REST Call Websites Site Collection übergreifend angezogen werden können. (mehr …)

RazorEngine in SharePoint 2013 nutzen

Da SharePoint 2013 auf dem .NET Framework 4 (oder 4.5) läuft, kann nun auch die OpenSource Templating Engine Razor in SharePoint Projekte eingebunden werden. SharePoint an sich basiert zwar weiterhin auf den bewährten ASP.NET WebForms, doch können Custom WebParts oder Controls sehr einfach auf die RazorEngine zugreifen.

In diesem Blogpost soll ein einfaches WebPart erstellt werden, welches aus einer SharePoint Liste alle Titel der Elemente ausliest und ausgibt.

Ich erstelle also ein neues SharePoint 2013 Projekt in Visual Studio und füge via NuGet Manager die Razor Engine der Solution hinzu. Anschliessend müssen unbedingt die beiden Assemblies (RazorEngine.dll und System.Web.Razor.dll) im SharePoint Package als additional Assemblies für den GlobalAssemblyCache hinzugefügt werden.

nuget

 

Als nächstes erstelle ich ein neues WebPart in der Solution. Dem WebPart wird ein Property für das Razor Template hinzugefügt. In dieses WebPart Property kann man später sein Model als WebPart Property bearbeiten.

[WebBrowsable(true),
WebDisplayName("TemplateModel"),
WebDescription("TemplatModel Property"),
Personalizable(PersonalizationScope.Shared),
Category("Template")]
public string TemplateModel { get; set; }

Ebenso überschreibe ich die Render Methode, um darin die Parse Methode von der Razor Engine aufzurufen. In meiner Render Methode werden statische Werte geladen, aber auch alle Titel der Seiten in der Pages Library des aktuellen SPWebs geladen.

protected override void Render(HtmlTextWriter writer)
{
// irgendwelche statischen Werte
const string title = "Pages Titles";
var pagesList = SPContext.Current.Web.Lists["Pages"].Items;
var pages = (from SPListItem page in pagesList select page.Title).ToList();
// erstelle ein Model (hier als anonyme Klasse gelöst)
var model = new { Data = title, Pages = pages };
// Parse das Model wenn ein Model vorhanden ist oder geb eine Fehlermeldung aus
if(!string.IsNullOrEmpty(TemplateModel))
{
var parsedHtml = Razor.Parse(TemplateModel, model);
// und der Output wird gerendert
writer.Write(parsedHtml);
}
else
{
writer.Write("Definiere ein Model in den WebPart Properties");
}
}

Nachdem die Solution deployed wurde, kann das WebPart auf einer Page hinzugefügt und editiert werden. Hier wird nun mittels RazorTemplate auf das im Code mitgegebene Model zugegriffen.

editwebpart

 

Wird das WebPart anschliessend gespeichert, rendert es folgenden Output auf die Seite.

webpart

Dieses kleine Beispiel zeigt, wie einfach es ist, mittels RazorEngine WebParts für SharePoint 2013 zu entwickeln.