Sdílet prostřednictvím


Úvod do práce s databází na webech ASP.NET Web Pages (Razor)

, autor: Tom FitzMacken

Tento článek popisuje, jak pomocí nástrojů Microsoft WebMatrix vytvořit databázi na webu ASP.NET Web Pages (Razor) a jak vytvořit stránky, které umožňují zobrazit, přidat, upravit a odstranit data.

Co se naučíte:

  • Postup vytvoření databáze
  • Postup připojení k databázi
  • Jak zobrazit data na webové stránce.
  • Jak vkládat, aktualizovat a odstraňovat záznamy databáze.

Toto jsou funkce představené v článku:

  • Práce s databází Microsoft SQL Server Compact Edition
  • Práce s dotazy SQL
  • Třída Database .

Verze softwaru použité v kurzu

  • webové stránky ASP.NET (Razor) 2
  • WebMatrix 2

Tento kurz funguje také s nástrojem WebMatrix 3. Můžete použít ASP.NET Web Pages 3 a Visual Studio 2013 (nebo Visual Studio Express 2013 pro web), uživatelské rozhraní se ale bude lišit.

Úvod do databází

Představte si typický adresář. Pro každou položku v adresáři (tedy pro každou osobu) máte několik informací, jako je jméno, příjmení, adresa, e-mailová adresa a telefonní číslo.

Typickým způsobem, jak si taková data představit, je tabulka s řádky a sloupci. Z hlediska databáze se každý řádek často označuje jako záznam. Každý sloupec (někdy označovaný jako pole) obsahuje hodnotu pro každý typ dat: jméno, příjmení atd.

ID FirstName LastName Adresa E-mail Rozložení
1 Jim Abrus 210 100th St SE Orcas WA 98031 jim@contoso.com 555 0100
2 Terry Adams 1234 Main St. Seattle WA 99011 terry@cohowinery.com 555 0101

Pro většinu databázových tabulek musí tabulka obsahovat sloupec, který obsahuje jedinečný identifikátor, jako je číslo zákazníka, číslo účtu atd. Tento klíč se označuje jako primární klíč tabulky a slouží k identifikaci jednotlivých řádků v tabulce. V tomto příkladu je primárním klíčem adresáře sloupec ID.

Díky těmto základním znalostem databází jste připraveni se naučit, jak vytvořit jednoduchou databázi a provádět operace, jako je přidávání, úpravy a odstraňování dat.

Tip

Relační databáze

Data můžete ukládat mnoha způsoby, včetně textových souborů a tabulek. Pro většinu obchodních použití jsou ale data uložená v relační databázi.

Tento článek nezabízí příliš hluboko do databází. Může ale být užitečné, abyste se o nich trochu dozvěděli. V relační databázi jsou informace logicky rozdělené do samostatných tabulek. Například databáze pro školu může obsahovat samostatné tabulky pro studenty a pro nabídky předmětu. Databázový software (například SQL Server) podporuje výkonné příkazy, které umožňují dynamicky navazovat relace mezi tabulkami. Relační databázi můžete například použít k vytvoření logického vztahu mezi studenty a předměty, abyste vytvořili plán. Ukládání dat do samostatných tabulek snižuje složitost struktury tabulek a snižuje potřebu uchovávat redundantní data v tabulkách.

Vytvoření databáze

