Untersuchen der Methoden für Details und Löschen von Aktionen
von Rick Anderson
In diesem Teil des Lernprogramms untersuchen Sie die automatisch generierten Details
und Delete
Methoden.
Untersuchen der Methoden „Details“ und „Delete“
Öffnen Sie den Movie
Controller, und überprüfen Sie die Details
Methode.
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
Das MVC-Gerüstmodul, das diese Aktionsmethode erstellt hat, fügt einen Kommentar mit einer HTTP-Anforderung hinzu, die die Methode aufruft. In diesem Fall handelt es sich um eine GET
Anforderung mit drei URL-Segmenten, dem Movies
Controller, der Details
Methode und einem ID
Wert.
Code First erleichtert das Suchen nach Daten mithilfe der Find
Methode. Ein wichtiges Sicherheitsfeature, das in die Methode integriert ist, besteht darin, 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üft haben, würde ein NULL-Film zu einem Datenbankfehler führen.
Untersuchen Sie die Methoden Delete
und DeleteConfirmed
.
// GET: /Movies/Delete/5
public ActionResult Delete(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
Movie movie = db.Movies.Find(id);
db.Movies.Remove(movie);
db.SaveChanges();
return RedirectToAction("Index");
}
Beachten Sie, dass die HTTP Get``Delete
Methode den angegebenen Film nicht löscht, es gibt eine Ansicht des Films zurück, in der Sie den Löschvorgang (HttpPost
) übermitteln können. 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:
// GET: /Movies/Delete/5
public ActionResult Delete(int? id)
//
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
Die Common Language Runtime (CLR) erfordert überladene Methoden, um eine eindeutige Parametersignatur zu erhalten (selber Methodenname, aber unterschiedliche Liste von Parametern). Hier benötigen Sie jedoch zwei Delete-Methoden – eine für GET und eine für POST –, die beide über dieselbe Parametersignatur verfügen. (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. Dafür das der Gerüstbaumechanismus im vorherigen Beispiel gesorgt. 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 gängige Methode, um 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 ActionResult Delete(FormCollection fcNotUsed, int id = 0)
{
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
db.Movies.Remove(movie);
db.SaveChanges();
return RedirectToAction("Index");
}
Zusammenfassung
Sie verfügen jetzt über eine vollständige ASP.NET MVC-Anwendung, die Daten in einer lokalen DB-Datenbank speichert. Sie können Filme erstellen, lesen, aktualisieren, löschen und suchen.
Nächste Schritte
Nachdem Sie eine Webanwendung erstellt und getestet haben, besteht der nächste Schritt darin, sie anderen Personen zur Nutzung über das Internet zur Verfügung zu stellen. Dazu müssen Sie sie in einem Webhostinganbieter bereitstellen. Microsoft bietet kostenloses Webhosting für bis zu 10 Websites in einem kostenlosen Windows Azure-Testkonto an. Ich schlage Ihnen als Nächstes vor, mein Lernprogramm zum Bereitstellen einer sicheren ASP.NET MVC-App mit Mitgliedschaft, OAuth und SQL-Datenbank auf einer Windows Azure-Website bereitzustellen. Ein hervorragendes Lernprogramm ist tom Dykstras Zwischenebene beim Erstellen eines Entity Framework-Datenmodells für eine ASP.NET MVC-Anwendung. Stackoverflow und die ASP.NET MVC-Foren sind eine großartige Möglichkeit, Fragen zu stellen. Folgen Sie mir auf Twitter, damit Sie Updates zu meinen neuesten Lernprogrammen erhalten können.
Feedback ist willkommen.
— Rick Anderson twitter: @RickAndMSFT
— Scott Hanselman Twitter: @shanselman