Webentwicklung mit ASP.NET MVC 4

Florian Rappl, Universität Regensburg

ASP.NET MVC 4

Webentwicklung in Perfektion.

ASP.NET MVC 4

Agenda

  1. 09:00 - 10:30 Vortrag (Erster Teil)
  2. 10:30 - 10:45 Pause
  3. 10:45 - 12:00 Vortrag (Zweiter Teil)
  4. 12:00 - 13:00 Mittagspause
  5. 13:00 - 16:00 Übungen
  6. 16:00 - 17:00 Offener Teil

Übersicht

  1. Über ASP.NET
  2. Das MVC Muster
  3. Einstieg in ASP.NET MVC
    1. Views und Controls
    2. Controller und Models
    3. Routing und Areas
  4. JavaScript für C# Entwickler
  5. Fortgeschrittene Themen

ASP.NET

  • .NET Version von Active Server Pages
  • Seiten werden kompiliert für bessere Performance
  • Ursprüngliche Version wird Webforms genannt
  • Ziel: Windows Forms Anwendern Webentwicklung erleichtern
  • Problem: Das Web verhält sich nicht wie Windows Forms

ASP.NET heute

Der Kern von ASP.NET

  • Routing
  • Membership und Roleprovider
  • Debugging Fähigkeiten
  • State Management
  • Providers
  • Caching
  • Konfiguration (web.config)

ASP.NET MVC

  • Idee: Leichtgewichtiges Web Framework
  • Näher an der Realität als Webforms
  • Erweiterbar
  • Stark durch Architektur und Konvention geprägt
  • Mehrschichtarchitektur

Webforms gegen MVC

Wann was verwenden?

ASP.NET MVC
  • Leichter zu verwalten
  • Kein Viewstate (mehr Kontrolle)
  • Routing-Möglichkeiten
  • Testbarkeit
  • Besser für größere Teams
ASP.NET Webforms
  • Geringere Komplexität
  • Automatisierter Viewstate
  • Für kleinere Teams geeignet
  • Event-Model Umsetzung
  • Funktionalität für Pages

Model-View-Controller

Das MVC Muster

  • Models sind Objekte mit Logik
  • Models sind i.A. nicht Entities
  • ORM ist nicht beinhaltet, sollte aber genutzt werden
  • Der View kennt die Models und verwendet diese
  • Der Controller generiert Models und spricht Views an
  • Einstiegspunkt ist immer ein Controller

Ablauf eines MVC Aufrufs

Verschiedene Ordner

  • App_Start (Konfiguration für Global.asax)
  • Areas (später)
  • Content (für CSS, Bilder, ...)
  • Controllers (später)
  • Models (später)
  • Scripts (für JavaScripts)
  • Views (später)

C# Vorwissen

  • Dynamic (DLR), z.B. ViewBag, ...
  • Extension Methods, z.B. HtmlHelper, ...
  • Attributes, z.B. [Required], ...
  • Reflection, z.B. für Controller, ...
  • Dependency Injection, z.B. für ORM, ...
  • NuGet, z.B. für JSON, EF, ...

→ 01 - Projekt erstellen

Der View

  • Werden im Ordner Views abgelegt
  • Unterscheidung: Strongly typed und dynamisch
  • dynamic wird in ASP.NET MVC häufig verwendet
  • Views werden durch eine View engine interpretiert
  • Es gibt verschiedene View engines, z.B. WebForm oder Razor
  • Konvention: _ViewStart.cshtml enthält gemeinsame Informationen
  • Legt z.B. das Layout für einen View fest

Die Razor view engine

  • Standard View engine für MVC
  • Code beginnt mit @
  • Unterscheidung Code-Block @{} / Single Statement
  • Auch Multi-Token Statements sind möglich @()
  • Umschalten im Code mit <text> oder @:
  • Kommentare mit @* ... *@ möglich

Spezielle View Variablen

  • Durch @@ wird ein @ ausgegeben
  • Über @section können Sektionen definiert werden
  • Strongly typed über @model Anweisung am Anfang
  • Mit @name können Methoden definiert werden
  • Variablen können in Views deklariert und wiederverwendet werden

