ASP.NET MVC Preview 2 + Membership

Ich hab mich in den letzten 3 Tagen (jeweils vielleicht 1,5 Stunden)  mit dem ASP.NET MVC (Preview 2) beschäftigt.

Wer ASP.NET MVC mit dem Visual Web Developer ausprobieren möchte, der schaut sich am besten diesen Blogpost von mir an.

Wenn man das MVC Modell installiert hat, bekommt man eine neue Projektvorlage:

image

Wenn man dies nun das erste mal startet, erblickt man eine doch schon nett ausschauende Seite:

image

Leider kann man nur zwischen "Home" und "About" hin und her schalten.

Ich will ein einfaches Loginsystem haben

Grob hab ich ähnliche Schritte wie hier gemacht – also ASP.NET DB aufgesetzt, User eingetragen & das Menü erstmal erweitert (und die CSS etwas umgestellt) :

Vorher:

image

Nachher:

image

Der "Login" & "Register" Button verweist auf den LoginController (die genaue Implementation findet ihr im Download) :

image 
(das Attribut wird später erklärt)

Im Login Userinterface sieht das so aus
"Index.aspx"

image 

"PasswordRecovery.aspx"

image 
(nicht wundern: hier gibt man den Nutzernamen ein und das generierte Passwort wird hier wieder ausgegeben – in einer richtigen Applikation würde man dies über eine Email an den jeweiligen schicken)

"Register.aspx"

image

In der Dateistruktur ist es recht übersichtlich:

image

Nach einem erfolgreichen Login

Das Menü wird entsprechend (über das ASP.NET LoginView Control) verändert:

image

Das Profil kann man auf dieser Seite ansehen:

image

… und editieren:

image

In der Dateistruktur:

image

… und der Controller:

image

Rechtesystem mit Rollensystem

Ich habe noch eine Adminrolle hinzugefügt, dieser kann User auf einer Übersichtsseite wieder löschen und hat eine anderes Menü:

image

Die Administrationsseite:

image

Der "Delete" link verweisst auf diese URL:

"/Useradmin/Delete/[USERNAME]"

Der Controller ist auch recht einfach:

image

Mit einem Klick auf den Link wird der Nutzer gelöscht.

Wie sieht das ganze Projekt aus?

image

Das ist das gesamte Projekt – sieht auf dem ersten Blick viel aus, allerdings ist es einfach durch das MVC Paradigma eine solche Trennung zwischen den einzelnen Views. Die Views selbst sind meistens sehr schmal gehalten.

Was machen diese Attribute "RequiresRole" & "RequiresAuthentication"?

In ASP.NET WebForms kann man über die Web.config die Sicherheitsregeln einstellen. Das wird auf die entsprechende URL gemappt – da aber die URL im MVC nur noch wenig mit der richtigen Pfadangabe zutun hat, gibt es da natürlich Probleme.

Abhilfe schaffen diese beiden Attribute, welche überprüfen, ob der Nutzer authentifiziert ist oder ob er in der angegebenen Rolle ist. Der Code dafür stammt von Rob Conerys Blog.

Wie schickt man Daten an den Controller und wieder zurück?

Um mal ein Beispiel zu zeigen, wie einfach die Kommunikation zwischen den Controllern und den Viewpages ist, möchte ich die Register Methode im LoginController erklären:

image

Damit ich die Registrierseite unter der URL "Login/Register" erreichen kann, prüfe ich im ersten Schritt, ob ich bereits irgendwelche Daten in dem Request stehen.

Wenn ja:

Verarbeite die Daten – also befülle das Membership System. Wenns ein Fehler gibt (z.B. der Nutzer existiert bereits), dann merke dir in "ViewData", dass ein Fehler aufgetreten ist und render den View.
Die Membership API ist in diesem Fall unser Model – das wir entsprechend befüllen.

Wenn nein:

Render den View

Im View ist sehr einfaches HTML – keine runat="server" etc.

Hinweis: Scott Guthrie hat dieses Thema bereits vor einige Zeit gut erklärt.

Erweitertes Beispiel ist fertig.

Man kann sich bei der Demoapplikation nun Anmelden, Registrieren, ein neues Passwort generieren lassen wenn es vergessen wurde, seine Hauptdaten ändern und der Admin kann Nutzer löschen – ich denke für einen ersten Wurf ist das eigentlich schon ok :)

Unten findet ihr diese Applikation zum Runterladen und selber ausprobieren. Wichtig ist, dass ihr die ASP.NET MVC Preview 2 installiert habt.

An die Kritiker, die meinen, dass man das mit den eingebauten ASP.NET Controls viel schneller hinbekommt: Das mag erstmal hier vielleicht stimmen – allerdings sind die Controls verdammt umständlich, wenn man die etwas verändern möchte oder ganz einfache Funktionalität einbauen möchte.
Im Zusammenhang mit einer Masterpage (und vielleicht wenn man das Logincontrol noch abändert), funktioniert die "Enter" Taste nicht mehr – das muss man erst recht komplex umstellen. Das ganze ist recht fix implementiert gewesen – die Geschwindigkeit (und die nette Logik) mit der man entwickelt empfinge ich als ex-PHP Entwickler wesentlich logischer, als dieses Postback Modell.