Tento postup ukazuje, jak vytvořit databázi s názvem SmallBakery pomocí návrhového nástroje SQL Server Compact Database, který je součástí nástroje WebMatrix. I když můžete databázi vytvořit pomocí kódu, obvyklejší je vytvořit databázi a databázové tabulky pomocí návrhového nástroje, jako je WebMatrix.

  1. Spusťte WebMatrix a na stránce Rychlý start klikněte na Web ze šablony.

  2. Vyberte Prázdný web, do pole Název lokality zadejte "SmallBakery" a klikněte na OK. Web se vytvoří a zobrazí ve službě WebMatrix.

  3. V levém podokně klikněte na pracovní prostor Databáze .

  4. Na pásu karet klikněte na Nová databáze. Vytvoří se prázdná databáze se stejným názvem jako váš web.

  5. V levém podokně rozbalte uzel SmallBakery.sdf a pak klikněte na Tabulky.

  6. Na pásu karet klikněte na Nová tabulka. WebMatrix otevře návrháře tabulky.

    [Snímek obrazovky ukazuje webovou matici, která otevírá návrháře tabulky.]

  7. Klikněte do sloupce Název a zadejte "Id".

  8. Ve sloupci Datový typ vyberte int.

  9. Nastavte možnosti Je primární klíč? a Je identifikace? na Ano.

    Jak název napovídá, znamená to, že je primární klíč sděluje databázi, že se bude jednat o primární klíč tabulky. Je identita sděluje databázi, že má automaticky vytvořit číslo ID pro každý nový záznam a přiřadit mu další pořadové číslo (počínaje číslem 1).

  10. Klikněte na další řádek. Editor spustí novou definici sloupce.

  11. Jako hodnotu Název zadejte "Název".

  12. Jako Datový typ zvolte nvarchar a nastavte délku na 50. Část nvarcharvar říká databázi, že data pro tento sloupec budou řetězec, jehož velikost se může v jednotlivých záznamech lišit. (Předpona n představuje národní, což znamená, že pole může obsahovat znaková data, která představují jakoukoli abecedu nebo systém zápisu – to znamená, že pole obsahuje data Unicode.)

  13. Možnost Povolit hodnoty Null nastavte na Ne. Tím se vynutí, že sloupec Name (Název ) nezůstane prázdný.

  14. Stejným postupem vytvořte sloupec s názvem Description. Nastavte datový typ na "nvarchar" a jako délku 50 a nastavte Povolit hodnoty Null na false.

  15. Vytvořte sloupec s názvem Cena. Nastavte Datový typ na "money" a nastavte Povolit hodnoty Null na false.

  16. V poli v horní části pojmenujte tabulku "Product".

    Po dokončení bude definice vypadat takto:

    [Snímek obrazovky ukazuje, jak bude definice vypadat po dokončení.]

  17. Stisknutím kombinace kláves Ctrl+S tabulku uložte.

Přidání dat do databáze

Teď můžete do databáze přidat ukázková data, se kterými budete pracovat později v tomto článku.

  1. V levém podokně rozbalte uzel SmallBakery.sdf a pak klikněte na Tabulky.

  2. Klikněte pravým tlačítkem na tabulku Product a potom klikněte na Data.

  3. V podokně úprav zadejte následující záznamy:

    Název Popis Cena
    Chléb Pečené čerstvé každý den. 2.99
    Jahodový shortcake Vyrobené z bio jahod z naší zahrady. 9.99
    Jablečný koláč Druhý jen do koláče vaší mámy. 12.99
    Pekanový koláč Pokud máte rádi pekany, je to pro vás. 10.99
    Citronový koláč Vyrobeno z nejlepších citronů na světě. 11.99
    Cupcakes Vaše děti a dítě ve tobě se budou líbit. 7.99

    Nezapomeňte, že do sloupce Id nemusíte nic zadávat. Při vytváření sloupce Id jste nastavili jeho vlastnost Je identita na hodnotu true, což způsobí, že se sloupec vyplní automaticky.

    Po zadání dat bude návrhář tabulky vypadat takto:

    [Snímek obrazovky ukazuje, jak bude návrhář tabulky vypadat, když se dokončí zadávání dat.]

  4. Zavřete kartu, která obsahuje data databáze.

Zobrazení dat z databáze

