ASP.NET Web Sayfalarına Giriş - Veritabanı Verilerini Silme

yazan: Tom FitzMacken

Bu öğreticide tek bir veritabanı girişini silme işlemi gösterilmektedir. Seriyi ASP.NET Web Sayfalarında Veritabanı Verilerini Güncelleştirme yoluyla tamamladığınız varsayılır.

Öğrenecekleriniz:

  • Kayıt listesinden tek bir kayıt seçme.
  • Veritabanından tek bir kaydı silme.
  • Formda belirli bir düğmeye tıklandığını denetleme.

Ele alınan özellikler/teknolojiler:

  • Yardımcı WebGrid .
  • SQL Delete komutu.
  • Database.Execute SQL Delete komutunu çalıştırma yöntemi.

Oluşturacakların

Önceki öğreticide, var olan bir veritabanı kaydını güncelleştirmeyi öğrendinsiniz. Bu öğretici benzerdir, ancak kaydı güncelleştirmek yerine silebilirsiniz. Silme işleminin daha basit olması dışında işlemler çok aynıdır, bu nedenle bu öğretici kısa olacaktır.

Filmler sayfasında, yardımcıyı WebGrid daha önce eklediğiniz Düzenle bağlantısına eşlik edecek şekilde her filmin yanında bir Sil bağlantısı görüntüleyebilecek şekilde güncelleştireceksiniz.

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

Düzenlemede olduğu gibi , Sil bağlantısına tıkladığınızda, sizi film bilgilerinin zaten formda olduğu farklı bir sayfaya götürür:

Bir filmin görüntülendiği Filmi Sil sayfası

Ardından, kaydı kalıcı olarak silmek için düğmeye tıklayabilirsiniz.

İlk olarak yardımcıya WebGrid bir Sil bağlantısı ekleyeceksiniz. Bu bağlantı, önceki öğreticide eklediğiniz Düzenle bağlantısına benzer.

Movies.cshtml dosyasını açın.

WebGrid Sütun ekleyerek sayfanın gövdesindeki işaretlemeyi değiştirin. Değiştirilen işaretleme şu şekildedir:

@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 şu sütundur:

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

Kılavuzun yapılandırılma şekli, Kılavuzun en solunda Düzenle sütunu ve en sağdaki Delete sütunudur. (Bunu fark etmediyseniz, sütundan Year sonra şimdi bir virgül var.) Bu bağlantı sütunlarının nereye gittiği konusunda özel bir şey yoktur ve bunları kolayca yan yana koyabilirsiniz. Bu durumda, karışmalarını zorlaştırmak için ayrıdırlar.

Yan yana olmadıklarını göstermek için Düzenle ve Ayrıntılar bağlantılarının işaretlenmiş olduğu Filmler sayfası

Yeni sütunda, metninde "Sil" yazan bir bağlantı (<a> öğe) gösterilir. Bağlantının hedefi ( href özniteliği), sonunda bu URL'ye benzer bir url'ye çözümleyen ve her film için farklı bir değere id sahip olan koddur:

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

Bu bağlantı DeleteMovie adlı bir sayfayı çağırır ve seçtiğiniz filmin kimliğini geçirir.

Bu öğretici, önceki öğreticideki Düzenle bağlantısıyla neredeyse aynı olduğundan (ASP.NET Web Sayfalarında Veritabanı Verilerini Güncelleştirme) bu bağlantının nasıl derlendiği hakkında ayrıntılı bilgi vermez.

Silme Sayfası Oluşturma

Artık kılavuzdaki Sil bağlantısının hedefi olacak sayfayı oluşturabilirsiniz.

Not

Önemli Önce silinecek kaydı seçme ve ardından işlemi onaylamak için ayrı bir sayfa ve düğme kullanma tekniği güvenlik açısından son derece önemlidir. Önceki öğreticilerde okuduğunuz gibi, web sitenizde herhangi bir değişiklik yapmak her zaman bir form kullanılarak, yani HTTP POST işlemi kullanılarak yapılmalıdır. Yalnızca bir bağlantıya tıklayarak (yani GET işlemi kullanarak) siteyi değiştirmeyi mümkün hale getirdiyseniz, kullanıcılar sitenize basit isteklerde bulunabilir ve verilerinizi silebilir. Sitenizi dizine alan bir arama motoru gezgini bile, yalnızca bağlantıları izleyerek yanlışlıkla verileri silebilir.

Uygulamanız kişilerin bir kaydı değiştirmesine izin veriyorsa, kaydı kullanıcıya düzenleme amacıyla sunmanız gerekir. Ancak bir kaydı silmek için bu adımı atlayabilirsiniz. Yine de bu adımı atlamayın. (Kullanıcıların kaydı görmesi ve hedefledikleri kaydı sildiğini onaylaması da yararlıdır.)

Sonraki bir öğretici kümesinde, kullanıcının bir kaydı silmeden önce oturum açması gerekmesi için oturum açma işlevselliğinin nasıl ekleneceğini göreceksiniz.

DeleteMovie.cshtml adlı bir sayfa oluşturun ve dosyadaki içeriği aşağıdaki işaretlemeyle değiştirin:

<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 işaretleme EditMovie sayfalarına benzer, ancak metin kutularını ()<input type="text"> kullanmak yerine işaretleme öğeleri içerir <span> . Burada düzenleyebileceğiniz hiçbir şey yok. Tek yapmanız gereken, kullanıcıların doğru filmi sildiğinden emin olmaları için film ayrıntılarını görüntülemektir.

