Ein Handtuch für alle Fälle: John Papas Hot Towel Template für Single Page Applications

Ein Handtuch für alle Fälle: John Papas Hot Towel Template für Single Page Applications

“Ein Handtuch ist so ungefähr das Nützlichste, was der interstellare Anhalter besitzen kann.”
— Reiseführer “Per Anhalter durch die Galaxis”

Mit einem Handtuch kann man allerdings nicht nur dem gefräßigen Plapperkäfer von Traal ein Schnippchen schlagen, sondern auch ganz entspannt Single-Page Applications (SPA) erstellen. In dieser Serie erkläre ich, wie man mit dem Hot Towel SPA Template für Visual Studio von John Papa einfach und schnell datengetriebene Single-Page-Applikationen erstellen kann.

Aber was genau ist das Hot Towel Template? Das Hot Towel Template stellt ein Gerüst für eine SPA auf Basis von ASP.NET MVC bereit. Das Template bringt den Code der Applikation in eine modulare Struktur und stellt Komponenten für DataBinding, Navigation, Rich-Data-Management und Layout bereit. […]

Reflection ohne Reflection: Properties lesen und setzen per Databinding

Nehmen wir an, wir entwickeln ein UserControl, dass die DependencyProperty TextPath vom Typ string bereitstellt. Diese Property kann der Anwender im XAML-Code setzen um das Steuerelement zu veranlassen um den Wert einer bestimmten Property seines DataContexts auszulesen oder zu setzen. Das riecht danach, das Problem mit handelsüblicher Reflection zu lösen:

var propertyInfo = this.DataContext
    .GetType()
    .GetProperty(this.TextPath);
var result = propertyInfo.GetValue(this.DataContext, null);

Das klappte auch hervorragend. Bis einer der Anwender der Komponente auf die (absolut nachvollziehbare) Idee kam, den Namen der auszulesenden Property under Verwendung der Property Path Syntax anzugeben:

<MyControl TextPath="Address.City" />

Und dann stellt man plötzlich fest, dass man mit Reflection in diesem Fall nicht sehr weit kommt. Theoretisch wäre eine Lösung zwar möglich, aber nur, wenn man bereit ist einen Parser für die Property Path Syntax zu schreiben und noch mehr Reflection in den Ring zu schicken.

Es gibt allerdings eine Komponente in Silverlight und im .NET-Framework die diese Funktionalität schon fix und fertig liefert: Die Klasse System.Windows.Data.Binding. Das Prinzip ist einfach: Man bindet die Quelle (in diesem Fall den DataContext des Steuerelements) unter Verwendung des angegebenen Pfades an eine Property einer Helferklasse und lasse das Binding seine Arbeit tun. Wie das konkret vonstatten geht? […]

Wenn es watschelt und quakt: Ducktyping in C#

“When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.”
— James Whitcomb Riley

Oder auf gut Deutsch: “Wenn ich einen Vogel sehe, der wie eine Ente watschelt und wie eine Ente quakt, dann ist dieser Vogel für mich eine Ente.” Das selbe Prinzip das James Whitcomb Riley auf die Enten angewandt hat, kann man auch in der Software-Entwicklung anwenden. Zwei Fragen stellen sich dabei zwangsläufig. Ist das wirklich eine gute Idee? Und wenn ja, wie geht das? […]

Sage mir wer du bist: Enum-Werte mit einer Beschriftung versehen

Oft ist es so, dass die Werte einer Enumeration irgendwie ausgegeben werden sollen. Dazu reicht prinzipell ein einfaches ToString(). Was aber, wenn dieser einfache Weg nicht reicht und man stattdessen einen wirklich lesbaren Wert ausgeben möchte? Hier kommt einem das DescriptionAttribute aus dem System.ComponentModel-Namespace zur Hilfe. Damit kann man jedem Wert eines Enums eine aussagekräftige Beschreibung zuweisen: […]

RIA Services: Request-Timeout anpassen

Die WCF RIA-Services stellen durch einen Standart-Timeout sicher, dass alle Anfragen innerhalb einer vertretbaren Zeit abgeschlossen werden. Wenn man bei einer solchen Abfrage den Mund nicht voll bekommt und zu viele Daten auf einen Streich vom Server lädt kann es zu folgender Fehlermeldung kommen:

The HTTP request to ‘http://deinservice’ has exceeded the allotted timeout. The time allotted to this operation may have been a portion of a longer timeout.