Jakmile budete mít databázi s daty, můžete tato data zobrazit na ASP.NET webové stránce. Pokud chcete vybrat řádky tabulky, které chcete zobrazit, použijte příkaz SQL, což je příkaz, který předáte do databáze.

  1. V levém podokně klikněte na pracovní prostor Soubory .

  2. V kořenovém adresáři webu vytvořte novou stránku CSHTML s názvem ListProducts.cshtml.

  3. Existující kód nahraďte následujícím kódem:

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

    V prvním bloku kódu otevřete soubor SmallBakery.sdf (databázi), který jste vytvořili dříve. Metoda Database.Open předpokládá, že soubor .sdf je ve složce App_Data vašeho webu. (Všimněte si, že nemusíte zadávat příponu .sdf – ve skutečnosti Open metoda nebude fungovat.)

    Poznámka

    Složka App_Data je speciální složka v ASP.NET, která slouží k ukládání datových souborů. Další informace najdete v části Připojení k databázi dále v tomto článku.

    Potom odešlete požadavek na dotaz databáze pomocí následujícího příkazu SQL Select :

    SELECT * FROM Product ORDER BY Name
    

    V příkazu identifikuje tabulku, Product která se má dotazovat. Znak * určuje, že dotaz má vrátit všechny sloupce z tabulky. (Pokud byste chtěli zobrazit jenom některé sloupce, mohli byste je vypsat jednotlivě a oddělit je čárkami.) Klauzule Order By určuje, jak by se data měla řadit – v tomto případě podle sloupce Název . To znamená, že data jsou seřazená abecedně podle hodnoty sloupce Name pro každý řádek.

    Kód v textu stránky vytvoří tabulku HTML, která se použije k zobrazení dat. Uvnitř elementu <tbody> použijete smyčku foreach k získání jednotlivých řádků dat vrácených dotazem. Pro každý řádek dat vytvoříte řádek tabulky HTML (<tr> element). Pak vytvoříte buňky tabulky HTML (<td> elementy) pro každý sloupec. Pokaždé, když projdete smyčkou, je další dostupný řádek z databáze v row proměnné (to nastavíte v příkazu foreach ). Pokud chcete z řádku získat jeden sloupec, můžete použít row.Name nebo row.Description nebo libovolný název požadovaného sloupce.

  4. Spusťte stránku v prohlížeči. (Před spuštěním se ujistěte, že je stránka vybraná v pracovním prostoru Soubory .) Na stránce se zobrazí seznam podobný tomuto:

    [Snímek obrazovky se seznamem, který stránka zobrazí v prohlížeči.]

Tip

Structured Query Language (SQL)

SQL je jazyk, který se používá ve většině relačních databází ke správě dat v databázi. Obsahuje příkazy, které umožňují načíst a aktualizovat data a které umožňují vytvářet, upravovat a spravovat databázové tabulky. SQL se liší od programovacího jazyka (jako je ten, který používáte ve WebMatrixu), protože u JAZYKa SQL jde o to, abyste databázi řekli, co chcete, a úkolem databáze je zjistit, jak získat data nebo provést úlohu. Tady jsou příklady některých příkazů SQL a jejich funkce:

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

Tím se načte sloupce Id, Name a Price ze záznamů v tabulce Product , pokud je hodnota Price větší než 10, a vrátí výsledky v abecedním pořadí na základě hodnot ve sloupci Name . Tento příkaz vrátí sadu výsledků dotazu, která obsahuje záznamy, které splňují kritéria, nebo prázdnou sadu, pokud se neshoduje žádný záznam.

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

Tím se vloží nový záznam do tabulky Product , sloupec Name (Název ) se nastaví na "Croissant", sloupec Description na "A flaky delight" a price na 1,99.

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

Tento příkaz odstraní záznamy v tabulce Product , jejichž sloupec s datem vypršení platnosti je dřívější než 1. leden 2008. (Předpokládá se, že tabulka Product (Produkt ) má takový sloupec samozřejmě.) Datum se sem zadává ve formátu MM/DD/RRRR, ale mělo by být zadáno ve formátu, který se používá pro vaše národní prostředí.

Příkazy Insert Into a Delete nevrací sady výsledků. Místo toho vrátí číslo, které udává, kolik záznamů bylo příkazem ovlivněno.

U některých z těchto operací (například vkládání a odstraňování záznamů) musí mít proces, který operaci požaduje, příslušná oprávnění v databázi. To je důvod, proč u produkčních databází často musíte při připojování k databázi zadat uživatelské jméno a heslo.

Existují desítky příkazů SQL, ale všechny mají podobný vzor. Pomocí příkazů SQL můžete vytvářet databázové tabulky, počítat počet záznamů v tabulce, počítat ceny a provádět mnoho dalších operací.

Vložení dat do databáze

