Aracılığıyla paylaş


ASP.NET Web Sayfaları (Razor) Sitelerinde Veritabanıyla Çalışmaya Giriş

yazan: Tom FitzMacken

Bu makalede, ASP.NET Web Sayfaları (Razor) web sitesinde veritabanı oluşturmak için Microsoft WebMatrix araçlarının nasıl kullanılacağı ve verileri görüntülemenize, eklemenize, düzenlemenize ve silmenize olanak sağlayan sayfaların nasıl oluşturulacağı açıklanır.

Öğrenecekleriniz:

  • Veritabanı oluşturma.
  • Veritabanına bağlanma.
  • Web sayfasında verileri görüntüleme.
  • Veritabanı kayıtlarını ekleme, güncelleştirme ve silme.

Makalede sunulan özellikler şunlardır:

  • Microsoft SQL Server Compact Edition veritabanıyla çalışma.
  • SQL sorgularıyla çalışma.
  • Sınıf Database .

Öğreticide kullanılan yazılım sürümleri

  • ASP.NET Web Sayfaları (Razor) 2
  • WebMatrix 2

Bu öğretici, WebMatrix 3 ile de çalışır. ASP.NET Web Sayfaları 3 ve Visual Studio 2013 (veya Web için Visual Studio Express 2013) kullanabilirsiniz; ancak kullanıcı arabirimi farklı olacaktır.

Veritabanlarına Giriş

Tipik bir adres defteri düşünün. Adres defterindeki her giriş için (diğer bir ifadeyle her bir kişi için) ad, soyadı, adres, e-posta adresi ve telefon numarası gibi çeşitli bilgilere sahip olursunuz.

Verileri bu şekilde görselleştirmenin tipik bir yolu, satır ve sütun içeren bir tablodur. Veritabanı terimlerinde her satır genellikle kayıt olarak adlandırılır. Her sütun (bazen alan olarak da adlandırılır) her veri türü için bir değer içerir: ad, soyadı vb.

ID FirstName LastName Adres E-posta Telefon
1 Jim Abrus 210 100. St SE Orcas WA 98031 jim@contoso.com 555 0100
2 Terry Adams 1234 Main St. Seattle WA 99011 terry@cohowinery.com 555 0101

Çoğu veritabanı tablosunda, tablonun müşteri numarası, hesap numarası vb. benzersiz tanımlayıcı içeren bir sütunu olmalıdır. Bu, tablonun birincil anahtarı olarak bilinir ve bunu tablodaki her satırı tanımlamak için kullanırsınız. Örnekte, Kimlik sütunu adres defterinin birincil anahtarıdır.

Veritabanlarıyla ilgili bu temel anlayışla, basit bir veritabanı oluşturmayı ve veri ekleme, değiştirme ve silme gibi işlemleri gerçekleştirmeyi öğrenmeye hazırsınız.

İpucu

İlişkisel Veritabanları

Metin dosyaları ve elektronik tablolar da dahil olmak üzere birçok yolla veri depolayabilirsiniz. Ancak çoğu iş kullanımları için veriler ilişkisel bir veritabanında depolanır.

Bu makale veritabanlarında çok derine inmiyor. Ancak, bunlar hakkında biraz bilgi edinmek yararlı olabilir. İlişkisel veritabanında bilgiler mantıksal olarak ayrı tablolara ayrılır. Örneğin, bir okulun veritabanı öğrenciler ve sınıf teklifleri için ayrı tablolar içerebilir. Veritabanı yazılımı (SQL Server gibi) tablolar arasında dinamik olarak ilişki kurmanızı sağlayan güçlü komutları destekler. Örneğin, ilişkisel veritabanını kullanarak öğrencilerle sınıflar arasında mantıksal bir ilişki kurarak bir zamanlama oluşturabilirsiniz. Verileri ayrı tablolarda depolamak, tablo yapısının karmaşıklığını azaltır ve tablolarda yedekli verileri tutma gereksinimini azaltır.

Veritabanı Oluşturma

