Share via


Einführung in ASP.NET Web Pages : Löschen von Datenbankdaten

von Tom FitzMacken

In diesem Tutorial erfahren Sie, wie Sie einen einzelnen Datenbankeintrag löschen. Es wird davon ausgegangen, dass Sie die Reihe durch Aktualisieren von Datenbankdaten in ASP.NET Web Pages abgeschlossen haben.

Sie lernen Folgendes:

  • Hier erfahren Sie, wie Sie einen einzelnen Datensatz aus einer Auflistung von Datensätzen auswählen.
  • Hier erfahren Sie, wie Sie einen einzelnen Datensatz aus einer Datenbank löschen.
  • Überprüfen, ob in einem Formular auf eine bestimmte Schaltfläche geklickt wurde.

Erläuterte Features/Technologien:

  • Das WebGrid Hilfsprogramm.
  • Der SQL-Befehl Delete .
  • Die Database.Execute Methode zum Ausführen eines SQL-Befehls Delete .

Sie lernen Folgendes

Im vorherigen Tutorial haben Sie gelernt, wie Sie einen vorhandenen Datenbankdatensatz aktualisieren. Dieses Tutorial ist ähnlich, mit dem Unterschied, dass Sie ihn löschen, anstatt den Datensatz zu aktualisieren. Die Prozesse sind sehr ähnlich, mit dem Unterschied, dass das Löschen einfacher ist, sodass dieses Tutorial kurz sein wird.

Auf der Seite Filme aktualisieren Sie das WebGrid Hilfsprogramm, sodass neben jedem Film der Link "Bearbeiten", den Sie zuvor hinzugefügt haben, einen Link zum Löschen angezeigt wird.

Seite

Wie bei der Bearbeitung gelangen Sie beim Klicken auf den Link Löschen zu einer anderen Seite, auf der sich die Filminformationen bereits in einem Formular befinden:

Seite

Anschließend können Sie auf die Schaltfläche klicken, um den Datensatz dauerhaft zu löschen.

Sie beginnen damit, dem Hilfsprogramm einen Link zum Löschen hinzuzufügen WebGrid . Dieser Link ähnelt dem Link Bearbeiten , den Sie in einem vorherigen Tutorial hinzugefügt haben.

Öffnen Sie die Datei Movies.cshtml .

Ändern Sie das WebGrid Markup im Textkörper der Seite, indem Sie eine Spalte hinzufügen. Hier sehen Sie das geänderte Markup:

@grid.GetHtml(
    tableStyle: "grid",
    headerStyle: "head",
    alternatingRowStyle: "alt",
    columns: grid.Columns(
grid.Column(format: @<a href="~/EditMovie?id=@item.ID">Edit</a>),
grid.Column("Title"),
grid.Column("Genre"),
grid.Column("Year"),
grid.Column(format: @<a href="~/DeleteMovie?id=@item.ID">Delete</a>)
    )
)

Die neue Spalte ist die folgende:

grid.Column(format: @<a href="~/DeleteMovie?id=@item.ID">Delete</a>)

Die Art und Weise, wie das Raster konfiguriert ist, befindet sich die Spalte Bearbeiten am weitesten links im Raster, und die Spalte Löschen befindet sich am weitesten rechts. (Nach der Year Spalte befindet sich jetzt ein Komma, falls Sie das nicht bemerkt haben.) Es gibt nichts Besonderes darüber, wo diese Linkspalten liegen, und Sie können sie so einfach nebeneinander platzieren. In diesem Fall sind sie getrennt, um die Vermischung zu erschweren.

Seite

Die neue Spalte zeigt einen Link (<a> Element), dessen Text "Delete" lautet. Das Ziel des Links (sein href Attribut) ist Code, der letztendlich in etwa diese URL aufgelöst wird, wobei sich der id Wert für jeden Film unterscheidet:

http://localhost:43097/DeleteMovie?id=7

Dieser Link ruft eine Seite namens DeleteMovie auf und übergibt ihr die ID des ausgewählten Films.

In diesem Tutorial wird nicht ausführlich beschrieben, wie dieser Link erstellt wird, da er fast identisch mit dem Link Bearbeiten aus dem vorherigen Tutorial (Aktualisieren von Datenbankdaten in ASP.NET Web Pages) ist.

Erstellen der Seite "Löschen"

Jetzt können Sie die Seite erstellen, die das Ziel für den Link Löschen im Raster ist.

Hinweis

