Optimieren der Methoden „Details“ und „Delete“ (VB)
von Rick Anderson
In diesem Lernprogramm lernen Sie die Grundlagen zum Erstellen einer ASP.NET MVC-Webanwendung mithilfe von Microsoft Visual Web Developer 2010 Express Service Pack 1, einer kostenlosen Version von Microsoft Visual Studio. Bevor Sie beginnen, stellen Sie sicher, dass Sie die unten aufgeführten Voraussetzungen installiert haben. Sie können alle installieren, indem Sie auf den folgenden Link klicken: Web Platform Installer. Alternativ können Sie die erforderlichen Komponenten mit den folgenden Links einzeln installieren:
- Voraussetzungen für Visual Studio Web Developer Express SP1
- ASP.NET MVC 3 Tools Update
- SQL Server Compact 4.0(Runtime + Tools-Unterstützung)
Wenn Sie Visual Studio 2010 anstelle von Visual Web Developer 2010 verwenden, installieren Sie die erforderlichen Komponenten, indem Sie auf den folgenden Link klicken: Visual Studio 2010-Voraussetzungen.
Ein Visual Web Developer-Projekt mit VB.NET Quellcode steht diesem Thema zur Verfügung. Laden Sie die VB.NET-Version herunter. Wenn Sie C# bevorzugen, wechseln Sie zu der C#-Version dieses Lernprogramms.
In diesem Teil des Lernprogramms werden Sie einige Verbesserungen an den automatisch generierten Details
und Delete
Methoden vornehmen. Diese Änderungen sind nicht erforderlich, aber mit nur wenigen kleinen Codebits können Sie die Anwendung ganz einfach verbessern.
Verbessern der Detail- und Löschmethoden
Wenn Sie einen Gerüst für den Movie
Controller erstellt haben, ASP.NET MVC generierten Code, der großartig funktioniert hat, aber das kann mit nur wenigen kleinen Änderungen robuster gemacht werden.
Öffnen Sie den Movie
Controller, und ändern Sie die Details
Methode, indem Sie zurückgeben HttpNotFound
, wenn ein Film nicht gefunden wird. Sie sollten auch die Details
Methode ändern, um einen Standardwert für die ID festzulegen, die an sie übergeben wird. (Sie haben ähnliche Änderungen an der Edit
Methode in Teil 6 dieses Lernprogramms vorgenommen.) Sie müssen jedoch den Rückgabetyp der Details
Methode von "ActionResult
inViewResult
" ändern, da die HttpNotFound
Methode kein Objekt zurückgibtViewResult
. Das folgende Beispiel zeigt die geänderte Details
Methode.
Public Function Details(Optional ByVal id As Integer = 0) As ActionResult
Dim movie As Movie = db.Movies.Find(id)
If movie Is Nothing Then
Return HttpNotFound()
End If
Return View(movie)
End Function
Code First erleichtert das Suchen nach Daten mithilfe der Find
Methode. Ein wichtiges Sicherheitsfeature, das wir in die Methode integriert haben, ist, dass der Code überprüft, ob die Find
Methode einen Film gefunden hat, bevor der Code versucht, etwas damit zu tun. Ein Hacker kann beispielsweise Fehler in die Website einschleusen, indem die von den Links erstellte URL von http://localhost:xxxx/Movies/Details/1
in etwas wie http://localhost:xxxx/Movies/Details/12345
geändert wird (oder einen anderen Wert, der keinen tatsächlichen Film darstellt). Wenn Sie nicht auf einen Null-Film überprüfen, kann dies zu einem Datenbankfehler führen.
Ändern Sie entsprechend die Delete
Und DeleteConfirmed
Methoden, um einen Standardwert für den ID-Parameter anzugeben und zurückzugeben HttpNotFound
, wenn ein Film nicht gefunden wird. Die aktualisierten Delete
Methoden im Movie
Controller werden unten angezeigt.
' GET: /Movies/Delete/5
Public Function Delete(Optional ByVal id As Integer = 0) As ActionResult
Dim movie As Movie = db.Movies.Find(id)
If movie Is Nothing Then
Return HttpNotFound()
End If
Return View(movie)
End Function
'
' POST: /Movies/Delete/5
<HttpPost(), ActionName("Delete")>
Public Function DeleteConfirmed(Optional ByVal id As Integer = 0) As ActionResult
Dim movie As Movie = db.Movies.Find(id)
If movie Is Nothing Then
Return HttpNotFound()
End If
db.Movies.Remove(movie)
db.SaveChanges()
Return RedirectToAction("Index")
End Function
Beachten Sie, dass die Delete
Methode die Daten nicht löscht. Das Ausführen eines Löschvorgangs als Reaktion auf eine GET-Anforderung (oder eigentlich eines Bearbeitungs-, Erstellungs- oder sonstigen Vorgangs, der Daten ändern) stellt eine Sicherheitslücke dar.
Die HttpPost
-Methode, die die Daten löscht, heißt DeleteConfirmed
, um der HTTP-POST-Methode eine eindeutige Signatur bzw. einen eindeutigen Namen zu geben. Die beiden Methodensignaturen werden nachstehend gezeigt:
Public Function Delete(Optional ByVal id As Integer = 0) As ActionResult
<HttpPost(), ActionName("Delete")>
Public Function DeleteConfirmed(Optional ByVal id As Integer = 0) As ActionResult
Für die Common Language Runtime (CLR) sind überladene Methoden erforderlich, um eine eindeutige Signatur (denselben Namen, eine andere Liste von Parametern) zu haben. Hier benötigen Sie jedoch zwei Delete-Methoden – eine für GET und eine für POST –, die beide dieselbe Signatur erfordern. (Beide müssen eine einzelne ganze Zahl als Parameter akzeptieren.)
Um dies zu sortieren, können Sie ein paar Dinge tun. Eine besteht darin, den Methoden unterschiedliche Namen zu geben. Das haben wir im vorangehenden Beispiel getan. Dies bringt jedoch ein kleines Problem mit sich: ASP.NET ordnet Segmente einer URL anhand des Namens zu Aktionsmethoden zu. Wenn Sie die Methode umbenennen sollten, ist das Routing normalerweise nicht in der Lage, diese Methode zu finden. Die Lösung besteht (wie im Beispiel) im Hinzufügen des ActionName("Delete")
-Attributs zur DeleteConfirmed
-Methode. Dadurch wird die Zuordnung für das Routingsystem effektiv ausgeführt, sodass eine URL, die /Delete/für eine POST-Anforderung enthält, die DeleteConfirmed
Methode findet.
Eine weitere Möglichkeit, ein Problem mit Methoden mit identischen Namen und Signaturen zu vermeiden, besteht darin, die Signatur der POST-Methode künstlich zu ändern, um einen nicht verwendeten Parameter einzuschließen. Beispielsweise fügen einige Entwickler einen Parametertyp FormCollection
hinzu, der an die POST-Methode übergeben wird, und verwenden Sie dann einfach nicht den Parameter:
Public Function Delete(ByVal fcNotUsed As FormCollection, Optional ByVal id As Integer = 0) As ActionResult
Dim movie As Movie = db.Movies.Find(id)
If movie Is Nothing Then
Return HttpNotFound()
End If
db.Movies.Remove(movie)
db.SaveChanges()
Return RedirectToAction("Index")
End Function
Zusammenfassung
Sie verfügen jetzt über eine vollständige ASP.NET MVC-Anwendung, die Daten in einer SQL Server Compact-Datenbank speichert. Sie können Filme erstellen, lesen, aktualisieren, löschen und suchen.
In diesem grundlegenden Lernprogramm haben Sie mit dem Erstellen von Controllern begonnen, sie Ansichten zuzuordnen und hartcodierte Daten zu übergeben. Anschließend haben Sie ein Datenmodell erstellt und entworfen. Entity Framework Code First created a database from the data model on the fly, and the ASP.NET MVC scaffolding system automatically generated the action methods and views for basic CRUD operations. Anschließend haben Sie ein Suchformular hinzugefügt, mit dem Benutzer die Datenbank durchsuchen können. Sie haben die Datenbank so geändert, dass sie eine neue Datenspalte enthält, und dann zwei Seiten aktualisiert, um diese neuen Daten zu erstellen und anzuzeigen. Sie haben eine Überprüfung hinzugefügt, indem Sie das Datenmodell mit Attributen aus dem DataAnnotations
Namespace markieren. Die resultierende Überprüfung wird auf dem Client und auf dem Server ausgeführt.
Wenn Sie Ihre Anwendung bereitstellen möchten, ist es hilfreich, die Anwendung zuerst auf Ihrem lokalen IIS 7-Server zu testen. Sie können diesen Webplattform-Installer-Link verwenden, um die IIS-Einstellung für ASP.NET Anwendungen zu aktivieren. Siehe die folgenden Bereitstellungslinks:
- ASP.NET Bereitstellungsinhaltszuordnung
- Aktivieren von IIS 7.x
- Bereitstellung von Webanwendungsprojekten
Ich ermutige Sie jetzt, zu unserem fortgeschrittene Erstellen eines Entity Framework-Datenmodells für eine ASP.NET MVC-Anwendungs - und MVC Music Store-Lernprogramme zu wechseln, die ASP.NET Artikel auf MSDN zu erkunden und die vielen Videos und Ressourcen https://asp.net/mvc zu erfahren, um noch mehr über ASP.NET MVC zu erfahren! Die ASP.NET MVC-Foren sind ein großartiger Ort, um Fragen zu stellen.
Viel Erfolg!
— Scott Hanselman (http://hanselman.com und @shanselman auf Twitter) und Rick Anderson blogs.msdn.com/rickAndy