Bu yordam, WebMatrix'te bulunan SQL Server Compact Veritabanı tasarım aracını kullanarak SmallBakery adlı bir veritabanının nasıl oluşturulacağını gösterir. Kod kullanarak veritabanı oluşturabilirsiniz ancak WebMatrix gibi bir tasarım aracı kullanarak veritabanı ve veritabanı tablolarını oluşturmak daha normaldir.

  1. WebMatrix'i başlatın ve Hızlı Başlangıç sayfasında Şablondan Site'ye tıklayın.

  2. Siteyi Boşalt'ı seçin ve Site Adı kutusuna "SmallBakery" yazın ve Tamam'a tıklayın. Site oluşturulur ve WebMatrix'te görüntülenir.

  3. Sol bölmede Veritabanları çalışma alanına tıklayın.

  4. Şeritte Yeni Veritabanı'na tıklayın. Sitenizle aynı ada sahip boş bir veritabanı oluşturulur.

  5. Sol bölmede SmallBakery.sdf düğümünü genişletin ve tablolar'a tıklayın.

  6. Şeritte Yeni Tablo'ya tıklayın. WebMatrix tablo tasarımcısını açar.

    [Tablo tasarımcısını açan Web Matrisini gösteren ekran görüntüsü.]

  7. Ad sütununa tıklayın ve "Kimlik" yazın.

  8. Veri Türü sütununda int'i seçin.

  9. Birincil Anahtar Mı? ve Tanımlansın mı? seçeneklerini Evet olarak ayarlayın.

    Adından da anlaşılacağı gibi Birincil Anahtar Mı , veritabanına bunun tablonun birincil anahtarı olacağını söyler. Kimlik veritabanına her yeni kayıt için otomatik olarak bir kimlik numarası oluşturmasını ve bir sonraki sıralı numarayı atamasını söyler (1'den başlayarak).

  10. Sonraki satıra tıklayın. Düzenleyici yeni bir sütun tanımı başlatır.

  11. Ad değeri olarak "Ad" yazın.

  12. Veri Türü için "nvarchar" öğesini seçin ve uzunluğu 50 olarak ayarlayın. öğesininnvarchar var bölümü veritabanına bu sütunun verilerinin, boyutu kayıttan kayda farklılık gösterebilecek bir dize olacağını söyler. ( n ön eki ulusal değeri temsil eder, bu da alanın herhangi bir alfabeyi veya yazma sistemini temsil eden karakter verilerini barındırabileceğini gösterir; yani alanın Unicode verilerini barındırdığını gösterir.)

  13. Null'lara İzin Ver seçeneğini Hayır olarak ayarlayın. Bu, Ad sütununun boş bırakılmamasını zorunlu kılacak.

  14. Aynı işlemi kullanarak Açıklama adlı bir sütun oluşturun. Veri Türü'nü "nvarchar" ve uzunluk için 50 olarak, Null Değerlere İzin Ver'i false olarak ayarlayın.

  15. Price adlı bir sütun oluşturun. Veri Türü'nü "money" ve Allow Nulls değerini false olarak ayarlayın.

  16. Üstteki kutuda tabloyu "Ürün" olarak adlandırın.

    İşiniz bittiğinde tanım şöyle görünür:

    [Tamamlandığında tanımın nasıl görüneceğini gösteren ekran görüntüsü.]

  17. Tabloyu kaydetmek için Ctrl+S tuşlarına basın.

Veritabanına Veri Ekleme

Artık makalenin devamında üzerinde çalışacağınız bazı örnek verileri veritabanınıza ekleyebilirsiniz.

  1. Sol bölmede SmallBakery.sdf düğümünü genişletin ve tablolar'a tıklayın.

  2. Product tablosuna sağ tıklayın ve ardından Veri'ye tıklayın.

  3. Düzenleme bölmesine aşağıdaki kayıtları girin:

    Ad Açıklama Fiyat
    Ekmek Her gün taze pişirilir. 2.99
    Çilekli Kek Bahçemizden organik çileklerle yapılır. 9.99
    Apple Pie Annenin pastasına sadece ikinci. 12.99
    Pecan Pastası Pecan'ları seviyorsan, bu senin için. 10.99
    Limonlu Pasta Dünyadaki en iyi limonlarla yapılır. 11.99
    Cupcakes Çocukların ve içindeki çocuk bunlara bayılacak. 7.99

    Kimlik sütunu için herhangi bir şey girmenize gerek olmadığını unutmayın. Kimlik sütununu oluşturduğunuzda, IsIdentity özelliğini true olarak ayarlarsınız ve bu da sütunun otomatik olarak doldurulmasına neden olur.

    Verileri girmeyi bitirdiğinizde tablo tasarımcısı şöyle görünür:

    [Veriler girildikten sonra tablo tasarımcısının nasıl görüneceğini gösteren ekran görüntüsü.]

  4. Veritabanı verilerini içeren sekmeyi kapatın.

Veritabanından Veri Görüntüleme

Veri içeren bir veritabanınız olduğunda, verileri bir ASP.NET web sayfasında görüntüleyebilirsiniz. Görüntülenecek tablo satırlarını seçmek için veritabanına geçirdiğiniz bir komut olan SQL deyimini kullanırsınız.

  1. Sol bölmede Dosyalar çalışma alanına tıklayın.

  2. Web sitesinin kökünde ListProducts.cshtml adlı yeni bir CSHTML sayfası oluşturun.

  3. Var olan işaretlemeyi aşağıdakilerle değiştirin:

    @{
        var db = Database.Open("SmallBakery");
        var selectQueryString = "SELECT * FROM Product ORDER BY Name";
     }
    <!DOCTYPE html>
    <html>
     <head>
       <title>Small Bakery Products</title>
       <style>
           table, th, td {
             border: solid 1px #bbbbbb;
             border-collapse: collapse;
             padding: 2px;
           }
        </style>
     </head>
     <body>
       <h1>Small Bakery Products</h1>
       <table>
           <thead>
               <tr>
                   <th>Id</th>
                   <th>Product</th>
                   <th>Description</th>
           <th>Price</th>
               </tr>
           </thead>
           <tbody>
               @foreach(var row in db.Query(selectQueryString)){
                <tr>
                   <td>@row.Id</td>
                       <td>@row.Name</td>
                       <td>@row.Description</td>
                       <td>@row.Price</td>
                </tr>
               }
           </tbody>
       </table>
     </body>
    </html>
    

    İlk kod bloğunda, daha önce oluşturduğunuz SmallBakery.sdf dosyasını (veritabanı) açarsınız. yöntemi, Database.Open.sdf dosyasının web sitenizin App_Data klasöründe olduğunu varsayar. ( .sdf uzantısını belirtmeniz gerekmediğini, aslında bunu yaparsanız yöntemin Open çalışmayacağını fark edin.)

    Not

    App_Data klasörü, ASP.NET'da veri dosyalarını depolamak için kullanılan özel bir klasördür. Daha fazla bilgi için bu makalenin devamında Yer alan Veritabanına Bağlanma bölümüne bakın.

    Ardından aşağıdaki SQL Select deyimini kullanarak veritabanını sorgulama isteğinde bulunacaksınız:

    SELECT * FROM Product ORDER BY Name
    

    deyiminde, Product sorguya yönelik tabloyu tanımlar. karakteri, * sorgunun tablodaki tüm sütunları döndürmesi gerektiğini belirtir. (Sütunlardan yalnızca bazılarını görmek istiyorsanız sütunları virgülle ayırarak tek tek listeleyebilirsiniz.) Order By yan tümcesi, verilerin ad sütununa göre nasıl sıralanması gerektiğini gösterir. Bu, verilerin her satır için Ad sütununun değerine göre alfabetik olarak sıralandığı anlamına gelir.

    Sayfanın gövdesinde, işaretleme verileri görüntülemek için kullanılacak bir HTML tablosu oluşturur. öğesinin <tbody> içinde, sorgu tarafından döndürülen her veri satırını ayrı ayrı almak için bir foreach döngü kullanırsınız. Her veri satırı için bir HTML tablosu satırı (<tr> öğesi) oluşturursunuz. Ardından her sütun için HTML tablo hücreleri (<td> öğeler) oluşturursunuz. Döngünün üzerinden her geçtiğinizde veritabanından bir sonraki kullanılabilir satır değişkenindedir row (bunu deyiminde foreach ayarlarsınız). Satırdan tek bir sütun almak için, istediğiniz sütunun adını veya row.Description adını kullanabilirsinizrow.Name.

  4. Sayfayı tarayıcıda çalıştırın. (Sayfayı çalıştırmadan önce Dosyalar çalışma alanında seçili olduğundan emin olun.) Sayfada aşağıdakine benzer bir liste görüntülenir:

    [Ekran görüntüsü, sayfanın tarayıcıda görüntüleneceği listeyi gösterir.]

İpucu

Yapılandırılmış Sorgu Dili (SQL)

SQL, çoğu ilişkisel veritabanında veritabanındaki verileri yönetmek için kullanılan bir dildir. Verileri almanıza ve güncelleştirmenize ve veritabanı tablolarını oluşturmanıza, değiştirmenize ve yönetmenize olanak sağlayan komutlar içerir. SQL, programlama dilinden (WebMatrix'te kullandığınız dil gibi) farklıdır çünkü SQL'de fikir, veritabanına ne istediğinizi söylemenizdir ve verilerin nasıl alındığını veya görevi nasıl yerine getirebileceğinizi bulmak veritabanının görevidir. Bazı SQL komutlarının ve bunların ne yaptığının örnekleri aşağıda verilmiştir:

SELECT Id, Name, Price FROM Product WHERE Price > 10.00 ORDER BY Name

Bu, Price değeri 10'dan fazlaysa Ürün tablosundaki kayıtlardan Kimlik, Ad ve Fiyat sütunlarını getirir ve Sonuçları Ad sütununun değerlerine göre alfabetik sırada döndürür. Bu komut, ölçütlere uyan kayıtları içeren bir sonuç kümesi veya eşleşen kayıt yoksa boş bir küme döndürür.

INSERT INTO Product (Name, Description, Price) VALUES ("Croissant", "A flaky delight", 1.99)

Bu işlem Product tablosuna yeni bir kayıt ekler ve Name sütununu "Croissant" olarak, Description sütununu "A flaky delight" ve price değerini 1,99 olarak ayarlar.

DELETE FROM Product WHERE ExpirationDate < "01/01/2008"

Bu komut , Product tablosundaki son kullanma tarihi sütunu 1 Ocak 2008'den önce olan kayıtları siler. (Bu, Product tablosunun böyle bir sütunu olduğunu varsayar.) Tarih buraya AA/GG/YYYY biçiminde girilir, ancak yerel ayarınız için kullanılan biçimde girilmelidir.

Insert Into ve Delete komutları sonuç kümelerini döndürmez. Bunun yerine, komutundan kaç kaydın etkilendiğini belirten bir sayı döndürürler.

Bu işlemlerden bazıları için (kayıtları ekleme ve silme gibi), işlemi isteyen işlemin veritabanında uygun izinlere sahip olması gerekir. Bu nedenle üretim veritabanları için veritabanına bağlanırken genellikle bir kullanıcı adı ve parola sağlamanız gerekir.

Onlarca SQL komutu vardır, ancak bunların tümü aşağıdakine benzer bir desen izler. SQL komutlarını kullanarak veritabanı tabloları oluşturabilir, tablodaki kayıt sayısını sayabilir, fiyatları hesaplayabilir ve daha birçok işlem gerçekleştirebilirsiniz.

Veritabanına Veri Ekleme

Bu bölümde, kullanıcıların Product veritabanı tablosuna yeni bir ürün eklemesine olanak tanıyan bir sayfanın nasıl oluşturulacağı gösterilmektedir. Yeni bir ürün kaydı eklendikten sonra sayfa, önceki bölümde oluşturduğunuz ListProducts.cshtml sayfasını kullanarak güncelleştirilmiş tabloyu görüntüler.

Sayfa, kullanıcının girdiği verilerin veritabanı için geçerli olduğundan emin olmak için doğrulama içerir. Örneğin, sayfadaki kod, tüm gerekli sütunlar için bir değer girildiğinden emin olur.

  1. Web sitesinde InsertProducts.cshtml adlı yeni bir CSHTML dosyası oluşturun.

  2. Var olan işaretlemeyi aşağıdakilerle değiştirin:

    @{
        Validation.RequireField("Name", "Product name is required.");
        Validation.RequireField("Description", "Product description is required.");
        Validation.RequireField("Price", "Product price is required.");
    
        var db = Database.Open("SmallBakery");
        var Name = Request.Form["Name"];
        var Description = Request.Form["Description"];
        var Price = Request.Form["Price"];
    
        if (IsPost && Validation.IsValid()) {
            // Define the insert query. The values to assign to the
            // columns in the Product table are defined as parameters
            // with the VALUES keyword.
            if(ModelState.IsValid) {
                var insertQuery = "INSERT INTO Product (Name, Description, Price) " +
                    "VALUES (@0, @1, @2)";
                db.Execute(insertQuery, Name, Description, Price);
                // Display the page that lists products.
                Response.Redirect("~/ListProducts");
            }
        }
    }
    
    <!DOCTYPE html>
    <html>
    <head>
     <title>Add Products</title>
     <style type="text/css">
        label {float:left; width: 8em; text-align: right;
               margin-right: 0.5em;}
        fieldset {padding: 1em; border: 1px solid; width: 50em;}
        legend {padding: 2px 4px; border: 1px solid; font-weight:bold;}
        .validation-summary-errors {font-weight:bold; color:red;
               font-size: 11pt;}
     </style>
    </head>
    <body>
     <h1>Add New Product</h1>
    
     @Html.ValidationSummary("Errors with your submission:")
    
     <form method="post" action="">
       <fieldset>
         <legend>Add Product</legend>
         <div>
           <label>Name:</label>
           <input name="Name" type="text" size="50" value="@Name" />
         </div>
         <div>
           <label>Description:</label>
           <input name="Description" type="text" size="50"
               value="@Description" />
         </div>
         <div>
           <label>Price:</label>
           <input name="Price" type="text" size="50" value="@Price" />
         </div>
         <div>
           <label>&nbsp;</label>
           <input type="submit" value="Insert" class="submit" />
         </div>
       </fieldset>
     </form>
    </body>
    </html>
    

    Sayfanın gövdesi, kullanıcıların ad, açıklama ve fiyat girmelerine olanak sağlayan üç metin kutusu içeren bir HTML formu içerir. Kullanıcılar Ekle düğmesine tıkladığında, sayfanın üst kısmındaki kod SmallBakery.sdf veritabanına bir bağlantı açar. Ardından nesnesini kullanarak Request kullanıcının gönderdiği değerleri alır ve bu değerleri yerel değişkenlere atarsınız.

    Kullanıcının gerekli her sütun için bir değer girdiğinizi doğrulamak için, doğrulamak istediğiniz her <input> öğeyi kaydedersiniz:

    Validation.RequireField("Name", "Product name is required.");
    Validation.RequireField("Description", "Product description is required.");
    Validation.RequireField("Price", "Product price is required.");
    

    Yardımcı, Validation kaydettiğiniz alanların her birinde bir değer olup olmadığını denetler. Kullanıcıdan edindiğiniz bilgileri işlemeden önce genellikle yaptığınız öğesini denetleyerek Validation.IsValid()tüm alanların doğrulamadan geçip geçmediğini test edebilirsiniz:

    if (IsPost && Validation.IsValid()) {
        // Process information here
    }
    

    (işleç && , AND — bu test , bir form gönderimiyse ve tüm alanlar doğrulamadan geçmişse şeklindedir.)

    Tüm sütunlar doğrulandıysa (hiçbiri boş değilse), devam edip verileri eklemek için bir SQL deyimi oluşturup daha sonra gösterildiği gibi yürütebilirsiniz:

    var insertQuery =
        "INSERT INTO Product (Name, Description, Price) VALUES (@0, @1, @2)";
    

    Eklenecek değerler için parametre yer tutucularını (@0, @1, @2) eklersiniz.

    Not

    Bir güvenlik önlemi olarak, yukarıdaki örnekte gördüğünüz gibi parametreleri kullanarak değerleri her zaman bir SQL deyimine geçirin. Bu size kullanıcının verilerini doğrulama şansı verir ve veritabanınıza kötü amaçlı komut gönderme girişimlerine (bazen SQL ekleme saldırıları olarak da adlandırılır) karşı korumaya yardımcı olur.

    Sorguyu yürütmek için, yer tutucuların yerine geçecek değerleri içeren değişkenleri ileterek bu deyimi kullanırsınız:

    db.Execute(insertQuery, Name, Description, Price);
    

    Insert Into deyimi yürütüldükten sonra, kullanıcıyı şu satırı kullanarak ürünleri listeleyen sayfaya gönderirsiniz:

    Response.Redirect("~/ListProducts");
    

    Doğrulama başarılı olmazsa ekleme işlemini atlarsınız. Bunun yerine, sayfada birikmiş hata iletilerini (varsa) görüntüleyebilen bir yardımcınız vardır:

    @Html.ValidationSummary("Errors with your submission:")
    

    İşaretlemdeki stil bloğunun adlı .validation-summary-errorsbir CSS sınıf tanımı içerdiğine dikkat edin. Bu, doğrulama hataları içeren öğe için <div> varsayılan olarak kullanılan CSS sınıfının adıdır. Bu durumda, CSS sınıfı doğrulama özeti hatalarının kırmızı ve kalın olarak görüntüleneceğini belirtir, ancak sınıfını istediğiniz biçimlendirmeyi görüntüleyecek şekilde tanımlayabilirsiniz .validation-summary-errors .

Sayfa Ekle'yi test etme

  1. Sayfayı tarayıcıda görüntüleyin. Sayfada, aşağıdaki çizimde gösterilene benzer bir form görüntülenir.

    [Tarayıcıda sayfada görüntülenecek formu gösteren ekran görüntüsü.]

  2. Tüm sütunların değerlerini girin, ancak Price sütununu boş bıraktığınıza emin olun.

  3. Ekle'ye tıklayın. Sayfa, aşağıdaki çizimde gösterildiği gibi bir hata iletisi görüntüler. (Yeni kayıt oluşturulmaz.)

    [Ekran görüntüsü bir hata iletisini gösterir.]

  4. Formu tamamen doldurun ve Ekle'ye tıklayın. Bu kez ListProducts.cshtml sayfası görüntülenir ve yeni kayıt gösterilir.

Veritabanındaki Verileri Güncelleştirme

Tabloya veri girildikten sonra verileri güncelleştirmeniz gerekebilir. Bu yordamda, daha önce veri eklemek için oluşturduğunuza benzer iki sayfanın nasıl oluşturulacağı gösterilir. İlk sayfada ürünler görüntülenir ve kullanıcıların değiştirmek için bir ürün seçmesine olanak tanır. İkinci sayfa, kullanıcıların düzenlemeleri yapmasına ve kaydetmesine olanak tanır.

Not

Önemli Üretim web sitesinde genellikle verilerde değişiklik yapmasına izin verilen kişileri kısıtlarsınız. Üyeliği ayarlama ve kullanıcıları sitede görev gerçekleştirme yetkisi verme yolları hakkında bilgi için bkz. ASP.NET Web Sayfaları Sitesine Güvenlik ve Üyelik Ekleme.

  1. Web sitesinde EditProducts.cshtml adlı yeni bir CSHTML dosyası oluşturun.

  2. Dosyadaki mevcut işaretlemeyi aşağıdakilerle değiştirin:

    @{
        var db = Database.Open("SmallBakery");
        var selectQueryString = "SELECT * FROM Product ORDER BY Name";
    
    }
    <!DOCTYPE html>
    <html>
    <head>
        <title>Edit Products</title>
        <style type="text/css">
            table, th, td {
              border: solid 1px #bbbbbb;
              border-collapse: collapse;
              padding: 2px;
            }
        </style>
    </head>
    <body>
        <h1>Edit Small Bakery Products</h1>
        <table>
          <thead>
            <tr>
              <th>&nbsp;</th>
              <th>Name</th>
              <th>Description</th>
              <th>Price</th>
            </tr>
          </thead>
          <tbody>
            @foreach (var row in db.Query(selectQueryString)) {
              <tr>
                <td><a href="@Href("~/UpdateProducts", row.Id)">Edit</a></td>
                <td>@row.Name</td>
                <td>@row.Description</td>
                <td>@row.Price</td>
              </tr>
            }
          </tbody>
        </table>
    </body>
    </html>
    

    Bu sayfa ile daha önceki ListProducts.cshtml sayfası arasındaki tek fark, bu sayfadaki HTML tablosunun Düzenle bağlantısı görüntüleyen fazladan bir sütun içermesidir. Bu bağlantıya tıkladığınızda, sizi seçili kaydı düzenleyebileceğiniz UpdateProducts.cshtml sayfasına (bundan sonra oluşturacaksınız) götürür.

    Düzenle bağlantısını oluşturan koda bakın:

    <a href="@Href("~/UpdateProducts", row.Id)">Edit</a></td>
    

    Bu, özniteliği dinamik olarak ayarlanan bir HTML <a> öğesi href oluşturur. özniteliği, href kullanıcı bağlantıya tıkladığında görüntülenecek sayfayı belirtir. Ayrıca geçerli satırın Id değerini bağlantıya geçirir. Sayfa çalıştırıldığında, sayfa kaynağı aşağıdakine benzer bağlantılar içerebilir:

    <a href="UpdateProducts/1">Edit</a></td>
    <a href="UpdateProducts/2">Edit</a></td>
    <a href="UpdateProducts/3">Edit</a></td>
    

    özniteliğinin href olarak ayarlandığına UpdateProducts/ndikkat edin; burada n bir ürün numarasıdır. Kullanıcı bu bağlantılardan birine tıkladığında, sonuçta elde edilen URL şöyle görünür:

    http://localhost:18816/UpdateProducts/6

    Başka bir deyişle, düzenlenecek ürün numarası URL'ye geçirilir.

  3. Sayfayı tarayıcıda görüntüleyin. Sayfa verileri şöyle bir biçimde görüntüler:

    [Tarayıcıda sayfada görüntülenen verileri gösteren ekran görüntüsü.]

    Ardından, kullanıcıların verileri gerçekten güncelleştirmesine olanak tanıyan bir sayfa oluşturacaksınız. Güncelleştirme sayfası, kullanıcının girdiği verileri doğrulamak için doğrulama içerir. Örneğin, sayfadaki kod, tüm gerekli sütunlar için bir değer girildiğinden emin olur.

  4. Web sitesinde UpdateProducts.cshtml adlı yeni bir CSHTML dosyası oluşturun.

  5. Dosyada var olan işaretlemeyi aşağıdakilerle değiştirin.

    @{
        Validation.RequireField("Name", "Product name is required.");
        Validation.RequireField("Description", "Product description is required.");
        Validation.RequireField("Price", "Product price is required.");
    
        var Name = "";
        var Description = "";
        var Price = Decimal.Zero;
    
        var ProductId  = UrlData[0];
        if (ProductId.IsEmpty()) {
             Response.Redirect("~/EditProducts");
        }
    
        var db = Database.Open("SmallBakery");
    
        if (IsPost && Validation.IsValid()) {
            var updateQueryString =
                "UPDATE Product SET Name=@0, Description=@1, Price=@2 WHERE Id=@3" ;
            Name = Request["Name"];
            Description = Request["Description"];
            Price = Request["Price"].AsDecimal();
            db.Execute(updateQueryString, Name, Description, Price, ProductId);
            Response.Redirect(@Href("~/EditProducts"));
        }
        else {
            var selectQueryString = "SELECT * FROM Product WHERE Id=@0";
    
            var row = db.QuerySingle(selectQueryString, ProductId);
            Name = row.Name;
            Description = row.Description;
            Price = row.Price;
        }
    
    }
    
    <!DOCTYPE html>
    <html>
    <head>
      <title>Add Products</title>
      <style type="text/css">
         label { float: left; width: 8em; text-align: right;
                 margin-right: 0.5em;}
         fieldset { padding: 1em; border: 1px solid; width: 35em;}
         legend { padding: 2px 4px;  border: 1px solid; font-weight: bold;}
         .validation-summary-errors {font-weight:bold; color:red; font-size:11pt;}
      </style>
    </head>
    <body>
      <h1>Update Product</h1>
       @Html.ValidationSummary("Errors with your submission:")
       <form method="post" action="">
         <fieldset>
           <legend>Update Product</legend>
           <div>
             <label>Name:</label>
             <input name="Name" type="text" size="50" value="@Name" />
           </div>
           <div>
             <label>Description:</label>
             <input name="Description" type="text" size="50"
                value="@Description" />
           </div>
           <div>
              <label>Price:</label>
              <input name="Price" type="text" size="50" value="@Price" />
           </div>
           <div>
              <label>&nbsp;</label>
              <input type="submit" value="Update" class="submit" />
           </div>
        </fieldset>
      </form>
    </body>
    </html>
    

    Sayfanın gövdesi, bir ürünün görüntülendiği ve kullanıcıların düzenleyebileceği bir HTML formu içerir. Ürünün görüntülenmesini sağlamak için şu SQL deyimini kullanırsınız:

    SELECT * FROM Product WHERE Id=@0
    

    Bu işlem, kimliği parametresinde geçirilen @0 değerle eşleşen ürünü seçer. ( Kimlik birincil anahtar olduğundan ve bu nedenle benzersiz olması gerektiğinden, bu şekilde yalnızca bir ürün kaydı seçilebilir.) Bu Select deyime geçirilecek kimlik değerini almak için, aşağıdaki söz dizimini kullanarak URL'nin bir parçası olarak sayfaya geçirilen değeri okuyabilirsiniz:

    var ProductId  = UrlData[0];
    

    Ürün kaydını gerçekten getirmek için yöntemini kullanırsınız QuerySingle ve bu yöntem yalnızca bir kayıt döndürür:

    var row = db.QuerySingle(selectQueryString, ProductId);
    

    Tek satır değişkenine row döndürülür. Her sütundan veri alabilir ve bunu aşağıdaki gibi yerel değişkenlere atayabilirsiniz:

    var Name = row.Name;
    var Description = row.Description;
    var Price = row.Price;
    

    Formun işaretlemesinde, bu değerler aşağıdaki gibi ekli kod kullanılarak tek tek metin kutularında otomatik olarak görüntülenir:

    <input name="Name" type="text" size="50" value="@Name" />
    

    Kodun bu bölümü güncelleştirilecek ürün kaydını görüntüler. Kayıt görüntülendikten sonra kullanıcı sütunları tek tek düzenleyebilir.

    Kullanıcı Güncelleştir düğmesine tıklayarak formu gönderdiğinde, bloktaki if(IsPost) kod çalışır. Bu, nesneden Request kullanıcının değerlerini alır, değerleri değişkenlerde depolar ve her sütunun doldurulduğunu doğrular. Doğrulama başarılı olursa kod aşağıdaki SQL Update deyimini oluşturur:

    UPDATE Product SET Name=@0, Description=@1, Price=@2, WHERE ID=@3
    

    SQL Update deyiminde, güncelleştirilecek her sütunu ve ayarlanacağı değeri belirtirsiniz. Bu kodda değerler , , @1, @2vb. parametre yer tutucuları @0kullanılarak belirtilir. (Daha önce belirtildiği gibi, güvenlik için her zaman parametreleri kullanarak değerleri bir SQL deyimine geçirmeniz gerekir.)

    yöntemini çağırdığınızda db.Execute , değerleri içeren değişkenleri SQL deyimindeki parametrelere karşılık gelen sırayla geçirirsiniz:

    db.Execute(updateQueryString, Name, Description, Price, ProductId);
    

    Update deyimi yürütüldükten sonra kullanıcıyı düzenleme sayfasına geri yönlendirmek için aşağıdaki yöntemi çağırırsınız:

    Response.Redirect(@Href("~/EditProducts"));
    

    Bunun etkisi, kullanıcının veritabanındaki verilerin güncelleştirilmiş bir listesini görmesi ve başka bir ürünü düzenleyebiliyor olmasıdır.

  6. Sayfayı kaydedin.

  7. EditProducts.cshtml sayfasını (güncelleştirme sayfası değil) çalıştırın ve düzenle'ye tıklayarak düzenlenecek bir ürün seçin. Seçtiğiniz kaydı gösteren UpdateProducts.cshtml sayfası görüntülenir.

    [Seçilen kayıtla birlikte Ürünleri Güncelleştir sayfasını gösteren ekran görüntüsü.]

  8. Bir değişiklik yapın ve Güncelleştir'e tıklayın. Ürün listesi, güncelleştirilmiş verilerinizle birlikte yeniden gösterilir.

Veritabanındaki Verileri Silme

Bu bölümde, kullanıcıların Ürün veritabanı tablosundan bir ürünü silmesine nasıl izin vereceğinizi gösterir. Örnek iki sayfadan oluşur. İlk sayfada, kullanıcılar silmek için bir kayıt seçer. Ardından silinecek kayıt, kaydı silmek istediklerini onaylamalarına olanak tanıyan ikinci bir sayfada görüntülenir.

Not

Önemli Üretim web sitesinde genellikle verilerde değişiklik yapmasına izin verilen kişileri kısıtlarsınız. Üyeliği ayarlama ve kullanıcıyı sitedeki görevleri gerçekleştirmesi için yetkilendirme yolları hakkında bilgi için bkz. ASP.NET Web Sayfaları Sitesine Güvenlik ve Üyelik Ekleme.

  1. Web sitesinde ListProductsForDelete.cshtml adlı yeni bir CSHTML dosyası oluşturun.

  2. Var olan işaretlemeyi aşağıdakilerle değiştirin:

    @{
      var db = Database.Open("SmallBakery");
      var selectQueryString = "SELECT * FROM Product ORDER BY Name";
    }
    <!DOCTYPE html>
    <html>
    <head>
        <title>Delete a Product</title>
        <style>
            table, th, td {
              border: solid 1px #bbbbbb;
              border-collapse: collapse;
              padding: 2px;
            }
         </style>
    </head>
    <body>
      <h1>Delete a Product</h1>
      <form method="post" action="" name="form">
        <table border="1">
          <thead>
            <tr>
              <th>&nbsp;</th>
              <th>Name</th>
              <th>Description</th>
              <th>Price</th>
            </tr>
          </thead>
          <tbody>
            @foreach (var row in db.Query(selectQueryString)) {
              <tr>
                <td><a href="@Href("~/DeleteProduct", row.Id)">Delete</a></td>
                <td>@row.Name</td>
                <td>@row.Description</td>
                <td>@row.Price</td>
              </tr>
            }
          </tbody>
        </table>
      </form>
    </body>
    </html>
    

    Bu sayfa, daha önceki EditProducts.cshtml sayfasına benzer. Ancak, her ürün için bir Düzenle bağlantısı görüntülemek yerine bir Sil bağlantısı görüntüler. Sil bağlantısı, işaretlemede aşağıdaki eklenmiş kod kullanılarak oluşturulur:

    <a href="@Href("~/DeleteProduct", row.Id)">Delete</a>
    

    Bu, kullanıcılar bağlantıya tıkladığında şuna benzer bir URL oluşturur:

    http://<server>/DeleteProduct/4

    URL , DeleteProduct.cshtml adlı bir sayfayı (bundan sonra oluşturacaksınız) çağırır ve silinecek ürünün kimliğini geçirir (burada, 4).

  3. Dosyayı kaydedin, ancak açık bırakın.

  4. DeleteProduct.cshtml adlı başka bir CHTML dosyası oluşturun. Mevcut içeriği aşağıdakilerle değiştirin:

    @{
      var db = Database.Open("SmallBakery");
      var ProductId = UrlData[0];
      if (ProductId.IsEmpty()) {
        Response.Redirect("~/ListProductsForDelete");
      }
      var prod = db.QuerySingle("SELECT * FROM PRODUCT WHERE ID = @0", ProductId);
      if( IsPost && !ProductId.IsEmpty()) {
        var deleteQueryString = "DELETE FROM Product WHERE Id=@0";
        db.Execute(deleteQueryString, ProductId);
        Response.Redirect("~/ListProductsForDelete");
      }
    }
    
    <!DOCTYPE html>
    <html>
    <head>
        <title>Delete Product</title>
    </head>
    <body>
      <h1>Delete Product - Confirmation</h1>
      <form method="post" action="" name="form">
        <p>Are you sure you want to delete the following product?</p>
    
        <p>Name: @prod.Name <br />
           Description: @prod.Description <br />
           Price: @prod.Price</p>
        <p><input type="submit" value="Delete" /></p>
      </form>
    </body>
    </html>
    

    Bu sayfa ListProductsForDelete.cshtml tarafından çağrılır ve kullanıcıların bir ürünü silmek istediklerini onaylamalarını sağlar. Silinecek ürünü listelemek için aşağıdaki kodu kullanarak URL'den silinecek ürünün kimliğini alırsınız:

    var ProductId = UrlData[0];
    

    Sayfa daha sonra kullanıcıdan kaydı gerçekten silmek için bir düğmeye tıklamasını ister. Bu önemli bir güvenlik önlemidir: Web sitenizde verileri güncelleştirme veya silme gibi hassas işlemler gerçekleştirdiğinizde, bu işlemler her zaman GET işlemi değil POST işlemi kullanılarak yapılmalıdır. Siteniz get işlemi kullanılarak bir silme işlemi gerçekleştirilecek şekilde ayarlandıysa, herkes gibi http://<server>/DeleteProduct/4 bir URL geçirebilir ve veritabanınızdan istediği her şeyi silebilir. Silme işleminin yalnızca POST kullanılarak gerçekleştirilebilmesi için onay ekleyip sayfayı kodlayarak sitenize bir güvenlik ölçüsü eklersiniz.

    Asıl silme işlemi aşağıdaki kod kullanılarak gerçekleştirilir. Bu işlem ilk olarak bunun bir post işlemi olduğunu ve kimliğin boş olmadığını onaylar:

    if( IsPost && !ProductId.IsEmpty()) {
        var deleteQueryString = "DELETE FROM Product WHERE Id=@0";
        db.Execute(deleteQueryString, ProductId);
        Response.Redirect("~/ListProductsForDelete");
    }
    

    Kod, belirtilen kaydı silen ve kullanıcıyı listeleme sayfasına geri yönlendiren bir SQL deyimi çalıştırır.

  5. ListProductsForDelete.cshtml dosyasını tarayıcıda çalıştırın.

    [Tarayıcıda nokta CSHTML'yi silmek için çalışan liste ürünlerini gösteren ekran görüntüsü.]

  6. Ürünlerden birinin Sil bağlantısına tıklayın. Bu kaydı silmek istediğinizi onaylamak için DeleteProduct.cshtml sayfası görüntülenir.

  7. Sil düğmesine tıklayın. Ürün kaydı silinir ve sayfa güncelleştirilmiş bir ürün listesiyle yenilenir.

İpucu

Veritabanına Bağlanma

Veritabanına iki şekilde bağlanabilirsiniz. İlki yöntemini kullanmak Database.Open ve veritabanı dosyasının adını belirtmektir ( .sdf uzantısından az):

var db = Database.Open("SmallBakery");

yöntemi, Open öğesinin olduğunu varsayar.sdf dosyası web sitesinin App_Data klasöründedir. Bu klasör, verileri tutmak için özel olarak tasarlanmıştır. Örneğin, web sitesinin verileri okumasına ve yazmasına izin vermek için uygun izinlere sahiptir ve bir güvenlik önlemi olarak WebMatrix bu klasördeki dosyalara erişime izin vermez.

İkinci yol bir bağlantı dizesi kullanmaktır. Bağlantı dizesi, veritabanına bağlanma hakkında bilgi içerir. Bu bir dosya yolu içerebilir veya yerel veya uzak bir sunucudaki SQL Server veritabanının adını ve bu sunucuya bağlanmak için bir kullanıcı adı ve parolayı içerebilir. (Verileri barındırma sağlayıcısının sitesinde olduğu gibi merkezi olarak yönetilen bir SQL Server sürümünde tutarsanız, veritabanı bağlantı bilgilerini belirtmek için her zaman bir bağlantı dizesi kullanırsınız.)

WebMatrix'te bağlantı dizeleri genellikle Web.configadlı bir XML dosyasında depolanır. Adından da anlaşılacağı gibi, sitenizin gerektirebileceği bağlantı dizeleri dahil olmak üzere sitenin yapılandırma bilgilerini depolamak için web sitenizin kökündeki bir Web.config dosyası kullanabilirsiniz. birWeb.config dosyasındaki bağlantı dizesi örneği aşağıdaki gibi görünebilir. Not $CREDENTIAL_PLACEHOLDER$ , parola anahtarı/değer çifti için bir yer tutucudur:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
   <add
     name="SQLServerConnectionString"
     connectionString= "server=myServer;database=myDatabase;uid=username;$CREDENTIAL_PLACEHOLDER$"
     providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

Örnekte, bağlantı dizesi bir sunucuda bir yerde çalışan bir SQL Server örneğindeki bir veritabanına işaret eder (yerel bir .sdf dosyasının aksine). ve için uygun adları değiştirmeniz ve ve myDatabaseiçin myServerusernamepasswordSQL Server oturum açma değerlerini belirtmeniz gerekir. (Kullanıcı adı ve parola değerleri, Windows kimlik bilgilerinizle veya barındırma sağlayıcınızın sunucularında oturum açmak için size verdiği değerlerle aynı olmayabilir. İhtiyacınız olan tam değerleri yöneticiye danışın.)

Database.Open yöntemi esnektir, çünkü bir veritabanı .sdf dosyasının adını veya Web.config dosyasında depolanan bir bağlantı dizesinin adını geçirmenize olanak tanır. Aşağıdaki örnekte, önceki örnekte gösterilen bağlantı dizesini kullanarak veritabanına nasıl bağlanıldığı gösterilmektedir:

@{
    var db = Database.Open("SQLServerConnectionString");
}

Belirtildiği gibi, Database.Open yöntemi bir veritabanı adı veya bağlantı dizesi geçirmenize olanak tanır ve hangisini kullanacağınızı bulur. Bu, web sitenizi dağıtırken (yayımladığınızda) çok yararlıdır. Sitenizi geliştirirken ve test ederken App_Data klasöründe bir .sdf dosyası kullanabilirsiniz. Daha sonra sitenizi bir üretim sunucusuna taşıdığınızda, Web.config dosyasında .sdf dosyanızla aynı ada sahip ancak barındırma sağlayıcısının veritabanına işaret eden bir bağlantı dizesi kullanabilirsiniz. Bunların hepsi kodunuzu değiştirmek zorunda kalmadan gerçekleşir.

Son olarak, doğrudan bir bağlantı dizesiyle çalışmak istiyorsanız yöntemini çağırabilir Database.OpenConnectionString ve yalnızcaWeb.config dosyasındaki adı yerine gerçek bağlantı dizesini geçirebilirsiniz. Bu, herhangi bir nedenle sayfa çalışana kadar bağlantı dizesine (veya içindeki .sdf dosya adı gibi değerlere) erişiminiz olmadığı durumlarda yararlı olabilir. Ancak, çoğu senaryo için bu makalede açıklandığı gibi kullanabilirsiniz Database.Open .

Ek Kaynaklar