V této části se dozvíte, jak vytvořit stránku, která uživatelům umožní přidat nový produkt do tabulky Databáze produktů . Po vložení nového záznamu o produktu se na stránce zobrazí aktualizovaná tabulka pomocí stránky ListProducts.cshtml , kterou jste vytvořili v předchozí části.

Stránka obsahuje ověření, aby se zajistilo, že data zadaná uživatelem jsou platná pro databázi. Například kód na stránce zajistí, že byla zadána hodnota pro všechny požadované sloupce.

  1. Na webu vytvořte nový soubor CSHTML s názvem InsertProducts.cshtml.

  2. Existující kód nahraďte následujícím kódem:

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

    Tělo stránky obsahuje formulář HTML se třemi textovými poli, která uživatelům umožňují zadat název, popis a cenu. Když uživatelé kliknou na tlačítko Vložit , kód v horní části stránky otevře připojení k databázi SmallBakery.sdf . Pak pomocí objektu získáte hodnoty, které uživatel odeslal Request , a přiřadíte je k místním proměnným.

    Pokud chcete ověřit, že uživatel zadal hodnotu pro každý požadovaný sloupec, zaregistrujte každý <input> prvek, který chcete ověřit:

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

    Pomocník Validation zkontroluje, jestli je v každém z polí, která jste zaregistrovali, nějaká hodnota. To, jestli všechna pole prošla ověřením, můžete otestovat tak, že zkontrolujete Validation.IsValid(), což obvykle provádíte před tím, než zpracujete informace, které od uživatele získáte:

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

    (Operátor && znamená A – tento test je Pokud se jedná o odeslání formuláře A všechna pole prošla ověřením.)

    Pokud jsou všechny sloupce ověřené (žádné nebyly prázdné), pokračujte vytvořením příkazu SQL, který vloží data, a pak ho spusťte, jak je znázorněno níže:

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

    Hodnoty, které chcete vložit, zahrňte zástupné symboly parametrů (@0, @1, ). @2

    Poznámka

    Jako bezpečnostní opatření vždy předávejte do příkazu SQL hodnoty pomocí parametrů, jak vidíte v předchozím příkladu. To vám dává možnost ověřit data uživatele a navíc pomáhá chránit před pokusy o odeslání škodlivých příkazů do databáze (někdy označované jako útoky prostřednictvím injektáže SQL).

    Ke spuštění dotazu použijete tento příkaz a předáte mu proměnné obsahující hodnoty, které nahradí zástupné symboly:

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

    Insert Into Po provedení příkazu odešlete uživatele na stránku se seznamem produktů pomocí tohoto řádku:

    Response.Redirect("~/ListProducts");
    

    Pokud ověření neproběhne úspěšně, vložení přeskočíte. Místo toho máte na stránce pomocnou rutinu, která může zobrazit kumulované chybové zprávy (pokud jsou k dispozici):

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

    Všimněte si, že blok stylu ve značkách obsahuje definici třídy CSS s názvem .validation-summary-errors. Toto je název třídy CSS, která se ve výchozím nastavení používá pro <div> element, který obsahuje chyby ověřování. V tomto případě třída CSS určuje, že chyby souhrnu ověření jsou zobrazeny červeně a tučně, ale můžete definovat .validation-summary-errors třídu pro zobrazení libovolného formátování.

Testování stránky Vložení

  1. Zobrazte stránku v prohlížeči. Stránka zobrazí formulář podobný tomu, který je znázorněný na následujícím obrázku.

    [Snímek obrazovky s formulářem, který se zobrazí na stránce v prohlížeči.]

  2. Zadejte hodnoty pro všechny sloupce, ale nezapomeňte nechat sloupec Price prázdný.

  3. Klikněte na Vložit. Na stránce se zobrazí chybová zpráva, jak je znázorněno na následujícím obrázku. (Nevytvořil se žádný nový záznam.)

    [Snímek obrazovky zobrazuje chybovou zprávu.]

  4. Vyplňte formulář úplně a klikněte na Vložit. Tentokrát se zobrazí stránka ListProducts.cshtml s novým záznamem.

Aktualizace dat v databázi

