Sdílet prostřednictvím


Členství a správa

Erik Reitan

Tato série kurzů vás naučí základy vytváření ASP.NET Web Forms aplikace pomocí ASP.NET 4.5 a Microsoft Visual Studio Express 2013 pro web. K této sérii kurzů je k dispozici Visual Studio 2013 projekt se zdrojovým kódem jazyka C#.

V tomto kurzu se dozvíte, jak aktualizovat ukázkovou aplikaci Wingtip Toys, abyste přidali vlastní roli a použili ASP.NET Identity. Ukazuje také, jak implementovat stránku správy, ze které může uživatel s vlastní rolí přidávat a odebírat produkty z webu.

ASP.NET Identity je systém členství, který se používá k vytváření ASP.NET webové aplikace a je k dispozici ve ASP.NET 4.5. ASP.NET Identity se používá v šabloně projektu Visual Studio 2013 Web Forms a také v šablonách pro ASP.NET MVC, ASP.NET Webové rozhraní API a ASP.NET jednostránkovou aplikaci. Můžete také konkrétně nainstalovat systém ASP.NET Identity pomocí NuGetu, když začnete s prázdnou webovou aplikací. V této sérii kurzů ale použijete Web Forms projecttemplate, která zahrnuje systém identit ASP.NET. ASP.NET Identity usnadňuje integraci dat profilů specifických pro uživatele s daty aplikací. ASP.NET Identity také umožňuje zvolit model trvalosti pro profily uživatelů ve vaší aplikaci. Data můžete ukládat do SQL Server databáze nebo jiného úložiště dat, včetně úložišť dat NoSQL, jako jsou tabulky Windows Azure Storage.

Tento kurz vychází z předchozího kurzu s názvem "Checkout and Payment with PayPal" v sérii kurzů wingtip Toys.

Naučíte se:

  • Použití kódu k přidání vlastní role a uživatele do aplikace
  • Jak omezit přístup ke složce a stránce pro správu.
  • Jak poskytnout navigaci pro uživatele, který patří do vlastní role.
  • Jak použít vazbu modelu k naplnění ovládacího prvku DropDownList kategoriemi produktů.
  • Jak nahrát soubor do webové aplikace pomocí ovládacího prvku FileUpload .
  • Použití ověřovacích ovládacích prvků k implementaci ověřování vstupu
  • Postup přidání a odebrání produktů z aplikace

Tento kurz zahrnuje tyto funkce:

  • ASP.NET Identity
  • Konfigurace a autorizace
  • Vazby modelu
  • Nenápadné ověřování

ASP.NET Web Forms poskytuje možnosti členství. Pomocí výchozí šablony máte předdefinované funkce členství, které můžete okamžitě použít při spuštění aplikace. V tomto kurzu se dozvíte, jak pomocí ASP.NET Identity přidat vlastní roli a přiřadit k této roli uživatele. Dozvíte se, jak omezit přístup ke složce pro správu. Do složky pro správu přidáte stránku, která uživateli s vlastní rolí umožní přidávat a odebírat produkty a zobrazovat náhled produktu po jeho přidání.

Přidání vlastní role