İşaretlemeyi zaten kullanıcının film listesi sayfasına geri dönmesini sağlayan bir bağlantı içeriyor.

EditMovie sayfasında olduğu gibi, seçili filmin kimliği gizli bir alanda depolanır. (İlk etapta sayfaya sorgu dizesi değeri olarak geçirilir.) Doğrulama hatalarını görüntüleyen bir Html.ValidationSummary çağrı vardır. Bu durumda hata, sayfaya film kimliği geçirilmemiş veya film kimliği geçersiz olabilir. Bu durum, birisi bu sayfayı Önce Filmler sayfasından film seçmeden çalıştırdıysa ortaya çıkabilir.

düğme başlık Filmi Sil'dir ve ad özniteliği olarak buttonDeleteayarlanır. name Özniteliği, formu gönderen düğmeyi tanımlamak için kodda kullanılır.

1'e kod yazmanız gerekir) sayfa ilk görüntülendiğinde film ayrıntılarını okumanız ve 2) kullanıcı düğmeye tıkladığında filmi gerçekten silmeniz gerekir.

Tek Bir Filmi Okumak için Kod Ekleme

DeleteMovie.cshtml sayfasının en üstüne aşağıdaki kod bloğunu ekleyin:

@{
    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 işaretleme, EditMovie sayfasındaki ilgili kodla aynıdır. Sorgu dizesinden film kimliğini alır ve veritabanındaki bir kaydı okumak için kimliği kullanır. Kod, sayfaya geçirilen film kimliğinin geçerli olduğundan emin olmak için doğrulama testini (IsInt() ve row != null) içerir.

Bu kodun yalnızca sayfa ilk kez çalıştırıldığında çalıştırılması gerektiğini unutmayın. Kullanıcı Filmi Sil düğmesine tıkladığında, film kaydını veritabanından yeniden okumak istemezsiniz. Bu nedenle, filmi okuma kodu, isteğin bir gönderme işlemi (form gönderimi) olmadığı bir testin içindedir.if(!IsPost)

Seçili Filmi Silmek için Kod Ekleme

Kullanıcı düğmeye tıkladığında filmi silmek için bloğun kapanış ayracı @ içine aşağıdaki kodu ekleyin:

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ı güncelleştirme koduna benzer, ancak daha basittir. Kod temelde bir SQL Delete deyimi çalıştırır.

EditMovie sayfasında olduğu gibi kod bir if(IsPost) bloktadır. Bu kez, if() koşul biraz daha karmaşıktır:

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

Burada iki koşul var. Birincisi, daha önce gördüğünüz gibi sayfanın gönderiliyor olmasıdır— if(IsPost).

İkinci koşul olan !Request["buttonDelete"].IsEmpty(), isteğin adlı buttonDeletebir nesnesine sahip olduğu anlamına gelir. Kuşkusuz bu, formu hangi düğmenin gönderdiğini test etmenin dolaylı bir yoludur. Formda birden çok gönderme düğmesi varsa, istekte yalnızca tıklanan düğmenin adı görüntülenir. Bu nedenle, mantıksal olarak, istekte belirli bir düğmenin adı görünüyorsa (veya kodda belirtildiği gibi, bu düğme boş değilse) formu gönderen düğmedir.

&& işleci "ve" (mantıksal AND) anlamına gelir. Bu nedenle tüm if koşul ...

Bu istek bir gönderidir (ilk kez yapılan bir istek değildir)

AND

buttonDeletedüğmesi, formu gönderen düğmeydi.

Bu form (aslında, bu sayfa) yalnızca bir düğme içerdiğinden buttonDelete ek test teknik olarak gerekli değildir. Yine de verileri kalıcı olarak kaldıracak bir işlem gerçekleştirmek üzeresiniz. Bu nedenle, işlemi yalnızca kullanıcı açıkça istediği zaman gerçekleştirdiğinizden mümkün olduğunca emin olmak istiyorsunuz. Örneğin, bu sayfayı daha sonra genişletip başka düğmeler eklediğinizi varsayalım. O zaman bile, filmi silen kod yalnızca düğmeye buttonDelete tıklandıysa çalışır.

EditMovie sayfasında olduğu gibi, gizli alandan kimliği alır ve SQL komutunu çalıştırırsınız. deyiminin Delete söz dizimi şu şekildedir:

DELETE FROM table WHERE ID = value

Yan tümcesini WHERE ve kimliğini dahil etmek çok önemlidir. WHERE yan tümcesini dışarıda bırakırsanız tablodaki tüm kayıtlar silinir. Gördüğünüz gibi, bir yer tutucu kullanarak KIMLIK değerini SQL komutuna geçirirsiniz.

Film Silme İşlemini Test Etme

Artık test edebilirsiniz. Filmler sayfasını çalıştırın ve bir filmin yanındaki Sil'e tıklayın. DeleteMovie sayfası görüntülendiğinde Filmi Sil'e tıklayın.

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

Düğmeye tıkladığınızda kod filmleri siler ve film listesine döner. Burada silinen filmi arayabilir ve silindiğini onaylayabilirsiniz.

Sırada Geliyor

Sonraki öğreticide, sitenizdeki tüm sayfalara ortak bir görünüm ve düzen verme gösterilmektedir.

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

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