Der ViewBag

  • Grundsätzlich gilt: Feste Models sind vorzuziehen
  • Dynamische Variable mit eigenen / gemischten Inhalt
  • Gibt den Inhalt aus ViewData Dictionary aus
  • ViewBag ist also nur ein fancy Zugriff ohne explizite Casts
  • Zusätzlich gibts noch TempData
  • Wird zum Austausch von Daten zwischen zwei Aufrufen verwendet

→ 02 - Views

Steuerelemente

  • Kurz gesagt: Es gibt keine!
  • Zumindest nicht so wie bei ASP.NET Webforms
  • MVC verwendet nur HTML
  • Wichtigste Klasse: HtmlHelper
  • Zugang zu einer Instanz im View über Html
  • Nahezu alle Methoden darin sind Erweiterungsmethoden
  • Beispiel: @Html.Checkbox("test")

Vorteile

  • Wissen genau was die Steuerelemente machen
  • Können eigene Implementierung anfertigen
  • Modulare Ausrichtung mit Plugfähigen Methoden
  • Unzählige Überladungen vorhanden
  • Später interessant: Data Annotations

→ 03 - Controls

Der Controller

  • Standardmäßig im Ordner Controllers abgelegt
  • Jede Klasse die von Controller erbt
  • Können natürlich auch unsere eigene Basisklasse reinschieben
  • Der Name ist wichtig (per Konvention)
  • Routes verwenden {controller} als Variable
  • Name ist der Teil vor Controller im Klassennamen
  • Öffentliche Methoden können ausgeführt werden

Was ist wichtig?

  • Einschränken der HTTP Methode
  • z.B. über [HttpGet] nur GET möglich
  • Rückgabe einer Action muss ein ActionResult sein
  • z.B. Rückgabe der View() Methode (ViewResult)
  • Andere Arten sind z.B. FileResult, EmptyResult, RedirectResult oder ContentResult
  • Öffentliche Methoden über [NonAction] sperren

Async Controller

  • Fortgeschrittenes Thema (früher) - heute (.NET 4.5) leicht
  • Voraussetzung: Erben von AsyncController
  • Actions wie üblich: async Task<ActionResult>
  • Verwendung von [AsyncTimeout(time)]
  • Übergabe eines CancellationToken sinnvoll
  • Falls Timeout: Handhaben über HandleError Attribut

→ 04 - Controller

Das Model

  • Enthält die Anwendungslogik
  • Sollten im Ordner Models abgelegt werden
  • Modelliert die Daten die ein View anzeigen soll
  • Models sind daher Transporter zwischen Controller und View
  • Und auch Realisierungen der Anfrage zum Controller
  • MVC versucht die Parameter aus dem Request zu konstruieren

Data Annotations für Models

  • Attribute dekorieren die Eigenschaften
  • Insgesamt verwendet MVC sehr häufig Attribute
  • Verwendung der Attribute im View (implizit)
  • Vorteil: Weniger Copy / Paste, determiniert
  • Können u.a. Beschreibung, Art und Einschränkungen definieren
  • Vorteil: Automatische Erstellung von Client-Code ...
  • ... und automatische Überprüfung auf Server-Seite

→ 05 - Models

Warum Routing?

  • In Webforms war URL gleich Pfad
  • Dies erzeugt häßliche URLs
  • Häufig will man Parameter in die URL einbauen
  • Außerdem sollten notwendige Parameter direkt erkennbar sein
  • MVC löst dies über die Definition von Routen
  • Jede Anfrage wird zunächst untersucht
  • Anschließend wird die Anfrage zugeordnet

Zuordnen der Anfrage

  • Intern werden Anfragen Controllern zugeordnet
  • Hierfür werden die erstellen Routen verwendet
  • Hier müssen u.U. entsprechende Constraints erfüllt werden
  • Sobald ein Controller gefunden wurde, wird die Action gesucht
  • Auslesen der benötigten Parameter
  • Aus der Anfrage wird versucht, die Parameter zu bauen
  • Beim Scheitern wird null übergeben (ansonsten: Fehler)

Routing in ASP.NET MVC

