ASP.NET Web sayfalarına giriş-veritabanı verilerini silme

Tom FitzMacken tarafından

Bu öğreticide, tek bir veritabanı girişinin nasıl silineceği gösterilir. ASP.NET Web sayfalarındaki veritabanı verilerini güncelleştirerekseriyi tamamladığınız varsayılır.

Öğrenecekleriniz:

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

Ele alınan özellikler/teknolojiler:

  • WebGrid Yardımcısı.
  • SQL Delete komutu.
  • Bir SQL Delete komutu çalıştırmak için Database.Execute yöntemi.

Ne oluşturacağız?

Önceki öğreticide, var olan bir veritabanı kaydını güncelleştirmeyi öğrendiniz. Bu öğretici benzerdir, çünkü kaydı güncelleştirmek yerine onu silersiniz. Süreçler çok daha basit olduğundan, bu öğretici bu öğreticiyi bir hale getirir.

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.

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:

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

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

WebGrid Yardımcısı 'na silme bağlantısı ekleyerek başlayacaksınız. Bu bağlantı, önceki bir öğreticide eklediğiniz düzenleme bağlantısına benzer.

Filmler. cshtml dosyasını açın.

Sütun ekleyerek sayfanın gövdesindeki WebGrid işaretlemesini değiştirin. Değiştirilen biçimlendirme ş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 budur:

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. (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. Bu durumda, karışık bir şekilde yararlanmak daha zor hale getirmek için ayrıdır.

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. 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:

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

Bu bağlantı, deletefilm adlı bir sayfayı çağırır ve SEÇTIĞINIZ filmin kimliğini iletmeyecektir.

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.

Silme sayfası oluşturma

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

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. Ö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. 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. Sitenizi dizine alan bir arama motoru Gezgini bile, verileri yanlışlıkla izleyen bağlantıları yanlışlıkla silebilir.

Uygulamanız kişilerin bir kaydı değiştirmesine izin veriyorsun, kaydı kullanıcıya yine de düzenlemeniz gerekir. Ancak bir kaydı silmek için bu adımı atlamayı düşünebilirsiniz. Bu adımı atlayın, ancak. (Kullanıcıların kaydı görmesini ve hedeflediğiniz kaydı sildiklerini onaylamasını de yararlı olur.)

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.

Deletemovie. cshtml adlı bir sayfa oluşturun ve dosyadaki nelerin aşağıdaki biçimlendirmeyle 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 biçimlendirme Editmovie sayfaları gibi olduğundan, metin kutuları (<input type="text">) kullanmak yerine, biçimlendirme <span> öğelerini içerir. Burada düzenlemek için bir şey yoktur. 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.

Biçimlendirme zaten kullanıcının film listesi sayfasına dönüşmesine izin veren bir bağlantı içeriyor.

Editmovie sayfasında, SEÇILI filmin kimliği gizli bir alanda saklanır. (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. Bu durumda hata, sayfaya hiçbir film KIMLIĞI geçirilmemişse veya film KIMLIĞI geçersiz olabilir. Bu durum, birisi önce filmler sayfasında bir filmi seçmeden bu sayfayı çalıştırmışsa meydana gelebilir.

Düğme başlığı filmi silerve ad özniteliği buttonDeleteolarak ayarlanır. name özniteliği, formu gönderen düğmeyi tanımlamak için kodda kullanılacaktır.

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.

Tek bir filmi okumak için kod ekleme

Deletemovie. cshtml sayfasının en üstünde 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 biçimlendirme, Editmovie sayfasındaki karşılık gelen kodla aynıdır. Film KIMLIĞINI sorgu dizesinden alır ve veritabanından 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ığında çalışacağını unutmayın. Kullanıcı filmi Sil düğmesine tıkladığında film kaydını veritabanından yeniden okumak istemezsiniz. Bu nedenle, filmi okuma kodu, istek bir POST işlemi değilse (form gönderimi) if(!IsPost) — belirten bir test içindedir.

Seçili filmi silmek için kod ekleme

Kullanıcı düğmeye tıkladığında filmi silmek için, @ bloğunun kapanış ayracın 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ın güncelleştirilmesine yönelik koda benzerdir, ancak daha basittir. Kod temelde bir SQL Delete ifadesini çalıştırır.

Editmovie sayfasında olduğu gibi, kod if(IsPost) bloğudur. Bu kez if() koşulu biraz daha karmaşıktır:

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

Burada iki koşul vardır. Birincisi, — if(IsPost)önce gördüğünüz gibi sayfanın gönderilme sayfasıdır.

İkinci koşul !Request["buttonDelete"].IsEmpty(), isteğin buttonDeleteadlı bir nesneye sahip olduğu anlamına gelir. Admitetki, formu hangi düğmenin gönderdiğine yönelik dolaylı bir yoldur. Form birden çok Gönder düğmesi içeriyorsa, istekte yalnızca tıklanan düğmenin adı görüntülenir. 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 —.

&& işleci "and" (Logical ve) anlamına gelir. Bu nedenle if koşulu tamamen...

Bu istek bir gönderi (ilk kez istek değil)

AND

buttonDelete düğmesi formu gönderen düğmedir.

Bu form (Aslında, Bu sayfa) yalnızca bir düğme içerir, bu nedenle buttonDelete ek testi Teknik olarak gerekli değildir. Hala, verileri kalıcı olarak kaldıracak bir işlem gerçekleştirmeye çalışıyoruz. Bu nedenle, işlemi yalnızca kullanıcı açıkça talep edildiğinde gerçekleştirdiğinizden emin olmak isteyebilirsiniz. Örneğin, bu sayfayı daha sonra genişletdiğinizi ve diğer düğmeleri daha sonra eklediğinizi varsayalım. Daha sonra bile, filmi silen kod yalnızca buttonDelete düğmesi tıklandıysa çalışacaktır.

Editmovie sayfasında, gızlı alandan kimliği alır ve sonra SQL komutunu çalıştırırsınız. Delete deyimin sözdizimi şöyledir:

DELETE FROM table WHERE ID = value

WHERE yan tümcesini ve KIMLIĞINI eklemek çok önemlidir. WHERE yan tümcesini bıraktığınızda, tablodaki tüm kayıtlar silinir. Gördüğünüz gibi, bir yer tutucu kullanarak KIMLIK değerini SQL komutuna geçirirsiniz.

Film silme Işlemini test etme

Artık test edebilirsiniz. Filmler sayfasını çalıştırın ve filmin yanındaki Sil ' e tıklayın. Deletemovie sayfası göründüğünde filmi Sil' e tıklayın.

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

Düğmeye tıkladığınızda, kod filmleri siler ve film listesine geri döner. Silinen filmi arayabilir ve silindiğini doğrulayabilirsiniz.

Sonraki adımda

Sonraki öğreticide, sitenizdeki tüm sayfalara ortak bir görünüm ve düzen verme konusu 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 komple liste

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