Pomocí ASP.NET Identity můžete přidat vlastní roli a přiřadit k této roli uživatele pomocí kódu.

  1. V Průzkumník řešení klikněte pravým tlačítkem na složku Logika a vytvořte novou třídu.

  2. Pojmenujte novou třídu RoleActions.cs.

  3. Upravte kód tak, aby se zobrazil takto:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace WingtipToys.Logic
    {
        internal class RoleActions
        {
        }
    }
    
  4. V Průzkumník řešení otevřete soubor Global.asax.cs.

  5. Upravte soubor Global.asax.cs přidáním žlutě zvýrazněného kódu tak, aby se zobrazil takto:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Optimization;
    using System.Web.Routing;
    using System.Web.Security;
    using System.Web.SessionState;
    using System.Data.Entity;
    using WingtipToys.Models;
    using WingtipToys.Logic;
    
    namespace WingtipToys
    {
        public class Global : HttpApplication
        {
            void Application_Start(object sender, EventArgs e)
            {
              // Code that runs on application startup
              RouteConfig.RegisterRoutes(RouteTable.Routes);
              BundleConfig.RegisterBundles(BundleTable.Bundles);
    
              // Initialize the product database.
              Database.SetInitializer(new ProductDatabaseInitializer());
    
              // Create the custom role and user.
              RoleActions roleActions = new RoleActions();
              roleActions.AddUserAndRole();
            }
        }
    }
    
  6. Všimněte si, že AddUserAndRole je červeně podtržené. Poklikejte na kód AddUserAndRole.
    Písmeno "A" na začátku zvýrazněné metody bude podtrženo.

  7. Najeďte myší na písmeno "A" a klikněte na uživatelské rozhraní, které umožňuje vygenerovat zástupný kód metody pro metodu AddUserAndRole .

    Členství a správa – zástupný kód generování metody

  8. Klikněte na možnost s názvem:
    Generate method stub for "AddUserAndRole" in "WingtipToys.Logic.RoleActions"

  9. Otevřete soubor RoleActions.cs ze složky Logic .
    Metoda AddUserAndRole byla přidána do souboru třídy.

  10. Upravte soubor RoleActions.cs odebráním NotImplementedException a přidáním kódu zvýrazněného žlutě, aby se zobrazil takto:

    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Linq;
    using System.Web;
    using WingtipToys.Models;
    using Microsoft.AspNet.Identity;
    using Microsoft.AspNet.Identity.EntityFramework;
    
    namespace WingtipToys.Logic
    {
      internal class RoleActions
      {
        internal void AddUserAndRole()
        {
          // Access the application context and create result variables.
          Models.ApplicationDbContext context = new ApplicationDbContext();
          IdentityResult IdRoleResult;
          IdentityResult IdUserResult;
    
          // Create a RoleStore object by using the ApplicationDbContext object. 
          // The RoleStore is only allowed to contain IdentityRole objects.
          var roleStore = new RoleStore<IdentityRole>(context);
    
          // Create a RoleManager object that is only allowed to contain IdentityRole objects.
          // When creating the RoleManager object, you pass in (as a parameter) a new RoleStore object. 
          var roleMgr = new RoleManager<IdentityRole>(roleStore);
    
          // Then, you create the "canEdit" role if it doesn't already exist.
          if (!roleMgr.RoleExists("canEdit"))
          {
            IdRoleResult = roleMgr.Create(new IdentityRole { Name = "canEdit" });
          }
    
          // Create a UserManager object based on the UserStore object and the ApplicationDbContext  
          // object. Note that you can create new objects and use them as parameters in
          // a single line of code, rather than using multiple lines of code, as you did
          // for the RoleManager object.
          var userMgr = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
          var appUser = new ApplicationUser
          {
            UserName = "canEditUser@wingtiptoys.com",
            Email = "canEditUser@wingtiptoys.com"
          };
          IdUserResult = userMgr.Create(appUser, ConfigurationManager.AppSettings["AppUserPasswordKey"]);
    
          // If the new "canEdit" user was successfully created, 
          // add the "canEdit" user to the "canEdit" role. 
          if (!userMgr.IsInRole(userMgr.FindByEmail("canEditUser@wingtiptoys.com").Id, "canEdit"))
          {
            IdUserResult = userMgr.AddToRole(userMgr.FindByEmail("canEditUser@wingtiptoys.com").Id, "canEdit");
          }
        }
      }
    }
    

Výše uvedený kód nejprve vytvoří kontext databáze pro databázi členství. Databáze členství je také uložena jako soubor .mdf ve složce App_Data . Tuto databázi budete moct zobrazit, jakmile se k této webové aplikaci přihlásí první uživatel.

Poznámka

Pokud chcete uložit data členství společně s daty o produktech, můžete zvážit použití stejného DbContext , který jste použili k uložení dat o produktu ve výše uvedeném kódu.

Interní klíčové slovo je modifikátor přístupu pro typy (například třídy) a členy typu (jako jsou metody nebo vlastnosti). Interní typy nebo členy jsou přístupné pouze v souborech obsažených ve stejném sestavení (.dll souboru). Při sestavování aplikace se vytvoří soubor sestavení (.dll), který obsahuje kód, který se spustí při spuštění aplikace.

Objekt RoleStore , který poskytuje správu rolí, se vytvoří na základě kontextu databáze.

Poznámka

