ASP.NET Web sayfalarına giriş-veritabanı verilerini silmeIntroducing ASP.NET Web Pages - Deleting Database Data

Tom FitzMacken tarafındanby Tom FitzMacken

Bu öğreticide, tek bir veritabanı girişinin nasıl silineceği gösterilir.This tutorial shows you how to delete an individual database entry. ASP.NET Web sayfalarındaki veritabanı verilerini güncelleştirerekseriyi tamamladığınız varsayılır.It assumes you have completed the series through Updating Database Data in ASP.NET Web Pages.

Öğrenecekleriniz:What you'll learn:

  • Kayıt listesinden tek bir kayıt seçme.How to select an individual record from a listing of records.
  • Veritabanından tek bir kaydı silme.How to delete a single record from a database.
  • Bir formda belirli bir düğmenin tıklandığını denetleme.How to check that a specific button was clicked in a form.

Ele alınan özellikler/teknolojiler:Features/technologies discussed:

  • WebGrid Yardımcısı.The WebGrid helper.
  • SQL Delete komutu.The SQL Delete command.
  • Bir SQL Delete komutu çalıştırmak için Database.Execute yöntemi.The Database.Execute method to run a SQL Delete command.

Ne oluşturacağız?What You'll Build

Önceki öğreticide, var olan bir veritabanı kaydını güncelleştirmeyi öğrendiniz.In the previous tutorial, you learned how to update an existing database record. Bu öğretici benzerdir, çünkü kaydı güncelleştirmek yerine onu silersiniz.This tutorial is similar, except that instead of updating the record, you'll delete it. Süreçler çok daha basit olduğundan, bu öğretici bu öğreticiyi bir hale getirir.The processes are much the same, except that deleting is simpler, so this tutorial will be short.

Filmler sayfasında, daha önce eklediğiniz düzenleme bağlantısına eşlik etmek için WebGrid yardımcısını her filmin yanında bir silme bağlantısı görüntüleyecek şekilde güncelleştireceksiniz.In the Movies page, you'll update the WebGrid helper so that it displays a Delete link next to each movie to accompany the Edit link you added earlier.

Her film için silme bağlantısı gösteren filmler sayfası

Düzenlemede olduğu gibi, Sil bağlantısına tıkladığınızda, sizi film bilgisinin zaten bir biçimde olduğu farklı bir sayfaya götürür:As with editing, when you click the Delete link, it takes you to a different page, where the movie information is already in a form:

Bir film görüntülenirken film sayfasını Sil

Ardından, kaydı kalıcı olarak silmek için düğmeye tıklayabilirsiniz.You can then click the button to delete the record permanently.

WebGrid Yardımcısı 'na silme bağlantısı ekleyerek başlayacaksınız.You'll start by adding a Delete link to the WebGrid helper. Bu bağlantı, önceki bir öğreticide eklediğiniz düzenleme bağlantısına benzer.This link is similar to the Edit link you added in a previous tutorial.

Filmler. cshtml dosyasını açın.Open the Movies.cshtml file.

Sütun ekleyerek sayfanın gövdesindeki WebGrid işaretlemesini değiştirin.Change the WebGrid markup in the body of the page by adding a column. Değiştirilen biçimlendirme şu şekildedir:Here's the modified 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>)
    )
)

Yeni sütun budur:The new column is this one:

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

Kılavuzun yapılandırıldığı şekilde, düzenleme sütunu kılavuzda en solda, silme sütunu ise en sağdaki bir yöntemdir.The way the grid is configured, the Edit column is leftmost in the grid and the Delete column is rightmost. (Bunu fark etmediğiniz durumlarda Year sütundan sonra bir virgül vardır.) Bu bağlantı sütunlarının nereye gittiğine ilişkin hiçbir şey yoktur ve bunların yanına kolayca yerleştirebilirsiniz.(There's a comma after the Year column now, in case you didn't notice that.) There's nothing special about where these link columns go, and you could as easily put them next to each other. Bu durumda, karışık bir şekilde yararlanmak daha zor hale getirmek için ayrıdır.In this case, they're separate to make them harder to get mixed up.

Düzenleme ve ayrıntı bağlantıları içeren filmler sayfası, birbirini ileri bir yanından gösterme