Po zadání dat do tabulky může být potřeba je aktualizovat. Tento postup ukazuje, jak vytvořit dvě stránky, které jsou podobné těm, které jste vytvořili pro vložení dat dříve. Na první stránce se zobrazí produkty a uživatelé si můžou vybrat produkty, které chtějí změnit. Druhá stránka umožňuje uživatelům skutečně provést úpravy a uložit je.

Poznámka

Důležité Na produkčním webu obvykle omezíte, kdo může provádět změny dat. Informace o tom, jak nastavit členství a jak autorizovat uživatele k provádění úkolů na webu, najdete v tématu Přidání zabezpečení a členství na web ASP.NET webových stránek.

  1. Na webu vytvořte nový soubor CSHTML s názvem EditProducts.cshtml.

  2. Nahraďte existující kód v souboru následujícím kódem:

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

    Jediným rozdílem mezi touto stránkou a stránkou ListProducts.cshtml z předchozích verzí je, že tabulka HTML na této stránce obsahuje další sloupec, který zobrazuje odkaz pro úpravy . Když kliknete na tento odkaz, přejdete na stránku UpdateProducts.cshtml (kterou vytvoříte jako další), kde můžete vybraný záznam upravit.

    Podívejte se na kód, který vytvoří odkaz Upravit :

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

    Tím se vytvoří element HTML <a> , jehož href atribut je nastaven dynamicky. Atribut href určuje stránku, která se má zobrazit, když uživatel klikne na odkaz. Předá Id také hodnotu aktuálního řádku do odkazu. Po spuštění stránky může zdroj stránky obsahovat odkazy, jako jsou tyto:

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

    Všimněte si, že href atribut je nastavený na UpdateProducts/n, kde n je číslo produktu. Když uživatel klikne na jeden z těchto odkazů, výsledná adresa URL bude vypadat přibližně takto:

    http://localhost:18816/UpdateProducts/6

    Jinými slovy, číslo produktu, který se má upravit, bude předáno v adrese URL.

  3. Zobrazte stránku v prohlížeči. Na stránce se data zobrazí v podobném formátu:

    [Snímek obrazovky znázorňuje data zobrazená na stránce v prohlížeči.]

    Dále vytvoříte stránku, která uživatelům umožní data skutečně aktualizovat. Stránka aktualizace obsahuje ověření pro ověření dat, která uživatel zadá. Kód na stránce například zajistí, aby byla zadána hodnota pro všechny požadované sloupce.

  4. Na webu vytvořte nový soubor CSHTML s názvem UpdateProducts.cshtml.

  5. Nahraďte existující kód v souboru následujícím kódem.

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

    Text stránky obsahuje formulář HTML, ve kterém se zobrazuje produkt a kde ho uživatelé můžou upravovat. Pokud chcete produkt zobrazit, použijte tento příkaz SQL:

    SELECT * FROM Product WHERE Id=@0
    

    Tím se vybere produkt, jehož ID odpovídá hodnotě předané v parametru @0 . (Vzhledem k tomu, že ID je primární klíč, a proto musí být jedinečné, lze tímto způsobem vybrat jenom jeden záznam produktu.) Pokud chcete získat hodnotu ID, která se má předat tomuto Select příkazu, můžete pomocí následující syntaxe přečíst hodnotu, která se předá na stránku jako součást adresy URL:

    var ProductId  = UrlData[0];
    

    Pokud chcete záznam o produktu skutečně načíst, použijte metodu QuerySingle , která vrátí jenom jeden záznam:

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

    Do proměnné se vrátí row jeden řádek. Data můžete získat z každého sloupce a přiřadit je k místním proměnným, například takto:

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

    Ve značkách formuláře se tyto hodnoty automaticky zobrazují v jednotlivých textových polích pomocí vloženého kódu, jako je tento:

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

    Tato část kódu zobrazí záznam o produktu, který se má aktualizovat. Po zobrazení záznamu může uživatel upravovat jednotlivé sloupce.

    Když uživatel odešle formulář kliknutím na tlačítko Aktualizovat , kód v bloku se if(IsPost) spustí. Tím se z objektu Request načte hodnoty uživatele, uloží se hodnoty do proměnných a ověří se vyplnění jednotlivých sloupců. Pokud ověření projde, kód vytvoří následující příkaz SQL Update:

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

    V příkazu SQL Update zadáte každý sloupec, který se má aktualizovat, a hodnotu, na kterou se má nastavit. V tomto kódu se hodnoty zadají pomocí zástupných symbolů @0parametrů , @1, @2atd. (Jak je uvedeno výše, z důvodu zabezpečení byste vždy měli předávat hodnoty do příkazu SQL pomocí parametrů.)

    Při volání db.Execute metody předáte proměnné, které obsahují hodnoty v pořadí, které odpovídá parametrům v příkazu SQL:

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

    Update Po spuštění příkazu zavoláte následující metodu, aby se uživatel přesměroval zpět na stránku pro úpravy:

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

    Výsledkem je, že uživatel uvidí aktualizovaný výpis dat v databázi a může upravit jiný produkt.

  6. Uložte stránku.

  7. Spusťte stránku EditProducts.cshtml (ne stránku aktualizace) a kliknutím na Upravit vyberte produkt, který chcete upravit. Zobrazí se stránka UpdateProducts.cshtml zobrazující vybraný záznam.

    [Snímek obrazovky se stránkou Update Products (Aktualizovat produkty) a vybraným záznamem.]

  8. Proveďte změnu a klikněte na Aktualizovat. Seznam produktů se znovu zobrazí s aktualizovanými daty.