Všimněte si, že při RoleStore vytvoření objektu se používá obecný IdentityRole typ. To znamená, že objekt RoleStore může obsahovat IdentityRole pouze objekty. Také pomocí obecných typů se prostředky v paměti zpracovávají lépe.

Dále se RoleManager objekt vytvoří na základě objektu RoleStore , který jste právě vytvořili. RoleManager objekt zveřejňuje rozhraní API související s rolí, které lze použít k automatickému ukládání změn do objektu RoleStore. Objekt RoleManager může obsahovat IdentityRole pouze objekty, protože kód používá <IdentityRole> obecný typ.

Voláním RoleExists metody určíte, zda je v databázi členství přítomna role "canEdit". Pokud není, vytvoříte roli.

Vytvoření objektu UserManager se zdá být složitější než ovládací RoleManager prvek, je to ale téměř stejné. Je kódován pouze na jednom řádku, nikoli na několika. Parametr, který předáváte, se zde vytváří jako nový objekt obsažený v závorkách.

Dále vytvoříte uživatele "canEditUser" vytvořením nového ApplicationUser objektu. Pokud pak uživatele úspěšně vytvoříte, přidáte ho do nové role.

Poznámka

Zpracování chyb bude aktualizováno během kurzu "ASP.NET zpracování chyb" dále v této sérii kurzů.

Při příštím spuštění aplikace se uživatel s názvem "canEditUser" přidá jako role s názvem "canEdit" aplikace. Později v tomto kurzu se přihlásíte jako uživatel "canEditUser", abyste zobrazili další možnosti, které přidáte během tohoto kurzu. Podrobnosti rozhraní API o ASP.NET Identity najdete v tématu Obor názvů Microsoft.AspNet.Identity. Další podrobnosti o inicializaci systému ASP.NET Identity najdete v tématu AspnetIdentitySample.

Omezení přístupu ke stránce pro správu

Ukázková aplikace Wingtip Toys umožňuje anonymním uživatelům i přihlášeným uživatelům prohlížet a nakupovat produkty. Přihlášený uživatel, který má vlastní roli canEdit, však může získat přístup ke stránce s omezeným přístupem, aby mohl přidávat a odebírat produkty.

Přidání složky a stránky pro správu

Dále vytvoříte složku s názvem Správa pro uživatele "canEditUser", který patří do vlastní role ukázkové aplikace Wingtip Toys.

  1. V Průzkumník řešení klikněte pravým tlačítkem na název projektu (Wingtip Toys) a vyberte Přidat ->Nová složka.
  2. Pojmenujte novou složku Správa.
  3. Klikněte pravým tlačítkem na složku Správa a pak vyberte Přidat ->Nová položka.
    Zobrazí se dialogové okno Přidat novou položku.
  4. Na levé straně vyberte skupinu Šablony Visual C#->Web . V prostředním seznamu vyberte Webový formulář se stránkou předlohy, pojmenujte ho AdminPage.aspxa pak vyberte Přidat.
  5. Jako stránku předlohy vyberte soubor Site.Master a pak zvolte OK.

Přidání souboru Web.config

Přidáním souboruWeb.config do složky Správa můžete omezit přístup ke stránce obsažené ve složce.

  1. Klikněte pravým tlačítkem na složku Správa a vyberte Přidat ->Nová položka.
    Zobrazí se dialogové okno Přidat novou položku.

  2. V seznamu webových šablon Visual C# vyberte v prostředním seznamu Konfigurační soubor webu, přijměte výchozí název Web.configa pak vyberte Přidat.

  3. Nahraďte existující obsah XML v souboruWeb.config následujícím kódem:

    <?xml version="1.0"?>
    <configuration>
      <system.web>
        <authorization>
          <allow roles="canEdit"/>
          <deny users="*"/>
        </authorization>
      </system.web>
    </configuration>
    

Uložte souborWeb.config . SouborWeb.config určuje, že ke stránce obsažené ve složce Správa má přístup pouze uživatel, který patří do role "canEdit" aplikace.

Včetně navigace s vlastními rolemi