Yeni sütun, metni "Sil" ifadesini içeren bir bağlantıyı (<a> öğesi) gösterir.The new column shows a link (<a> element) whose text says "Delete". Bağlantının hedefi (href özniteliği), son olarak, her film için id değeri farklı olan bu URL gibi bir şekilde çözümlenen koddur:The target of the link (its href attribute) is code that ultimately resolves to something like this URL, with the id value different for each movie:

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

Bu bağlantı, deletefilm adlı bir sayfayı çağırır ve SEÇTIĞINIZ filmin kimliğini iletmeyecektir.This link will invoke a page named DeleteMovie and pass it the ID of the movie you've selected.

Bu öğretici, önceki öğreticideki düzenleme bağlantısı ile neredeyse özdeş olduğundan (ASP.NET Web sayfalarındaki veritabanı verilerini güncelleştirme) Bu bağlantının nasıl oluşturulduğu hakkında ayrıntı vermez.This tutorial won't go into detail about how this link is constructed, because it's almost identical to the Edit link from the previous tutorial (Updating Database Data in ASP.NET Web Pages).

Silme sayfası oluşturmaCreating the Delete Page

Artık kılavuzdaki Delete bağlantısının hedefi olacak sayfayı oluşturabilirsiniz.Now you can create the page that will be the target for the Delete link in the grid.

Note

Önemli İlk olarak silmek için bir kayıt seçme ve sonra ayrı bir sayfa ve düğme kullanarak işlemin güvenlik açısından çok önemli olduğunu belirleme tekniği.Important The technique of first selecting a record to delete and then using a separate page and button to confirm the process is extremely important for security. Önceki öğreticilerde okuduğunuzdan, Web sitenizde herhangi bir değişiklik yapmak her zaman bir HTTP POST işlemi kullanılarak — bir form kullanılarak yapılmalıdır.As you've read in previous tutorials, making any sort of change to your website should always be done using a form — that is, using an HTTP POST operation. Yalnızca bir bağlantıya tıklayarak (yani, bir GET işlemi kullanarak) siteyi değiştirmeyi mümkün kıldıysanız, kişiler sitenize basit istekler yapabilir ve verilerinizi silebilir.If you made it possible to change the site just by clicking a link (that is, using a GET operation), people could make simple requests to your site and delete your data. Sitenizi dizine alan bir arama motoru Gezgini bile, verileri yanlışlıkla izleyen bağlantıları yanlışlıkla silebilir.Even a search-engine crawler that's indexing your site could inadvertently delete data just by following links.

Uygulamanız kişilerin bir kaydı değiştirmesine izin veriyorsun, kaydı kullanıcıya yine de düzenlemeniz gerekir.When your app lets people change a record, you have to present the record to the user for editing anyway. Ancak bir kaydı silmek için bu adımı atlamayı düşünebilirsiniz.But you might be tempted to skip this step for deleting a record. Bu adımı atlayın, ancak.Don't skip that step, though. (Kullanıcıların kaydı görmesini ve hedeflediğiniz kaydı sildiklerini onaylamasını de yararlı olur.)(It's also helpful for users to see the record and confirm that they're deleting the record that they intended.)

Sonraki bir öğretici kümesinde, kullanıcının bir kaydı silmeden önce oturum açması için oturum açma işlevselliği ekleme hakkında bilgi edineceksiniz.In a subsequent tutorial set, you'll see how to add login functionality so a user would have to log in before deleting a record.

Deletemovie. cshtml adlı bir sayfa oluşturun ve dosyadaki nelerin aşağıdaki biçimlendirmeyle değiştirin:Create a page named DeleteMovie.cshtml and replace what's in the file with the following 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>

Bu biçimlendirme Editmovie sayfaları gibi olduğundan, metin kutuları (<input type="text">) kullanmak yerine, biçimlendirme <span> öğelerini içerir.This markup is like the EditMovie pages, except that instead of using text boxes (<input type="text">), the markup includes <span> elements. Burada düzenlemek için bir şey yoktur.There's nothing here to edit. Tüm yapmanız gereken, kullanıcıların doğru filmi sildiklerinden emin olmak için film ayrıntılarını görüntüleriz.All you have to do is display the movie details so that users can make sure that they're deleting the right movie.

Biçimlendirme zaten kullanıcının film listesi sayfasına dönüşmesine izin veren bir bağlantı içeriyor.The markup already contains a link that lets the user return to the movie listing page.