Der ideale Weg, diese Fehlermeldung zu vermeiden, liegt darin, zu prüfen ob es tatsächlich nötig ist so viele Daten in einer einzelnen Abfrage zu laden. In der Regel ist das ohne Probleme möglich. So kann man die Abfrage in mehrere kleine Portionen aufteilen oder die zu ladenden Objekte aufsplitten und so nur die Daten laden, die man tatsächlich benötigt. Es mag jedoch Fälle geben in denen eine solche Lösung nicht tragbar ist und der Timeout verändert werden muss. Clientseitig kann der Timeout auf dem Binding des Endpoints des DomainServices angepasst werden. Klar soweit? Wie so oft sagen in diesem Fall ein paar Zeilen code mehr als tausend Worte. […]

DialogResult von ChildWindow aus ViewModel setzen

DialogResult von ChildWindow aus ViewModel setzen

Wer in Silverlight dem Benutzer eine Message-Box präsentieren möchte, kommt um die ChildWindow-Klasse nicht herum. Ein solches ChildWindow wird durch Setzen der DialogResult-Property auf entweder true oder false wieder geschlossen. Prinzipiell ist das kein Problem, man könnte die Property ja bei im Klick-EventHandler der Schaltfläche setzen, die das Fenster schließt. Die Message-Box mittels EventHandler im Code-Behind zu schließen ist allerdings unschön, wenn die Message-Box ihr eigenes ViewModel hat. Derlei Aktionen fallen nämlich für gewöhnlich in dessen Zuständigkeitsbereich.

Dem ViewModel einfach eine entsprechende Property zu verpassen und die DialogResult-Property des ChildWindows daran zu binden scheitert jedoch daran, dass die DialogResult-Property keine DependencyProperty ist und sich demzufolge nicht binden lässt. Mit ein wenig Code kann man hier jedoch Abhilfe schaffen. […]

Überschreiben virtueller Methoden verhindern

Was tut der Entwickler einer Komponente, der verhindern möchte, dass andere von seiner Klasse ableiten? Richtig. Er verwendet das sealed-Schlüsselwort:

public sealed class Kobold
{ 
}

Aber was, wenn der Entwickler das weitere Überschreiben einer virtuellen Methode in einer abgeleiteten Klasse verhindern möchte? Auch hier hilft das sealed-Schlüsselwort: Diesmal allerdings nicht auf Klassenebene, sondern bei der zu schützenden Methode.

public sealed override void SagHallo()
{
}

Das erneute Überschreiben dieser Methode in einer abgeleiteten Klasse wird jetzt zu einem Compilerfehler führen.

Es geht weiter

Lange war es ruhig in der SharePointZone – der letzte Artikel datiert auf den 29. Juni 2010. Nach über anderthalb Jahren habe ich mich nun entschlossen diesen Blog wiederzubeleben, allerdings mit neuem Namen und breiterem Fokus: Aus sharepointzone.de wird softwarearbeiter.de. Der Schwerpunkt dieses Blogs liegt nach wie vor auf Microsoft-Technologien, allerdings diesmal deutlich breiter gefächert und nicht auf den Themenkomplex SharePoint beschränkt. So wird es hier eine Sammlung von Tipps und Tricks, kleinen und großen Snippets und Tutorials und Artikeln über den Microsoft Technologie-Stack und Software-Entwicklung im Allgemeinen geben. Ich freue mich auf viele Kommentare, Anregungen und Diskussionen – Informationen über neue Artikel gibt’s im RSS-Feed oder bei Twitter: @Spontifixus!

Information Worker VM unter Windows 7

Information Worker VM unter Windows 7

Microsoft stellt zum Testen und Evaluieren der Information Worker Solutions netterweise eine fertig installierte und vorkonfigurierte VirtualMachine zur Verfügung. Allerdings benötigt man zur Ausführung der VMs zwingend Windows Server 2008 R2, da Microsoft die VMs ausschließlich als HyperV VMs bereitstellt. Will man diese VMs auf einem Notebook ausführen (z.B. für eine Demonstration beim Kunden) ohne gleich Windows Server 2008 R2 auf dem Notebook zu installieren, muss man die Virtual Machiness in eine geeignete Form konvertieren, die sich z.B. mit dem VMWare Player abspielen lässt. […]

Eigenes ListTemplate definieren

Eigenes ListTemplate definieren

Eine häufige Aufgabe bei der Entwicklung einer SharePoint-Applikation ist die Definition eines Listen-Templates. Weil man sich da, insbesondere bei der Anpassung der Datei schema.xml entgegen landläufiger Meinung eine Menge Arbeit sparen kann, möchte ich an dieser Stelle kurz darauf eingehen. Das folgende Beispiel basiert auf der Annahme, dass das ListTemplate “BaumListe” mit Elementen des neu definierten ContentTypes “Baum” mit den Spalten “Name” und “Kategorie” umgehen können soll. […]

Ältere Einträge«