Pokud chcete uživateli vlastní role "canEdit" povolit přechod do části správy aplikace, musíte přidat odkaz na stránku Site.Master . Odkaz na Správa a přístup k části správy budou moct zobrazit jenom uživatelé, kteří patří do role canEdit.

  1. V Průzkumník řešení vyhledejte a otevřete stránku Site.Master.

  2. Pokud chcete vytvořit odkaz pro uživatele role "canEdit", přidejte žlutě zvýrazněné značky do následujícího neuspořádaného prvku list <ul> , aby seznam vypadal takto:

    <ul class="nav navbar-nav">
        <li><a runat="server" id="adminLink" visible="false" 
          href="~/Admin/AdminPage">Admin</a></li>
        <li><a runat="server" href="~/">Home</a></li>
        <li><a runat="server" href="~/About">About</a></li>
        <li><a runat="server" href="~/Contact">Contact</a></li>
        <li><a runat="server" href="~/ProductList">Products</a></li>
        <li><a runat="server" href="~/ShoppingCart" 
          ID="cartCount">&nbsp;</a></li>
    </ul>
    
  3. Otevřete soubor Site.Master.cs . Odkaz Správa zviditelněte pouze uživateli "canEditUser", a to přidáním žlutě zvýrazněného kódu do obslužné rutinyPage_Load. Obslužná rutina Page_Load se zobrazí takto:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (HttpContext.Current.User.IsInRole("canEdit"))
        {
            adminLink.Visible = true;
        }
    }
    

Když se stránka načte, kód zkontroluje, jestli přihlášený uživatel má roli "canEdit". Pokud uživatel patří do role "canEdit", element span obsahující odkaz na stránku AdminPage.aspx (a následně odkaz uvnitř spanu) je viditelný.

Povolení správy produktů