Editmovie sayfasında, SEÇILI filmin kimliği gizli bir alanda saklanır.As in the EditMovie page, the ID of the selected movie is stored in a hidden field. (Bu, ilk yerde bir sorgu dizesi değeri olarak sayfaya geçirilir.) Doğrulama hatalarını görüntüleyen bir Html.ValidationSummary çağrısı vardır.(It's passed into the page in the first place as a query string value.) There's an Html.ValidationSummary call that will display validation errors. Bu durumda hata, sayfaya hiçbir film KIMLIĞI geçirilmemişse veya film KIMLIĞI geçersiz olabilir.In this case, the error might be that no movie ID was passed to the page or that the movie ID is invalid. Bu durum, birisi önce filmler sayfasında bir filmi seçmeden bu sayfayı çalıştırmışsa meydana gelebilir.This situation could occur if someone ran this page without first selecting a movie in the Movies page.

Düğme başlığı filmi silerve ad özniteliği buttonDeleteolarak ayarlanır.The button caption is Delete Movie, and its name attribute is set to buttonDelete. name özniteliği, formu gönderen düğmeyi tanımlamak için kodda kullanılacaktır.The name attribute will be used in the code to identify the button that submitted the form.

1 ' e kod yazmanız gerekir) sayfa ilk görüntülendiğinde film ayrıntılarını okumak ve 2) aslında Kullanıcı düğmeye tıkladığında filmi silmeniz gerekir.You'll have to write code to 1) read the movie details when the page is first displayed and 2) actually delete the movie when the user clicks the button.

Tek bir filmi okumak için kod eklemeAdding Code to Read a Single Movie

Deletemovie. cshtml sayfasının en üstünde aşağıdaki kod bloğunu ekleyin:At the top of the DeleteMovie.cshtml page, add the following code block:

@{
    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.");
        }
    }
}

Bu biçimlendirme, Editmovie sayfasındaki karşılık gelen kodla aynıdır.This markup is the same as the corresponding code in the EditMovie page. Film KIMLIĞINI sorgu dizesinden alır ve veritabanından bir kaydı okumak için KIMLIĞI kullanır.It gets the movie ID out of the query string and uses the ID to read a record from the database. Kod, sayfaya geçirilen film KIMLIĞININ geçerli olduğundan emin olmak için doğrulama testini (IsInt() ve row != null) içerir.The code includes the validation test (IsInt() and row != null) to make sure that the movie ID being passed to the page is valid.

Bu kodun yalnızca sayfa ilk kez çalıştığında çalışacağını unutmayın.Remember that this code should only run the first time the page runs. Kullanıcı filmi Sil düğmesine tıkladığında film kaydını veritabanından yeniden okumak istemezsiniz.You don't want to re-read the movie record from the database when the user clicks the Delete Movie button. Bu nedenle, filmi okuma kodu, istek bir POST işlemi değilse (form gönderimi) if(!IsPost) — belirten bir test içindedir.Therefore, code to read the movie is inside a test that says if(!IsPost) — that is, if the request is not a post operation (form submission).

Seçili filmi silmek için kod eklemeAdding Code to Delete the Selected Movie

Kullanıcı düğmeye tıkladığında filmi silmek için, @ bloğunun kapanış ayracın içine aşağıdaki kodu ekleyin:To delete the movie when the user clicks the button, add the following code just inside the closing brace of the @ block:

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");
}

Bu kod, var olan bir kaydın güncelleştirilmesine yönelik koda benzerdir, ancak daha basittir.This code is similar to the code for updating an existing record, but simpler. Kod temelde bir SQL Delete ifadesini çalıştırır.The code basically runs a SQL Delete statement.

Editmovie sayfasında olduğu gibi, kod if(IsPost) bloğudur.As in the EditMovie page, the code is in an if(IsPost) block. Bu kez if() koşulu biraz daha karmaşıktır:This time, the if() condition is a little more complicated:

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

Burada iki koşul vardır.There are two conditions here. Birincisi, — if(IsPost)önce gördüğünüz gibi sayfanın gönderilme sayfasıdır.The first is that the page is being submitted, as you've seen before — if(IsPost).

