Freigeben über


Einführung in ASP.NET Webseiten – Löschen von Datenbankdaten

von Tom FitzMacken

In diesem Lernprogramm erfahren Sie, wie Sie einen einzelnen Datenbankeintrag löschen. Es wird davon ausgegangen, dass Sie die Datenreihe über das Aktualisieren von Datenbankdaten in ASP.NET Webseiten abgeschlossen haben.

Sie lernen Folgendes:

  • Auswählen eines einzelnen Datensatzes aus einer Auflistung von Datensätzen
  • Löschen eines einzelnen Datensatzes aus einer Datenbank
  • So überprüfen Sie, ob auf eine bestimmte Schaltfläche in einem Formular geklickt wurde.

Behandelte Features/Technologien:

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

Sie lernen Folgendes

Im vorherigen Lernprogramm haben Sie gelernt, wie Sie einen vorhandenen Datenbankdatensatz aktualisieren. Dieses Lernprogramm ist ähnlich, mit der Ausnahme, dass Sie ihn löschen, anstatt den Datensatz zu aktualisieren. Die Prozesse sind viel gleich, mit der Ausnahme, dass das Löschen einfacher ist, daher ist dieses Lernprogramm kurz.

Auf der Seite "Filme " aktualisieren Sie das WebGrid Hilfsprogramm so, dass neben jedem Film ein Link zum Löschen angezeigt wird, um den zuvor hinzugefügten Link "Bearbeiten" zu begleiten.

Seite

Wie beim Bearbeiten gelangen Sie, wenn Sie auf den Link "Löschen " klicken, zu einer anderen Seite, auf der sich die Filminformationen bereits in einem Formular befinden:

Filmseite löschen, in der ein Film angezeigt wird

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

Sie beginnen mit dem WebGrid Hinzufügen eines Delete-Links zum Hilfsprogramm. Dieser Link ähnelt dem Link "Bearbeiten", den Sie in einem vorherigen Lernprogramm 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>)

Wie das Raster konfiguriert ist, befindet sich die Spalte "Bearbeiten" ganz links im Raster, und die Spalte "Löschen " ist ganz rechts. (Es gibt jetzt ein Komma nach der Year Spalte, falls Sie das nicht bemerkt haben.) Es gibt nichts Besonderes darüber, wo sich diese Linkspalten befinden, und Sie können sie ganz einfach nebeneinander platzieren. In diesem Fall sind sie getrennt, um sie schwieriger zu machen, gemischt zu werden.

Seite

In der neuen Spalte wird ein Link (<a> Element) angezeigt, dessen Text "Löschen" lautet. Das Ziel des Links (sein href Attribut) ist Code, der letztendlich in etwa diese URL aufgelöst wird, wobei der Wert für jeden id Film unterschiedlich ist:

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

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

In diesem Lernprogramm wird nicht ausführlich erläutert, wie dieser Link erstellt wird, da er fast identisch mit dem Link "Bearbeiten" aus dem vorherigen Lernprogramm ist (Aktualisieren von Datenbankdaten in ASP.NET Webseiten).

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 der ersten Auswahl eines zu löschenden Datensatzes und dann die Verwendung einer separaten Seite und Schaltfläche, um zu bestätigen, dass der Prozess für die Sicherheit äußerst wichtig ist. Wie Sie in früheren Lernprogrammen gelesen haben, sollte jede Art von Änderung an Ihrer Website immer mithilfe eines Formulars erfolgen, d. h. mit einem HTTP POST-Vorgang. Wenn Sie die Website nur durch Klicken auf einen Link (d. h. mithilfe eines GET-Vorgangs) ändern konnten, können Personen einfache Anforderungen an Ihre Website stellen und Ihre Daten löschen. Selbst ein Suchmaschinencrawler, der Ihre Website indiziert, könnte versehentlich Daten löschen, indem Sie links folgen.

Wenn Ihre App personen das Ändern eines Datensatzes ermöglicht, müssen Sie den Datensatz trotzdem dem Benutzer zur Bearbeitung präsentieren. Sie können jedoch versucht sein, 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 er den gewünschten Datensatz löscht.)

In einem nachfolgenden Lernprogramm wird gezeigt, wie Sie Anmeldefunktionen hinzufügen, damit sich ein Benutzer anmelden muss, bevor er einen Datensatz löscht.

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 anstelle von Textfeldern (<input type="text">) das Markup Elemente enthält <span> . Hier gibt es 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 Filmauflistungsseite zurückkehren kann.

Wie auf der Seite "EditMovie " wird die ID des ausgewählten Films in einem ausgeblendeten Feld gespeichert. (Sie wird an die Seite an erster Stelle als Abfragezeichenfolgenwert übergeben.) Es gibt einen Html.ValidationSummary Aufruf, der Überprüfungsfehler 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ächenbeschriftung ist "Film löschen", und das Name-Attribut ist auf " buttonDelete. Das name Attribut wird im Code verwendet, um die Schaltfläche zu identifizieren, die das Formular übermittelt hat.

Sie müssen Code in 1 schreiben) die Filmdetails lesen, wenn die Seite zuerst 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 EditMovie-Seite . Sie ruft die Film-ID aus der Abfragezeichenfolge ab und verwendet die ID zum Lesen eines Datensatzes aus der Datenbank. Der Code enthält den Überprüfungstest (IsInt() und row != null) um sicherzustellen, dass die Film-ID, die an die Seite übergeben wird, gültig ist.

Denken Sie daran, dass dieser Code nur ausgeführt werden soll, wenn die Seite zum ersten Mal ausgeführt wird. 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 die Anforderung kein Postvorgang (Formularübermittlung) ist.

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 in 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, aber einfacher. Der Code führt im Grunde eine SQL-Anweisung Delete aus.

Wie auf der EditMovie-Seite 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 es zuvor gesehen haben – if(IsPost).

Die zweite Bedingung lautet !Request["buttonDelete"].IsEmpty(), d. h., die Anforderung hat ein Objekt mit dem Namen buttonDelete. Zugegeben, es ist eine indirekte Möglichkeit, zu testen, welche Schaltfläche das Formular übermittelt hat. Wenn ein Formular mehrere Schaltflächen zum Senden enthält, wird nur der Name der Schaltfläche, auf die geklickt wurde, in der Anforderung angezeigt. Wenn der Name einer bestimmten Schaltfläche daher logisch in der Anforderung angezeigt wird – oder wie im Code angegeben – wenn diese Schaltfläche nicht leer ist – ist dies die Schaltfläche, die das Formular übermittelt hat.

Der && Operator bedeutet "und" (logischeS UND). Daher ist die gesamte if Bedingung ...

Diese Anforderung ist ein Beitrag (keine erstmalige Anforderung)

AND

Die buttonDeleteSchaltfläche war die Schaltfläche, die das Formular übermittelt hat.

Dieses Formular (in der Tat diese Seite) enthält nur eine Schaltfläche, sodass der zusätzliche Test technisch buttonDelete nicht erforderlich ist. Dennoch sind Sie dabei, einen Vorgang auszuführen, der Daten dauerhaft entfernt. Sie möchten also 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 EditMovie-Seite erhalten Sie die ID aus dem ausgeblendeten Feld, und führen Sie 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 auslassen, 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öschvorgangs

Jetzt können Sie testen. Führen Sie die Seite "Filme" aus, und klicken Sie auf " Löschen " neben einem Film. Wenn die DeleteMovie-Seite 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 Lernprogramm 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>

Weitere Ressourcen