Zatím jste vytvořili roli "canEdit" a přidali jste uživatele "canEditUser", složku pro správu a stránku pro správu. Nastavili jste přístupová práva pro složku a stránku správy a přidali jste navigační odkaz pro uživatele role "canEdit" do aplikace. Dále přidáte značky na stránku AdminPage.aspx a kód do souboru kódu AdminPage.aspx.cs , který uživateli s rolí "canEdit" umožní přidávat a odebírat produkty.

  1. V Průzkumník řešení otevřete soubor AdminPage.aspx ze složky Správa.

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

    <%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="AdminPage.aspx.cs" Inherits="WingtipToys.Admin.AdminPage" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
        <h1>Administration</h1>
        <hr />
        <h3>Add Product:</h3>
        <table>
            <tr>
                <td><asp:Label ID="LabelAddCategory" runat="server">Category:</asp:Label></td>
                <td>
                    <asp:DropDownList ID="DropDownAddCategory" runat="server" 
                        ItemType="WingtipToys.Models.Category" 
                        SelectMethod="GetCategories" DataTextField="CategoryName" 
                        DataValueField="CategoryID" >
                    </asp:DropDownList>
                </td>
            </tr>
            <tr>
                <td><asp:Label ID="LabelAddName" runat="server">Name:</asp:Label></td>
                <td>
                    <asp:TextBox ID="AddProductName" runat="server"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" Text="* Product name required." ControlToValidate="AddProductName" SetFocusOnError="true" Display="Dynamic"></asp:RequiredFieldValidator>
                </td>
            </tr>
            <tr>
                <td><asp:Label ID="LabelAddDescription" runat="server">Description:</asp:Label></td>
                <td>
                    <asp:TextBox ID="AddProductDescription" runat="server"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" Text="* Description required." ControlToValidate="AddProductDescription" SetFocusOnError="true" Display="Dynamic"></asp:RequiredFieldValidator>
                </td>
            </tr>
            <tr>
                <td><asp:Label ID="LabelAddPrice" runat="server">Price:</asp:Label></td>
                <td>
                    <asp:TextBox ID="AddProductPrice" runat="server"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" Text="* Price required." ControlToValidate="AddProductPrice" SetFocusOnError="true" Display="Dynamic"></asp:RequiredFieldValidator>
                    <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" Text="* Must be a valid price without $." ControlToValidate="AddProductPrice" SetFocusOnError="True" Display="Dynamic" ValidationExpression="^[0-9]*(\.)?[0-9]?[0-9]?$"></asp:RegularExpressionValidator>
                </td>
            </tr>
            <tr>
                <td><asp:Label ID="LabelAddImageFile" runat="server">Image File:</asp:Label></td>
                <td>
                    <asp:FileUpload ID="ProductImage" runat="server" />
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator4" runat="server" Text="* Image path required." ControlToValidate="ProductImage" SetFocusOnError="true" Display="Dynamic"></asp:RequiredFieldValidator>
                </td>
            </tr>
        </table>
        <p></p>
        <p></p>
        <asp:Button ID="AddProductButton" runat="server" Text="Add Product" OnClick="AddProductButton_Click"  CausesValidation="true"/>
        <asp:Label ID="LabelAddStatus" runat="server" Text=""></asp:Label>
        <p></p>
        <h3>Remove Product:</h3>
        <table>
            <tr>
                <td><asp:Label ID="LabelRemoveProduct" runat="server">Product:</asp:Label></td>
                <td><asp:DropDownList ID="DropDownRemoveProduct" runat="server" ItemType="WingtipToys.Models.Product" 
                        SelectMethod="GetProducts" AppendDataBoundItems="true" 
                        DataTextField="ProductName" DataValueField="ProductID" >
                    </asp:DropDownList>
                </td>
            </tr>
        </table>
        <p></p>
        <asp:Button ID="RemoveProductButton" runat="server" Text="Remove Product" OnClick="RemoveProductButton_Click" CausesValidation="false"/>
        <asp:Label ID="LabelRemoveStatus" runat="server" Text=""></asp:Label>
    </asp:Content>
    
  3. Potom otevřete soubor s kódem AdminPage.aspx.cs tak, že kliknete pravým tlačítkem na AdminPage.aspx a kliknete na Zobrazit kód.

  4. Nahraďte existující kód v souboru kódu AdminPage.aspx.cs následujícím kódem:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using WingtipToys.Models;
    using WingtipToys.Logic;
    
    namespace WingtipToys.Admin
    {
      public partial class AdminPage : System.Web.UI.Page
      {
        protected void Page_Load(object sender, EventArgs e)
        {
          string productAction = Request.QueryString["ProductAction"];
          if (productAction == "add")
          {
            LabelAddStatus.Text = "Product added!";
          }
    
          if (productAction == "remove")
          {
            LabelRemoveStatus.Text = "Product removed!";
          }
        }
    
        protected void AddProductButton_Click(object sender, EventArgs e)
        {
          Boolean fileOK = false;
          String path = Server.MapPath("~/Catalog/Images/");
          if (ProductImage.HasFile)
          {
            String fileExtension = System.IO.Path.GetExtension(ProductImage.FileName).ToLower();
            String[] allowedExtensions = { ".gif", ".png", ".jpeg", ".jpg" };
            for (int i = 0; i < allowedExtensions.Length; i++)
            {
              if (fileExtension == allowedExtensions[i])
              {
                fileOK = true;
              }
            }
          }
    
          if (fileOK)
          {
            try
            {
              // Save to Images folder.
              ProductImage.PostedFile.SaveAs(path + ProductImage.FileName);
              // Save to Images/Thumbs folder.
              ProductImage.PostedFile.SaveAs(path + "Thumbs/" + ProductImage.FileName);
            }
            catch (Exception ex)
            {
              LabelAddStatus.Text = ex.Message;
            }
    
            // Add product data to DB.
            AddProducts products = new AddProducts();
            bool addSuccess = products.AddProduct(AddProductName.Text, AddProductDescription.Text,
                AddProductPrice.Text, DropDownAddCategory.SelectedValue, ProductImage.FileName);
            if (addSuccess)
            {
              // Reload the page.
              string pageUrl = Request.Url.AbsoluteUri.Substring(0, Request.Url.AbsoluteUri.Count() - Request.Url.Query.Count());
              Response.Redirect(pageUrl + "?ProductAction=add");
            }
            else
            {
              LabelAddStatus.Text = "Unable to add new product to database.";
            }
          }
          else
          {
            LabelAddStatus.Text = "Unable to accept file type.";
          }
        }
    
        public IQueryable GetCategories()
        {
          var _db = new WingtipToys.Models.ProductContext();
          IQueryable query = _db.Categories;
          return query;
        }
    
        public IQueryable GetProducts()
        {
          var _db = new WingtipToys.Models.ProductContext();
          IQueryable query = _db.Products;
          return query;
        }
    
        protected void RemoveProductButton_Click(object sender, EventArgs e)
        {
          using (var _db = new WingtipToys.Models.ProductContext())
          {
            int productId = Convert.ToInt16(DropDownRemoveProduct.SelectedValue);
            var myItem = (from c in _db.Products where c.ProductID == productId select c).FirstOrDefault();
            if (myItem != null)
            {
              _db.Products.Remove(myItem);
              _db.SaveChanges();
    
              // Reload the page.
              string pageUrl = Request.Url.AbsoluteUri.Substring(0, Request.Url.AbsoluteUri.Count() - Request.Url.Query.Count());
              Response.Redirect(pageUrl + "?ProductAction=remove");
            }
            else
            {
              LabelRemoveStatus.Text = "Unable to locate product.";
            }
          }
        }
      }
    }
    