İkinci koşul !Request["buttonDelete"].IsEmpty(), isteğin buttonDeleteadlı bir nesneye sahip olduğu anlamına gelir.The second condition is !Request["buttonDelete"].IsEmpty(), meaning that the request has an object named buttonDelete. Admitetki, formu hangi düğmenin gönderdiğine yönelik dolaylı bir yoldur.Admittedly, it's an indirect way of testing which button submitted the form. Form birden çok Gönder düğmesi içeriyorsa, istekte yalnızca tıklanan düğmenin adı görüntülenir.If a form contains multiple submit buttons, only the name of the button that was clicked appears in the request. Bu nedenle, mantıksal olarak, belirli bir düğmenin adı istek — veya kodda belirtilen şekilde görünüyorsa, bu düğme boş değilse formu gönderen düğmedir —.Therefore, logically, if the name of a particular button appears in the request — or as stated in the code, if that button isn't empty — that's the button that submitted the form.

&& işleci "and" (Logical ve) anlamına gelir.The && operator means "and" (logical AND). Bu nedenle if koşulu tamamen...Therefore the entire if condition is ...

Bu istek bir gönderi (ilk kez istek değil)This request is a post (not a first-time request)

ANDAND

buttonDelete düğmesi formu gönderen düğmedir.The buttonDeletebutton was the button that submitted the form.

Bu form (Aslında, Bu sayfa) yalnızca bir düğme içerir, bu nedenle buttonDelete ek testi Teknik olarak gerekli değildir.This form (in fact, this page) contains only one button, so the additional test for buttonDelete is technically not required. Hala, verileri kalıcı olarak kaldıracak bir işlem gerçekleştirmeye çalışıyoruz.Still, you're about to perform an operation that will permanently remove data. Bu nedenle, işlemi yalnızca kullanıcı açıkça talep edildiğinde gerçekleştirdiğinizden emin olmak isteyebilirsiniz.So you want to be as sure as possible that you're performing the operation only when the user has explicitly requested it. Örneğin, bu sayfayı daha sonra genişletdiğinizi ve diğer düğmeleri daha sonra eklediğinizi varsayalım.For example, suppose that you expanded this page later and added other buttons to it. Daha sonra bile, filmi silen kod yalnızca buttonDelete düğmesi tıklandıysa çalışacaktır.Even then, the code that deletes the movie will run only if the buttonDelete button was clicked.

Editmovie sayfasında, gızlı alandan kimliği alır ve sonra SQL komutunu çalıştırırsınız.As in the EditMovie page, you get the ID from the hidden field and then run the SQL command. Delete deyimin sözdizimi şöyledir:The syntax for the Delete statement is:

DELETE FROM table WHERE ID = value

WHERE yan tümcesini ve KIMLIĞINI eklemek çok önemlidir.It's vital to include the WHERE clause and the ID. WHERE yan tümcesini bıraktığınızda, tablodaki tüm kayıtlar silinir.If you leave out the WHERE clause, all the records in the table will be deleted. Gördüğünüz gibi, bir yer tutucu kullanarak KIMLIK değerini SQL komutuna geçirirsiniz.As you have seen, you pass the ID value to the SQL command by using a placeholder.

Film silme Işlemini test etmeTesting the Movie Delete Process

Artık test edebilirsiniz.Now you can test. Filmler sayfasını çalıştırın ve filmin yanındaki Sil ' e tıklayın.Run the Movies page, and click Delete next to a movie. Deletemovie sayfası göründüğünde filmi Sil' e tıklayın.When the DeleteMovie page appears, click Delete Movie.

Filmi Sil düğmesinin vurgulandığı film sayfasını Sil

Düğmeye tıkladığınızda, kod filmleri siler ve film listesine geri döner.When you click the button, the code deletes the movies and returns to the movie listing. Silinen filmi arayabilir ve silindiğini doğrulayabilirsiniz.There you can search for the deleted movie and confirm that it's been deleted.

Sonraki adımdaComing Up Next

Sonraki öğreticide, sitenizdeki tüm sayfalara ortak bir görünüm ve düzen verme konusu gösterilmektedir.The next tutorial shows you how to give all the pages on your site a common look and layout.

@{
    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>

DeleteMovie sayfası için komple listeComplete Listing for DeleteMovie Page

@{
    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>

Ek KaynaklarAdditional Resources