Wer auf pures HTML steht (dazu zähle ich mich) und diese Servercontrols für den "falschen" Weg hält, der sollte sich das Beispiel hier mal anschauen. Ich gebe zu, dass der Inlinecode sicherlich auch noch nicht ganz der Weisheit letzter Schluss ist, allerdings ist eine ViewPage auch nichts anderes als eine Klasse, welche ein Konstruktor hat – wenn man dies alles noch mit kleinen Methoden und/oder UserControls auslagert, ist das MVC Model für viele Fälle sicher auch eine ebenso gute Wahl.

Letzter Hinweis:

Das ist eine Demoapplikation – wer sich näher mit dem MVC Modell beschäftigt, wird bestimmt noch viele weitere coole Features finden.

[ Download Democode ]*

* in der ReadMe.txt stehen die Logindaten für das Beispiel

Empfohlene Links:

Die Videos von Scott Hanselman zu ASP.NET MVC sowie die Northwind Sample App sollte man sich auch anschauen.


Kick It auf dotnet-kicks.de
Wenn dir der Blogpost gefallen hat, dann hinterlasse doch einen Kommentar. Wenn du auf dem Laufenden bleiben willst, abonniere unseren RSS Feed oder folge uns auf Twitter.

About the author

Written by Robert Mühsig

Robert Mühsig (@robert0muehsig) ist Webentwickler und beschäftigt sich mit Web-Frameworks (vor allem dem ASP.NET MVC Framework) und scheut sich auch nicht vor Javascript. Ansonsten bloggt er über all jene Probleme, die ihm über den Weg laufen. Seit 2008 ist er Microsoft MVP für ASP.NET und er arbeitet bei der T-Systems Multimedia Solutions GmbH in Dresden. Treffen kann man ihn online via Twitter (@robert0muehsig) oder dieser Seite oder bei der .NET User Group Dresden.

12 Responses

  1. Danke schön!

    Reply
  2. Hello,

    Thanks for the code. After downloading and setting up, unable to login or register. Seems nothing is fired from the login button.

    John

    Reply
  3. John,

    You need to change the to

    At least that worked for me.

    Reply
  4. Sorry, HTML code didn’t post:

    Change the “” to
    “”

    Reply
  5. Both times the HTML got eaten.
    It posts in FireFox, but not IE.

    Can you repost the changes?

    Reply
  6. You could also check out the asp.net mvc membership starter kit – it is very similar to my version:
    http://www.codeplex.com/MvcMembership

    Reply
  7. Ah – the problem with the login (and registration/password forgotten action) is only with Internet Explorer – just set on submit butten the type to “submit” – than should it work :)

    Reply

Comment on this post

Letzte Posts

  • image.png
    RavenHQ–RavenDB in der Cloud

    Ayende Rahien hat es heute verkündet – RavenHQ, der RavenDB Cloud Hoster (natürlich von und mit Ayende) ist ab heute raus aus der Beta und man kann es von überall aus nutzen. In der Betaphase waren nur Nutzer von AppHarbor zugelassen. Was ist RavenHQ? RavenHQ ist im Grunde ein gehostes RavenDB in den Rechenzentren von ...

  • image.png
    GitHub for Windows–erste Eindrücke

    Git ist schon eine tolle Sachen und eröffnet viele neue Möglichkeiten – allerdings ist der Einstieg recht hart und selbst wenn man die guten Hilfsanleitungen auf GitHub befolgt, kommt man am Anfang nur langsam vorwärt. Insbesondere ist das Tooling für Windows / .NET Entwickler auch nicht gerade “bekanntes Terrain”. GitHub to the rescue! Die GitHub ...

  • image.png
    Chocolatey–apt-get für Windows

    Durch Zufall bin ich auf das Tool “Chocolatey” gestoßen. Wer die Website sich anschaut, wird evtl. eine Verwandschaft mit NuGet ausmachen. Was macht Chocolatey? Chocolatey ist ein “Maschine Package Manager”, das bedeutet, dass man für seine Maschine einfach Tools runterladen und Updaten kann – direkt über die Konsole. Was ist der Unterschied zu NuGet? NuGet ...

  • image.png
    SASS, LESS & Coffeescript in Visual Studio mit der Web Workbench

    CSS und Javascript sind die “kleinste” Schnittmenge von allen Browsern für die Erstellung von Web-Applikationen. Leider geht dabei etwas komfort verloren, daher lieben alle Webentwickler jQuery! SASS und LESS sind zwei Varianten, wie man “schöner” CSS schreiben kann und Coffeescript versucht Javascript Entwicklung zu vereinfachen. Aber immer der Reihe nach… Was ist SASS? SASS steht ...

  • image.png
    Code-Inside Sample nun auf GitHub: Google Code zu GitHub Migration

    Seit einiger Zeit habe ich Beispielcode auf Google Code bereitgestellt. Einfach nur noch weg von Google Code O-Ton damals war: Ich hatte mich für Google Code entschieden, weil ich hoffe dass früher oder später die Google Code Suche nutzbar ist und es dadurch wenigstens ein kleiner Mehrwert entsteht. Allerdings wirft es momentan noch ein Fehler. ...

Auf Amazon einkaufen & unterstützen

Facebook