V kódu, který jste zadali pro soubor kódu AdminPage.aspx.cs , třída s názvem AddProducts provede skutečnou práci při přidávání produktů do databáze. Tato třída ještě neexistuje, takže ji teď vytvoříte.

  1. V Průzkumník řešení klikněte pravým tlačítkem na složku Logika a pak vyberte Přidat ->Nová položka.
    Zobrazí se dialogové okno Přidat novou položku.

  2. Na levé straně vyberte skupinu Šablony Visual C# ->Code . Pak v prostředním seznamu vyberte Třídaa pojmenujte ji AddProducts.cs.
    Zobrazí se nový soubor třídy.

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

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using WingtipToys.Models;
    
    namespace WingtipToys.Logic
    {
        public class AddProducts
        {
            public bool AddProduct(string ProductName, string ProductDesc, string ProductPrice, string ProductCategory, string ProductImagePath)
            {
                var myProduct = new Product();
                myProduct.ProductName = ProductName;
                myProduct.Description = ProductDesc;
                myProduct.UnitPrice = Convert.ToDouble(ProductPrice);
                myProduct.ImagePath = ProductImagePath;
                myProduct.CategoryID = Convert.ToInt32(ProductCategory);
    
                using (ProductContext _db = new ProductContext())
                {
                    // Add product to DB.
                    _db.Products.Add(myProduct);
                    _db.SaveChanges();
                }
                // Success.
                return true;
            }
        }
    }
    

Stránka AdminPage.aspx umožňuje uživateli, který patří do role canEdit, přidávat a odebírat produkty. Po přidání nového produktu se podrobnosti o produktu ověří a pak zadají do databáze. Nový produkt je okamžitě dostupný všem uživatelům webové aplikace.

Nenápadné ověření

Podrobnosti o produktu, které uživatel poskytuje na stránce AdminPage.aspx , se ověřují pomocí ověřovacích ovládacích prvků (RequiredFieldValidator a RegularExpressionValidator). Tyto ovládací prvky automaticky používají nenápadné ověření. Nenápadné ověření umožňuje ověřovacím ovládacím prvkům používat JavaScript pro logiku ověřování na straně klienta, což znamená, že stránka nevyžaduje ověření cesty na server. Ve výchozím nastavení je do souboruWeb.config zahrnuté nenápadné ověřování na základě následujícího nastavení konfigurace:

<add key="ValidationSettings:UnobtrusiveValidationMode" value="WebForms" />

Regulární výrazy

Cena produktu na stránce AdminPage.aspx je ověřena pomocí ovládacího prvku RegularExpressionValidator . Tento ovládací prvek ověřuje, jestli hodnota přidruženého vstupního ovládacího prvku (TextBox AddProductPrice) odpovídá vzoru určenému regulárním výrazem. Regulární výraz je zápis odpovídající vzorům, který umožňuje rychle najít a spárovat konkrétní vzory znaků. Ovládací prvek RegularExpressionValidator obsahuje vlastnost s názvem ValidationExpression , která obsahuje regulární výraz použitý k ověření vstupu ceny, jak je znázorněno níže:

<asp:RegularExpressionValidator 
    ID="RegularExpressionValidator1" runat="server"
    Text="* Must be a valid price without $." ControlToValidate="AddProductPrice" 
    SetFocusOnError="True" Display="Dynamic" 
    ValidationExpression="^[0-9]*(\.)?[0-9]?[0-9]?$">
</asp:RegularExpressionValidator>

FileUpload – ovládací prvek