Odstranění dat v databázi

V této části se dozvíte, jak uživatelům umožnit odstranění produktu z tabulky Databáze produktů . Příklad se skládá ze dvou stránek. Na první stránce uživatelé vyberou záznam, který se mají odstranit. Záznam, který se má odstranit, se pak zobrazí na druhé stránce, která jim umožní potvrdit, že chce záznam odstranit.

Poznámka

Důležité Na produkčním webu obvykle omezíte, kdo může provádět změny dat. Informace o tom, jak nastavit členství a jak autorizovat uživatele k provádění úkolů na webu, najdete v tématu Přidání zabezpečení a členství na webu ASP.NET webových stránek.

  1. Na webu vytvořte nový soubor CSHTML s názvem ListProductsForDelete.cshtml.

  2. Nahraďte existující kód následujícím kódem:

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

    Tato stránka je podobná stránce EditProducts.cshtml z předchozích verzí. Místo zobrazení odkazu pro úpravy pro každý produkt se ale zobrazí odkaz Odstranit . Odkaz Odstranit se vytvoří pomocí následujícího vloženého kódu v kódu:

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

    Tím se vytvoří adresa URL, která bude vypadat takto, když uživatelé kliknou na odkaz:

    http://<server>/DeleteProduct/4

    Adresa URL zavolá stránku s názvem DeleteProduct.cshtml (kterou vytvoříte příště) a předá jí ID produktu, který chcete odstranit (tady 4).

  3. Uložte soubor, ale nechte ho otevřený.

  4. Vytvořte další soubor CHTML s názvem DeleteProduct.cshtml. Stávající obsah nahraďte následujícím kódem:

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

    Tato stránka je volána ListProductsForDelete.cshtml a umožňuje uživatelům potvrdit, že chtějí odstranit produkt. Pokud chcete zobrazit seznam produktu, který se má odstranit, získáte ID produktu, který chcete odstranit z adresy URL, pomocí následujícího kódu:

    var ProductId = UrlData[0];
    

    Stránka pak uživatele vyzve, aby kliknutím na tlačítko záznam skutečně odstranil. Toto je důležité bezpečnostní opatření: Když na webu provádíte citlivé operace, jako je aktualizace nebo odstranění dat, měly by se tyto operace vždy provádět pomocí operace POST, nikoli operace GET. Pokud je váš web nastavený tak, aby bylo možné provést operaci odstranění pomocí operace GET, může kdokoli předat adresu URL, jako http://<server>/DeleteProduct/4 je, a odstranit z databáze, co chce. Přidáním potvrzení a kódováním stránky tak, aby odstranění bylo možné provést pouze pomocí post, přidáte do svého webu míru zabezpečení.

    Skutečná operace odstranění se provede pomocí následujícího kódu, který nejprve potvrdí, že se jedná o operaci post a že ID není prázdné:

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

    Kód spustí příkaz SQL, který odstraní zadaný záznam a pak přesměruje uživatele zpět na stránku výpisu.

  5. Spusťte ListProductsForDelete.cshtml v prohlížeči.

    [Snímek obrazovky ukazuje spuštěné seznamy produktů pro odstranění tečky CSHTML v prohlížeči.]

  6. Klikněte na odkaz Odstranit u některého z produktů. Zobrazí se stránka DeleteProduct.cshtml , která potvrzuje, že chcete tento záznam odstranit.

  7. Klikněte na tlačítko Odstranit. Záznam produktu se odstraní a stránka se aktualizuje aktualizovaným výpisem produktů.