Wichtig Die Technik, zuerst einen zu löschenden Datensatz auszuwählen und dann eine separate Seite und Schaltfläche zu verwenden, um den Prozess zu bestätigen, ist für die Sicherheit äußerst wichtig. Wie Sie in den vorherigen Tutorials gelesen haben, sollte jede Art von Änderung an Ihrer Website immer mithilfe eines Formulars erfolgen, d. h. mithilfe eines HTTP POST-Vorgangs. Wenn Sie die Website nur durch Klicken auf einen Link (d. h. mithilfe eines GET-Vorgangs) ändern konnten, könnten Benutzer einfache Anforderungen an Ihre Website senden und Ihre Daten löschen. Selbst ein Suchmaschinen-Crawler, der Ihre Website indiziert, kann versehentlich Daten löschen, indem Sie einfach links folgen.

Wenn Ihre App es Benutzern ermöglicht, einen Datensatz zu ändern, müssen Sie den Datensatz dem Benutzer trotzdem zur Bearbeitung präsentieren. Möglicherweise sind Sie jedoch versucht, diesen Schritt zum Löschen eines Datensatzes zu überspringen. Überspringen Sie diesen Schritt jedoch nicht. (Es ist auch hilfreich für Benutzer, den Datensatz anzuzeigen und zu bestätigen, dass sie den gewünschten Datensatz löschen.)

In einem nachfolgenden Tutorialsatz erfahren Sie, wie Sie Anmeldefunktionen hinzufügen, damit sich ein Benutzer vor dem Löschen eines Datensatzes anmelden muss.

Erstellen Sie eine Seite mit dem Namen DeleteMovie.cshtml , und ersetzen Sie die Elemente in der Datei durch das folgende Markup:

<html>
<head>
  <title>Delete a Movie</title>
</head>
<body>
      <h1>Delete a Movie</h1>
        @Html.ValidationSummary()
      <p><a href="~/Movies">Return to movie listing</a></p>

      <form method="post">
        <fieldset>
        <legend>Movie Information</legend>

        <p><span>Title:</span>
         <span>@title</span></p>

        <p><span>Genre:</span>
         <span>@genre</span></p>

        <p><span>Year:</span>
          <span>@year</span></p>

        <input type="hidden" name="movieid" value="@movieId" />
        <p><input type="submit" name="buttonDelete" value="Delete Movie" /></p>
        </fieldset>
      </form>
    </body>
</html>

Dieses Markup ähnelt den EditMovie-Seiten , mit der Ausnahme, dass das Markup anstelle von Textfeldern (<input type="text">) Elemente enthält <span> . Es gibt hier nichts zu bearbeiten. Sie müssen nur die Filmdetails anzeigen, damit Benutzer sicherstellen können, dass sie den richtigen Film löschen.

Das Markup enthält bereits einen Link, über den der Benutzer zur Seite mit der Filmliste zurückkehren kann.

Wie auf der Seite EditMovie wird die ID des ausgewählten Films in einem ausgeblendeten Feld gespeichert. (Es wird zuerst als Abfragezeichenfolgenwert an die Seite übergeben.) Es gibt einen Html.ValidationSummary Aufruf, der Validierungsfehler anzeigt. In diesem Fall kann der Fehler sein, dass keine Film-ID an die Seite übergeben wurde oder dass die Film-ID ungültig ist. Diese Situation kann auftreten, wenn jemand diese Seite ausgeführt hat, ohne zuerst einen Film auf der Seite Filme auszuwählen.

Die Schaltfläche Untertitel ist Film löschen, und ihr Name-Attribut ist auf buttonDeletefestgelegt. Das name -Attribut wird im Code verwendet, um die Schaltfläche zu identifizieren, die das Formular übermittelt hat.

Sie müssen Code schreiben, um 1) die Filmdetails zu lesen, wenn die Seite zum ersten Mal angezeigt wird, und 2) den Film tatsächlich löschen, wenn der Benutzer auf die Schaltfläche klickt.

Hinzufügen von Code zum Lesen eines einzelnen Films

Fügen Sie oben auf der Seite DeleteMovie.cshtml den folgenden Codeblock hinzu:

@{
    var title = "";
    var genre = "";
    var year = "";
    var movieId = "";

    if(!IsPost){
        if(!Request.QueryString["ID"].IsEmpty() && Request.QueryString["ID"].IsInt()){
            movieId = Request.QueryString["ID"];
            var db = Database.Open("WebPagesMovies");
            var dbCommand = "SELECT * FROM Movies WHERE ID = @0";
            var row = db.QuerySingle(dbCommand, movieId);
            if(row != null) {
                title = row.Title;
                genre = row.Genre;
                year = row.Year;
            }
            else{
                Validation.AddFormError("No movie was found for that ID.");
            }
        }
        else{
            Validation.AddFormError("No movie was found for that ID.");
        }
    }
}