Kromě vstupních a ověřovacích ovládacích prvků jste přidali ovládací prvek FileUpload na stránku AdminPage.aspx . Tento ovládací prvek poskytuje možnost nahrávat soubory. V tomto případě povolujete jenom nahrávání souborů obrázků. V souboru kódu na pozadí (AdminPage.aspx.cs) po AddProductButton kliknutí na kód zkontroluje HasFile vlastnost ovládacího prvku FileUpload . Pokud ovládací prvek obsahuje soubor a pokud je povolený typ souboru (na základě přípony souboru), uloží se obrázek do složky Obrázky a do složky Images/Thumbs aplikace.

Vazba modelu

Dříve v této sérii kurzů jste použili vazbu modelu k naplnění ovládacího prvku ListView , ovládacího prvku FormsView , ovládacího prvku GridView a ovládacího prvku DetailView . V tomto kurzu použijete vazbu modelu k naplnění ovládacího prvku DropDownList seznamem kategorií produktů.

Kód, který jste přidali do souboru AdminPage.aspx , obsahuje ovládací prvek DropDownList s názvem DropDownAddCategory:

<asp:DropDownList ID="DropDownAddCategory" runat="server" 
        ItemType="WingtipToys.Models.Category" 
        SelectMethod="GetCategories" DataTextField="CategoryName" 
        DataValueField="CategoryID" >
    </asp:DropDownList>

K naplnění tohoto rozevíracího seznamu nastavením atributu a atributu ItemTypeSelectMethod použijete vazbu modelu. Atribut ItemType určuje, že při naplnění ovládacího prvku použijete WingtipToys.Models.Category typ. Tento typ jste definovali na začátku této série kurzů vytvořením Category třídy (viz níže). Třída Category je ve složce Models v souboru Category.cs .

public class Category
{
    [ScaffoldColumn(false)]
    public int CategoryID { get; set; }

    [Required, StringLength(100), Display(Name = "Name")]
    public string CategoryName { get; set; }

    [Display(Name = "Product Description")]
    public string Description { get; set; }

    public virtual ICollection<Product> Products { get; set; }
}

Atribut SelectMethod ovládacího prvku DropDownList určuje, že použijete metodu GetCategories (zobrazenou níže), která je součástí souboru kódu na pozadí (AdminPage.aspx.cs).

public IQueryable GetCategories()
{
  var _db = new WingtipToys.Models.ProductContext();
  IQueryable query = _db.Categories;
  return query;
}

Tato metoda určuje, že se IQueryable rozhraní používá k vyhodnocení dotazu proti Category typu. Vrácená hodnota se používá k naplnění rozevíracího seznamu ve značkách stránky (AdminPage.aspx).

Text zobrazený pro každou položku v seznamu je určen nastavením atributu DataTextField . Atribut DataTextField používá CategoryNameCategory třídu (viz výše) k zobrazení každé kategorie v ovládacím prvku DropDownList . Skutečná hodnota, která se předá při výběru položky v ovládacím prvku DropDownList je založena na atributu DataValueField . Atribut DataValueField je nastaven na hodnotu definovanou CategoryIDCategory ve třídě (viz výše).

Jak bude aplikace fungovat

Když uživatel, který patří do role "canEdit", poprvé přejde na stránku, DropDownAddCategory vyplní se ovládací prvek DropDownList, jak je popsáno výše. Ovládací prvek DropDownRemoveProductDropDownList je také naplněn produkty, které používají stejný přístup. Uživatel, který patří do role canEdit, vybere typ kategorie a přidá podrobnosti o produktu (Název, Popis, Cena a Soubor obrázku). Když uživatel, který patří do role "canEdit", klikne na tlačítko Přidat produkt , obslužná rutina AddProductButton_Click události se aktivuje. Obslužná rutina AddProductButton_Click události umístěná v souboru kódu na pozadí (AdminPage.aspx.cs) zkontroluje soubor obrázku, aby se ujistil, že odpovídá povoleným typům souborů (.gif, .png, .jpeg nebo .jpg). Potom se soubor obrázku uloží do složky ukázkové aplikace Wingtip Toys. Potom se nový produkt přidá do databáze. Aby bylo možné přidat nový produkt, vytvoří se nová instance AddProducts třídy s názvem products. Třída AddProducts má metodu s názvem AddProducta objekt products volá tuto metodu pro přidání produktů do databáze.