Tip

Připojení k databázi

K databázi se můžete připojit dvěma způsoby. První je použít metodu Database.Open a zadat název souboru databáze (bez přípony .sdf ):

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

Metoda Open předpokládá, že parametr .soubor sdf je ve složce App_Data webu. Tato složka je navržená speciálně pro uchovávání dat. Má například příslušná oprávnění k tomu, aby web mohl číst a zapisovat data, a z bezpečnostních důvodů webMatrix neumožňuje přístup k souborům z této složky.

Druhým způsobem je použití připojovacího řetězce. Připojovací řetězec obsahuje informace o tom, jak se připojit k databázi. Může obsahovat cestu k souboru nebo název SQL Server databáze na místním nebo vzdáleném serveru spolu s uživatelským jménem a heslem pro připojení k tomuto serveru. (Pokud data uchováváte v centrálně spravované verzi SQL Server, například v lokalitě poskytovatele hostingu, vždy použijete připojovací řetězec k určení informací o připojení k databázi.)

V nástroji WebMatrix jsou připojovací řetězce obvykle uloženy v souboru XML s názvemWeb.config. Jak název napovídá, můžete použít souborWeb.config v kořenovém adresáři webu k uložení konfiguračních informací o lokalitě, včetně všech připojovacích řetězců, které váš web může vyžadovat. Příklad připojovacího řetězce v souboruWeb.config může vypadat takto. Poznámka $CREDENTIAL_PLACEHOLDER$ je zástupný symbol pro pár klíč/hodnota hesla:

<?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>

V tomto příkladu připojovací řetězec odkazuje na databázi v instanci SQL Server, která někde běží na serveru (na rozdíl od místního souboru .sdf). Pro a byste museli nahradit odpovídající názvy myServer a myDatabasezadat SQL Server přihlašovací hodnoty pro username a password. (Hodnoty uživatelského jména a hesla nemusí být nutně stejné jako vaše přihlašovací údaje systému Windows nebo jako hodnoty, které vám poskytl poskytovatel hostingu pro přihlášení k jejich serverům. Přesné hodnoty, které potřebujete, se obraťte na správce.)

Metoda Database.Open je flexibilní, protože umožňuje předat buď název databázového souboru .sdf , nebo název připojovacího řetězce, který je uložený v souboruWeb.config . Následující příklad ukazuje, jak se připojit k databázi pomocí připojovacího řetězce znázorněného v předchozím příkladu:

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

Jak je uvedeno, Database.Open metoda umožňuje předat název databáze nebo připojovací řetězec a zjistí, který použít. To je velmi užitečné při nasazování (publikování) webu. Při vývoji a testování webu můžete použít soubor .sdf ve složce App_Data . Když pak přesunete web na produkční server, můžete v souboru Web.config použít připojovací řetězec, který má stejný název jako váš soubor .sdf , ale odkazuje na databázi poskytovatele hostingu – to vše bez nutnosti změny kódu.

Nakonec, pokud chcete pracovat přímo s připojovacím řetězcem, můžete metodu Database.OpenConnectionString volat a předat jí skutečný připojovací řetězec místo názvu v souboruWeb.config . To může být užitečné v situacích, kdy z nějakého důvodu nemáte přístup k připojovacímu řetězci (nebo hodnotám v něm, jako je název souboru .sdf ), dokud stránka neběží. Ve většině scénářů ale můžete použít postup Database.Open popsaný v tomto článku.

Další materiály