Dieses Markup ist identisch mit dem entsprechenden Code auf der Seite EditMovie . Es ruft die Film-ID aus der Abfragezeichenfolge ab und verwendet die ID, um einen Datensatz aus der Datenbank zu lesen. Der Code enthält den Validierungstest (IsInt() und row != null), um sicherzustellen, dass die an die Seite übergebene Film-ID gültig ist.

Beachten Sie, dass dieser Code nur bei der ersten Ausführung der Seite ausgeführt werden sollte. Sie möchten den Filmdatensatz nicht erneut aus der Datenbank lesen, wenn der Benutzer auf die Schaltfläche Film löschen klickt. Daher befindet sich der Code zum Lesen des Films in einem Test, der besagt if(!IsPost) , d. h. wenn es sich bei der Anforderung nicht um einen Postvorgang (Formularübermittlung) handelt.

Hinzufügen von Code zum Löschen des ausgewählten Films

Um den Film zu löschen, wenn der Benutzer auf die Schaltfläche klickt, fügen Sie den folgenden Code direkt innerhalb der schließenden Klammer des @ Blocks hinzu:

if(IsPost && !Request["buttonDelete"].IsEmpty()){
    movieId = Request.Form["movieId"];
    var db = Database.Open("WebPagesMovies");
    var deleteCommand = "DELETE FROM Movies WHERE ID = @0";
    db.Execute(deleteCommand, movieId);
    Response.Redirect("~/Movies");
}

Dieser Code ähnelt dem Code zum Aktualisieren eines vorhandenen Datensatzes, ist aber einfacher. Der Code führt im Grunde eine SQL-Anweisung Delete aus.

Wie auf der Seite EditMovie befindet sich der Code in einem if(IsPost) Block. Dieses Mal ist die if() Bedingung etwas komplizierter:

if(IsPost && !Request["buttonDelete"].IsEmpty())

Hier gibt es zwei Bedingungen. Die erste ist, dass die Seite übermittelt wird, wie Sie zuvor gesehen haben – if(IsPost).

Die zweite Bedingung ist !Request["buttonDelete"].IsEmpty(), was bedeutet, dass die Anforderung über ein Objekt namens verfügt buttonDelete. Zugegeben, es ist eine indirekte Methode, um zu testen, welche Schaltfläche das Formular übermittelt hat. Wenn ein Formular mehrere Sendeschaltflächen enthält, wird in der Anforderung nur der Name der Schaltfläche angezeigt, auf die geklickt wurde. Wenn also der Name einer bestimmten Schaltfläche in der Anforderung angezeigt wird – oder wie im Code angegeben, wenn diese Schaltfläche nicht leer ist – ist dies logischerweise die Schaltfläche, die das Formular übermittelt hat.

Der && Operator bedeutet "und" (logisches AND). Daher ist die gesamte if Bedingung ...

Bei dieser Anforderung handelt es sich um einen Beitrag (keine erstmalige Anforderung).

AND

DasbuttonDeletewar die Schaltfläche, die das Formular gesendet hat.

Dieses Formular (eigentlich diese Seite) enthält nur eine Schaltfläche, sodass der zusätzliche Test für buttonDelete technisch nicht erforderlich ist. Dennoch sind Sie dabei, einen Vorgang auszuführen, durch den Daten dauerhaft entfernt werden. Daher möchten Sie so sicher wie möglich sein, dass Sie den Vorgang nur ausführen, wenn der Benutzer ihn explizit angefordert hat. Angenommen, Sie haben diese Seite später erweitert und weitere Schaltflächen hinzugefügt. Selbst dann wird der Code, der den Film löscht, nur ausgeführt, wenn auf die buttonDelete Schaltfläche geklickt wurde.

Wie auf der Seite EditMovie erhalten Sie die ID aus dem ausgeblendeten Feld und führen dann den SQL-Befehl aus. Die Syntax für die Delete -Anweisung lautet:

DELETE FROM table WHERE ID = value

Es ist wichtig, die WHERE -Klausel und die ID einzuschließen. Wenn Sie die WHERE-Klausel weglassen, werden alle Datensätze in der Tabelle gelöscht. Wie Sie gesehen haben, übergeben Sie den ID-Wert mithilfe eines Platzhalters an den SQL-Befehl.

Testen des Filmlöschprozesses

Jetzt können Sie testen. Führen Sie die Seite Filme aus, und klicken Sie neben einem Film auf Löschen . Wenn die Seite DeleteMovie angezeigt wird, klicken Sie auf Film löschen.

Seite