Welche Signaturen sind geschickt?

  • Werttypen müssen erfüllt sein
  • Referenztypen können null sein
  • Optionale Werttypen über ? nullable machen
  • Auch Standardwerte können in der Route definiert werden
  • Überprüfung der Parameter trotzdem notwendig

Die Routing Pipeline

→ 06 - Routing

Konzept: Areas

  • Szenario: Webapplication wächst
  • Besteht aus mehreren Modulen
  • Gibt Gemeinsamkeit (Design, Accounts, ...)
  • Aber verschiedene Home Bereiche etc.
  • Lösung: "Mini" MVC Applications in MVC
  • Unterschied: Verfügen über keine Global.asax

Areas Architektur

  • Im Ordner Areas befinden sich diese Projekte
  • Jedes Projekt in einen eigenen Ordner (Name der Area)
  • Darin sind Ordner Controllers, Models, ... enthalten
  • Problem: Alles in einem Projekt
  • Lösungen um Areas zu Modularisieren existieren
  • Einfachste Lösung: Area Projekte in Areas Ordner stecken

Portable Areas

  • Unsere Lösung: MvcContrib verwenden
  • Enthält die PortableAreaRegistration Klasse
  • Vorteil: Ohne großen Aufwand portierbar
  • Keine Abhängigkeiten
  • Allerdings gibts einen Nachteil / etwas zu beachten
  • Alle Resourcen müssen als Embedded Resources markiert sein
  • Resourcen sind z.B. Bilder, Skripte, Views

→ 07 - Areas

Was bisher geschah ...

JavaScript

  • Es geht nicht ohne (genau wie HTML, CSS)
  • Für C# Entwickler ist der Einstieg nicht schwer
  • Aber: Lisp ähnliche Sprache mit C Syntax
  • Objektorientierte, funktionale und dynamische Sprache
  • Wichtig: Funktionen erzeugen Scope
  • Immer var zur Erzeugung von Variablen verwenden

Document Object Model

  • Meistens wird mit dem Dokument interagiert
  • Das Dokument wird durch das DOM dargestellt
  • Die API ist vom Browser / dem W3C vorgegeben
  • Bibliotheken wie jQuery standardisieren dies
  • Erst JavaScript lernen, dann die jQuery Bibliothek
  • Im DOM gehts um Eigenschaften und Methoden

→ 08 - JavaScript

Sicherheitsaspekte

  • POST Anfragen generell nur mit Anti Forgery Token zulassen
  • Immer ankommende Werte / Instanzen validieren
  • GET Anfragen immer readonly behandeln
  • Entsprechende Controller immer auf [Authorize] setzen
  • Niemals User-Content direkt als HTML rendern lassen
  • Sowenig externe Resourcen wie möglich einsetzen
  • Unobtrusive JavaScript einsetzen

→ 09 - Sicherheitsaspekte

Caching in ASP.NET verstehen

Aufpassen bei Caching

  • Caching ist super für Performance Gewinn
  • Allerdings führt es bei schlechter Konfiguration zu Nachteilen
  • Immer Parametervariation im Auge behalten
  • Und die (maximale) Lebenszeit sinnvoll bestimmen
  • Bei Multi-Language auch an Sprache etc. denken
  • Letztlich immer an alle Parameter denken

→ 10 - Caching

Mobile Endgeräte

Responsive Design

  • Mobile first oder desktop first?
  • CSS übernimmt Anpassung für verschiedene Größen
  • Der Browser sucht sich das passende Stylesheet
  • JS: Feature Erkennung der Browser Erkennung vorziehen
  • Bilder über CSS ebenfalls anpassen

MVC und Smartphones

  • View engine angepasst: Erkennt z.B. _Layout.Mobile.cshtml
  • Weitere in DisplayModeProvider registrierbar
  • Häufig wird einfach der User-Agent abgefragt
  • z.B. Abfrage ob es sich um ein iPhone handelt
  • Zuordnung dann z.B. auf _Layout.iPhone.cshtml
  • Sinvoll: Verwendung von jQuery Mobile

→ 11 - Mobile Applications

Viel Erfolg!

MVP

Florian Rappl, Universität Regensburg