// Add product data to DB.
AddProducts products = new AddProducts();
bool addSuccess = products.AddProduct(AddProductName.Text, AddProductDescription.Text,
    AddProductPrice.Text, DropDownAddCategory.SelectedValue, ProductImage.FileName);

Pokud kód úspěšně přidá nový produkt do databáze, stránka se znovu načte s hodnotou ProductAction=addřetězce dotazu .

Response.Redirect(pageUrl + "?ProductAction=add");

Když se stránka znovu načte, řetězec dotazu se zahrne do adresy URL. Po opětovném načtení stránky může uživatel, který patří do role "canEdit", okamžitě zobrazit aktualizace v ovládacích prvcích DropDownList na stránce AdminPage.aspx . Zahrnutím řetězce dotazu do adresy URL může stránka také zobrazit zprávu o úspěchu uživateli, který patří do role "canEdit".

Když se stránka AdminPage.aspx znovu načte, Page_Load je volána událost.

protected void Page_Load(object sender, EventArgs e)
{
    string productAction = Request.QueryString["ProductAction"];
    if (productAction == "add")
    {
        LabelAddStatus.Text = "Product added!";
    }

    if (productAction == "remove")
    {
        LabelRemoveStatus.Text = "Product removed!";
    }
}

Obslužná rutina Page_Load události zkontroluje hodnotu řetězce dotazu a určí, jestli se má zobrazit zpráva o úspěchu.

Spuštění aplikace

Aplikaci teď můžete spustit a zjistit, jak můžete přidávat, odstraňovat a aktualizovat položky v nákupním košíku. Celkový počet nákupních košíků bude odrážet celkové náklady na všechny položky v nákupním košíku.

  1. V Průzkumník řešení stisknutím klávesy F5 spusťte ukázkovou aplikaci Wingtip Toys.
    Otevře se prohlížeč a zobrazí stránku Default.aspx .

  2. Klikněte na odkaz Přihlásit se v horní části stránky.

    Členství a správa – odkaz pro přihlášení

    Zobrazí se stránka Login.aspx .

  3. Zadejte uživatelské jméno a heslo.

    Členství a správa – přihlašovací stránka

  4. Klikněte na tlačítko Přihlásit se v dolní části stránky.

  5. V horní části další stránky vyberte odkaz Správa a přejděte na stránku AdminPage.aspx.

    Členství a správa – odkaz Správa

  6. Pokud chcete otestovat ověření vstupu, klikněte na tlačítko Přidat produkt bez přidání podrobností o produktu.

    Členství a správa – stránka Správa

    Všimněte si, že se zobrazí požadované zprávy pole.

  7. Přidejte podrobnosti o novém produktu a klikněte na tlačítko Přidat produkt .

    Členství a správa – Přidat produkt

  8. V horní navigační nabídce vyberte Produkty a zobrazte nový produkt, který jste přidali.

    Členství a správa – Zobrazit nový produkt

  9. Kliknutím na odkaz Správa se vraťte na stránku správy.

  10. V části Odebrat produkt na stránce vyberte nový produkt, který jste přidali do rozevíracího seznamu.

  11. Kliknutím na tlačítko Odebrat produkt odeberte nový produkt z aplikace.

    Členství a správa – Odebrat produkt

  12. V horní navigační nabídce vyberte Produkty a potvrďte, že se produkt odebral.

  13. Kliknutím na Odhlásit se zobrazí režim správy.
    Všimněte si, že v horním navigačním podokně se už nezobrazuje položka nabídky Správa.

Souhrn

V tomto kurzu jste přidali vlastní roli a uživatele, který patří do vlastní role, omezili jste přístup ke složce a stránce pro správu a poskytli jste navigaci pro uživatele, který patří do vlastní role. Použili jste vazbu modelu k naplnění ovládacího prvku DropDownList daty. Implementovali jste ovládací prvek FileUpload a ověřovací ovládací prvky. Také jste se naučili přidávat a odebírat produkty z databáze. V dalším kurzu se dozvíte, jak implementovat směrování ASP.NET.

Další materiály

Web.config – autorizační element
ASP.NET Identity
Nasazení zabezpečené aplikace ASP.NET Web Forms s členstvím, OAuth a SQL Database na web Azure
Microsoft Azure – bezplatná zkušební verze