Wenn Sie auf die Schaltfläche klicken, löscht der Code die Filme und kehrt zum Filmeintrag zurück. Dort können Sie nach dem gelöschten Film suchen und bestätigen, dass er gelöscht wurde.

Nächster Schritt

Im nächsten Tutorial erfahren Sie, wie Sie allen Seiten auf Ihrer Website ein gemeinsames Aussehen und Layout verleihen.

@{
    var db = Database.Open("WebPagesMovies") ;
    var selectCommand = "SELECT * FROM Movies";
    var searchTerm = "";

    if(!Request.QueryString["searchGenre"].IsEmpty() ) {
        selectCommand = "SELECT * FROM Movies WHERE Genre = @0";
        searchTerm = Request.QueryString["searchGenre"];
    }

    if(!Request.QueryString["searchTitle"].IsEmpty() ) {
      selectCommand = "SELECT * FROM Movies WHERE Title LIKE @0";
      searchTerm = "%" + Request.QueryString["searchTitle"] + "%";
    }

    var selectedData = db.Query(selectCommand, searchTerm);
    var grid = new WebGrid(source: selectedData, defaultSort: "Genre", rowsPerPage:3);
}
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>Movies</title>
      <style type="text/css">
        .grid { margin: 4px; border-collapse: collapse; width: 600px; }
        .grid th, .grid td { border: 1px solid #C0C0C0; padding: 5px; }
        .head { background-color: #E8E8E8; font-weight: bold; color: #FFF; }
        .alt { background-color: #E8E8E8; color: #000; }
      </style>
    </head>
    <body>
      <h1>Movies</h1>
      <form method="get">
        <div>
          <label for="searchGenre">Genre to look for:</label>
          <input type="text" name="searchGenre" value="@Request.QueryString["searchGenre"]" />
          <input type="Submit" value="Search Genre" /><br/>
          (Leave blank to list all movies.)<br/>
          </div>

        <div>
          <label for="SearchTitle">Movie title contains the following:</label>
          <input type="text" name="searchTitle" value="@Request.QueryString["searchTitle"]" />
          <input type="Submit" value="Search Title" /><br/>
        </div>

      </form>
        <div>
          @grid.GetHtml(
            tableStyle: "grid",
            headerStyle: "head",
            alternatingRowStyle: "alt",
            columns: grid.Columns(
                grid.Column(format: @<a href="~/EditMovie?id=@item.ID">Edit</a>),
                grid.Column("Title"),
                grid.Column("Genre"),
                grid.Column("Year"),
                grid.Column(format: @<a href="~/DeleteMovie?id=@item.ID">Delete</a>)
            )
        )
      </div>
      <p>
        <a href="~/AddMovie">Add a movie</a>
      </p>
    </body>
</html>

Vollständige Auflistung für DeleteMovie-Seite

@{
    var title = "";
    var genre = "";
    var year = "";
    var movieId = "";

    if(!IsPost){
        if(!Request.QueryString["ID"].IsEmpty() && Request.QueryString["ID"].IsInt()){
            movieId = Request.QueryString["ID"];
            var db = Database.Open("WebPagesMovies");
            var dbCommand = "SELECT * FROM Movies WHERE ID = @0";
            var row = db.QuerySingle(dbCommand, movieId);
            if(row != null) {
                title = row.Title;
                genre = row.Genre;
                year = row.Year;
            }
            else{
                Validation.AddFormError("No movie was found for that ID.");
            }
        }
        else{
            Validation.AddFormError("No movie was found for that ID.");
        }
    }

    if(IsPost && !Request["buttonDelete"].IsEmpty()){
        movieId = Request.Form["movieId"];
        var db = Database.Open("WebPagesMovies");
        var deleteCommand = "DELETE FROM Movies WHERE ID = @0";
        db.Execute(deleteCommand, movieId);
        Response.Redirect("~/Movies");
    }
}
<html>
<head>
  <title>Delete a Movie</title>
</head>
<body>
      <h1>Delete a Movie</h1>
        @Html.ValidationSummary()
      <p><a href="~/Movies">Return to movie listing</a></p>

      <form method="post">
        <fieldset>
        <legend>Movie Information</legend>

        <p><span>Title:</span>
         <span>@title</span></p>

        <p><span>Genre:</span>
         <span>@genre</span></p>

        <p><span>Year:</span>
          <span>@year</span></p>

        <input type="hidden" name="movieid" value="@movieId" />
        <p><input type="submit" name="buttonDelete" value="Delete Movie" /></p>
        </fieldset>
        <p><a href="~/Movies">Return to movie listing</a></p>
      </form>
    </body>
</html>

Zusätzliche Ressourcen