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.

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

Hi, ich bin Robert Mühsig und bin Webentwickler und beschäftige mich mit Web-Frameworks auf dem Microsoft Web Stack und scheue mich auch nicht vor Javascript. Der Blog begann als "Problemsammelstelle und Lösungshilfe" und seitdem schreibe ich hier alles auf. Seit 2008 bin ich Microsoft MVP für ASP.NET. Treffen kann man mich online via Twitter (@robert0muehsig) oder hier.

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
    Source Code veröffentlichen – aber bitte mit Lizenz

    Seit es den Blog gibt wird auch meist der gesamte Demo Source Code mit veröffentlicht. Das Ganze hatte ich am Anfang noch als .zip verteilt, später lag es mal auf Google Code und nun liegen alle Samples und sonstige Sachen auf GitHub. Beim letzten User Group Treffen in Zürich mit dem Titel “Open Source: Get […]

  • Fix: Cannot convert from ‘CConnectProxy::_ComMapClass *’ to ‘AddInDesignerObjects::IDTExtensibility2 *’

    Mal einen etwas esoterischer Blogpost, welcher auftaucht wenn man zu viel mit Office Addins rumspielt. Der Fehler passiert beim Bauen von C++ Projekten, welchen diesen Typ benötigen. Lösung (auf 64bit Systemen): C:\Program Files (x86)\Common Files\DESIGNER>regsvr32 MSADDNDR.DLL And Rebuild. Meine lieben Kollegen hatte mir dies schon mehrfach gesagt, allerdings hatte ich es immer wieder vergessen Das […]

  • Gegen das Gesetz verstoßen: X Jahre Haft. Gegen die Terms of Use verstoßen: Bann auf Lebenszeit. Danke Google & co.

    Bei fast allen Diensten die man im Internet nutzen kann muss man den “Terms of use” zustimmen. Völlig logisch dass da natürlich drin steht was erlaubt und was nicht. Wenn man gegen diese Regelungen verstößt hat das Unternehmen natürlich das Recht etwas dagegen zu unternehmen. In der heutigen Welt beherrschen einige wenige Unternehmen die digitale […]

  • image.png
    RSS Feed samt Kommentaranzahl und andere nicht Standard Elemente mit dem SyndicationFeed auslesen

    Jetzt mal ein Blogpost ohne ein fancy NuGet Package: Seit .NET 3.5 gibt es die SyndicationFeed Klasse. Eine schon etwas ältere API, reicht aber aus um Atom bzw. RSS Feeds zu lesen. In diversen RSS Feeds gibt es aber Erweiterungen, welche man natürlich auch auslesen möchte. So gibt WordPress z.B. auch die Anzahl der geposteten […]

  • image.png
    ASP.NET Bundling & Fontawesome

    Vor einer halben Ewigkeit hatte ich mal geschrieben wie man Fontawesome in ASP.NET nutzen kann. Aufgrund des Alters des Post und einem Kommentar ob man denn Fontawesome auch in das ASP.NET Bundling Framework integrieren kann möchte ich nur ein kurzes Update schreiben. TL;DR: NuGet Package “Fontawesome” runterladen und Pfad in der Bundleconfig angeben. Kurze Schritte […]

Amazon Shop

Facebook