Üyelik ve Yönetim

tarafından Erik Reitan

Bu öğretici serisi, web için ASP.NET 4.5 ve Microsoft Visual Studio Express 2013 kullanarak ASP.NET Web Forms uygulaması oluşturmanın temellerini öğretecektir. Bu öğretici serisine eşlik etmek için C# kaynak koduna sahip bir Visual Studio 2013 projesi kullanılabilir.

Bu öğreticide Wingtip Toys örnek uygulamasını özel bir rol eklemek ve ASP.NET Identity kullanmak için nasıl güncelleştirdiğiniz gösterilmektedir. Ayrıca, özel bir role sahip kullanıcının web sitesine ürün ekleyip kaldırabileceği bir yönetim sayfasını nasıl uygulayabileceğinizi de gösterir.

ASP.NET Identity , ASP.NET web uygulaması oluşturmak için kullanılan üyelik sistemidir ve ASP.NET 4.5'te kullanılabilir. ASP.NET Kimliği, Visual Studio 2013 Web Forms proje şablonunda ve ASP.NET MVC, ASP.NET Web API'sine ve ASP.NET Tek Sayfalı Uygulama şablonlarında kullanılır. Ayrıca, boş bir Web uygulamasıyla başladığınızda NuGet kullanarak ASP.NET Kimlik sistemini özellikle yükleyebilirsiniz. Ancak, bu öğretici serisinde ASP.NET Identity sistemini içeren Web Forms projecttemplate'ı kullanırsınız. ASP.NET Identity, kullanıcıya özgü profil verilerini uygulama verileriyle tümleştirmeyi kolaylaştırır. Ayrıca ASP.NET Identity, uygulamanızdaki kullanıcı profilleri için kalıcılık modelini seçmenize olanak tanır. Verileri SQL Server veritabanında veya Windows Azure Depolama Tabloları gibi NoSQL veri depoları da dahil olmak üzere başka bir veri deposunda depolayabilirsiniz.

Bu öğretici, Wingtip Toys öğretici serisindeki "PayPal ile Ödeme ve Ödeme" başlıklı önceki öğreticiyi oluşturur.

Öğrenecekleriniz:

  • Uygulamaya özel rol ve kullanıcı eklemek için kod kullanma.
  • Yönetim klasörüne ve sayfasına erişimi kısıtlama.
  • Özel role ait kullanıcı için gezinti sağlama.
  • DropDownList denetimini ürün kategorileri ile doldurmak için model bağlamayı kullanma.
  • FileUpload denetimini kullanarak web uygulamasına dosya yükleme.
  • Giriş doğrulamayı uygulamak için doğrulama denetimlerini kullanma.
  • Uygulamadan ürün ekleme ve kaldırma.

Bu özellikler öğreticiye dahil edilir:

  • ASP.NET Kimlik
  • Yapılandırma ve Yetkilendirme
  • Model Bağlama
  • Engelleyici Olmayan Doğrulama

ASP.NET Web Forms üyelik özellikleri sağlar. Varsayılan şablonu kullanarak, uygulama çalıştırıldığında hemen kullanabileceğiniz yerleşik üyelik işlevselliğine sahipsinizdir. Bu öğreticide, özel rol eklemek ve bu role kullanıcı atamak için ASP.NET Kimliği'nin nasıl kullanılacağı gösterilmektedir. Yönetim klasörüne erişimi kısıtlamayı öğreneceksiniz. Yönetim klasörüne, özel rolü olan bir kullanıcının ürün ekleyip kaldırmasına ve ürün eklendikten sonra önizlemesine izin veren bir sayfa ekleyeceksiniz.

Özel Rol Ekleme

ASP.NET Identity kullanarak özel bir rol ekleyebilir ve kodu kullanarak bu role bir kullanıcı atayabilirsiniz.

  1. Çözüm Gezgini'daLogic klasörüne sağ tıklayın ve yeni bir sınıf oluşturun.

  2. Yeni sınıfa RoleActions.cs adını verin.

  3. Kodu aşağıdaki gibi görünecek şekilde değiştirin:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace WingtipToys.Logic
    {
        internal class RoleActions
        {
        }
    }
    
  4. Çözüm Gezgini'daGlobal.asax.cs dosyasını açın.

  5. Aşağıda gösterildiği gibi görünecek şekilde sarıyla vurgulanan kodu ekleyerek Global.asax.cs dosyasını değiştirin:

    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. Kırmızıyla altı çizili olduğuna AddUserAndRole dikkat edin. AddUserAndRole koduna çift tıklayın.
    Vurgulanan yöntemin başındaki "A" harfinin altı çizilir.

  7. "A" harfinin üzerine gelin ve yöntem için bir yöntem saptaması oluşturmanıza olanak tanıyan kullanıcı arabirimine AddUserAndRole tıklayın.

    Üyelik ve Yönetim - Yöntem Saptaması Oluşturma

  8. Başlıklı seçeneğe tıklayın:
    Generate method stub for "AddUserAndRole" in "WingtipToys.Logic.RoleActions"

  9. Logic klasöründen RoleActions.cs dosyasını açın.
    AddUserAndRole yöntemi sınıf dosyasına eklendi.

  10. Öğesini kaldırarak NotImplementedException ve sarıyla vurgulanan kodu ekleyerek RoleActions.cs dosyasını değiştirin; böylece aşağıdaki gibi görünür:

    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");
          }
        }
      }
    }
    

Yukarıdaki kod öncelikle üyelik veritabanı için bir veritabanı bağlamı oluşturur. Üyelik veritabanı, App_Data klasöründe bir .mdf dosyası olarak da depolanır. İlk kullanıcı bu web uygulamasında oturum açtıktan sonra bu veritabanını görüntüleyebileceksiniz.

Not

Üyelik verilerini ürün verileriyle birlikte depolamak isterseniz, yukarıdaki kodda ürün verilerini depolamak için kullandığınız DbContext'i kullanmayı düşünebilirsiniz.

İç anahtar sözcük, türler (sınıflar gibi) ve tür üyeleri (yöntemler veya özellikler gibi) için bir erişim değiştiricidir. İç türler veya üyelere yalnızca aynı derlemede (.dll dosya) bulunan dosyalar içinde erişilebilir. Uygulamanızı oluşturduğunuzda, uygulamanızı çalıştırdığınızda yürütülen kodu içeren bir derleme dosyası (.dll) oluşturulur.

RoleStore Rol yönetimi sağlayan bir nesne, veritabanı bağlamı temelinde oluşturulur.

Not

RoleStore Nesne oluşturulduğunda Genel IdentityRole bir tür kullandığına dikkat edin. Bu, öğesinin RoleStore yalnızca nesneleri içermesine IdentityRole izin verilen anlamına gelir. Ayrıca Genel Öğeler kullanılarak bellekteki kaynaklar daha iyi işlenir.

Ardından nesnesi, RoleManager yeni oluşturduğunuz nesneye RoleStore göre oluşturulur. nesnesi, RoleManager rolle ilgili API'yi kullanıma sunar. Bu API, değişiklikleri otomatik olarak kaydetmek için RoleStorekullanılabilir. RoleManager kod Genel türünü kullandığından yalnızca öğesinin nesneleri içermesine IdentityRole<IdentityRole> izin verilir.

Üyelik veritabanında "canEdit" rolünün mevcut olup olmadığını belirlemek için yöntemini çağırırsınız RoleExists . Değilse, rolü oluşturursunuz.

UserManager Nesneyi oluşturmak denetimden RoleManager daha karmaşık gibi görünse de neredeyse aynıdır. Yalnızca birkaç satır yerine tek satırda kodlanır. Burada geçirdiğiniz parametre, parantez içinde yer alan yeni bir nesne olarak örnekleniyor.

Ardından yeni ApplicationUser bir nesne oluşturarak "canEditUser" kullanıcısını oluşturacaksınız. Ardından, kullanıcıyı başarıyla oluşturursanız kullanıcıyı yeni role eklersiniz.

Not

Hata işleme, bu öğretici serisinin devamında yer alan "ASP.NET Hata İşleme" öğreticisi sırasında güncelleştirilecektir.

Uygulama bir sonraki başlatılışında, "canEditUser" adlı kullanıcı uygulamanın "canEdit" adlı rolü olarak eklenir. Bu öğreticinin ilerleyen bölümlerinde, bu öğretici sırasında ekleyebileceğiniz ek özellikleri görüntülemek için "canEditUser" kullanıcısı olarak oturum açacaksınız. ASP.NET Identity hakkında API ayrıntıları için bkz. Microsoft.AspNet.Identity Ad Alanı. ASP.NET Kimlik sistemini başlatma hakkında ek ayrıntılar için bkz. AspnetIdentitySample.

Yönetim Sayfasına Erişimi Kısıtlama

Wingtip Toys örnek uygulaması hem anonim kullanıcıların hem de oturum açmış kullanıcıların ürünleri görüntülemesine ve satın almasına olanak tanır. Ancak, özel "canEdit" rolüne sahip oturum açmış olan kullanıcı, ürünleri eklemek ve kaldırmak için kısıtlı bir sayfaya erişebilir.

Yönetim Klasörü ve Sayfası Ekleme

Ardından, Wingtip Toys örnek uygulamasının özel rolüne ait "canEditUser" kullanıcısı için Yönetici adlı bir klasör oluşturacaksınız.

  1. Çözüm Gezgini'da proje adına (Wingtip Toys) sağ tıklayın ve Ekle ->Yeni Klasör'e tıklayın.
  2. Yeni klasörü Yönetici adlandırın.
  3. Yönetici klasörüne sağ tıklayın ve ardından Ekle ->Yeni Öğe'yi seçin.
    Yeni Öğe Ekle iletişim kutusu görüntülenir.
  4. Soldaki Visual C#->Web şablonları grubunu seçin. Ortadaki listeden Ana Sayfalı Web Formu'nu seçin, AdminPage.aspx olarak adlandırın ve ardındanEkle'yi seçin.
  5. Ana sayfa olarak Site.Master dosyasını seçin ve ardından Tamam'ı seçin.

Web.config Dosyası Ekleme

Yönetici klasörüne birWeb.config dosyası ekleyerek, klasörün içerdiği sayfaya erişimi kısıtlayabilirsiniz.

  1. Yönetici klasörüne sağ tıklayın ve Ekle ->Yeni Öğe'yi seçin.
    Yeni Öğe Ekle iletişim kutusu görüntülenir.

  2. Visual C# web şablonları listesinden ortadaki listeden Web Yapılandırma Dosyası'nıseçin, varsayılanWeb.config adını kabul edin ve ekle'yi seçin.

  3. Web.config dosyasındaki mevcut XML içeriğini aşağıdakilerle değiştirin:

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

Web.config dosyasını kaydedin. Web.config dosyası, yalnızca uygulamanın "canEdit" rolüne ait kullanıcının Yönetici klasöründe bulunan sayfaya erişebileceğini belirtir.

Özel Rol Gezintisi Ekleme

Özel "canEdit" rolünün kullanıcısının uygulamanın yönetim bölümüne gitmesine olanak tanımak için Site.Master sayfasına bir bağlantı eklemeniz gerekir. Yalnızca "canEdit" rolüne ait kullanıcılar Yönetici bağlantısını görebilir ve yönetim bölümüne erişebilir.

  1. Çözüm Gezgini'da Site.Master sayfasını bulun ve açın.

  2. "canEdit" rolünün kullanıcısına bağlantı oluşturmak için, sarıyla vurgulanan işaretlemeyi aşağıdaki sıralanmamış liste <ul> öğesine ekleyin; böylece liste aşağıdaki gibi görünür:

    <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. Site.Master.cs dosyasını açın. İşleyiciye sarı renkle vurgulanan kodu ekleyerek Yönetici bağlantısını yalnızca "canEditUser" kullanıcısına Page_Load görünür hale getirin. İşleyici Page_Load aşağıdaki gibi görünür:

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

Sayfa yüklendiğinde kod, oturum açan kullanıcının "canEdit" rolüne sahip olup olmadığını denetler. Kullanıcı "canEdit" rolüne aitse, AdminPage.aspx sayfasının bağlantısını içeren span öğesi (ve sonuç olarak span içindeki bağlantı) görünür hale gelir.

Ürün Yönetimini Etkinleştirme

Şimdiye kadar "canEdit" rolünü oluşturdunuz ve bir "canEditUser" kullanıcısı, bir yönetim klasörü ve bir yönetim sayfası eklediniz. Yönetim klasörü ve sayfası için erişim haklarını ayarladınız ve uygulamaya "canEdit" rolünün kullanıcısı için bir gezinti bağlantısı eklediniz. Ardından , AdminPage.aspx sayfasına işaretleme ve AdminPage.aspx.cs arka plan kod dosyasına kod ekleyerek kullanıcının "canEdit" rolüne sahip olduğu ürünlerin eklenmesini ve kaldırılmasını sağlayacaksınız.

  1. Çözüm Gezgini'da, Yönetici klasöründen AdminPage.aspx dosyasını açın.

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

    <%@ 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. Ardından AdminPage.aspx dosyasına sağ tıklayıp Kodu Görüntüle'ye tıklayarak AdminPage.aspx.cs arka planda kod dosyasını açın.

  4. AdminPage.aspx.cs code-behind dosyasındaki mevcut kodu aşağıdaki kodla değiştirin:

    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.";
            }
          }
        }
      }
    }
    

AdminPage.aspx.cs arka planda kod dosyası için girdiğiniz kodda adlı AddProducts sınıf, veritabanına ürün ekleme işleminin fiili işini yapar. Bu sınıf henüz mevcut olmadığından şimdi oluşturacaksınız.

  1. Çözüm Gezgini'daLogic klasörüne sağ tıklayın ve ardından Ekle ->Yeni Öğe'yi seçin.
    Yeni Öğe Ekle iletişim kutusu görüntülenir.

  2. Soldaki Visual C# ->Code şablonları grubunu seçin. Ardından ortadaki listeden Sınıf'ıseçin ve AddProducts.cs olarak adlandırın.
    Yeni sınıf dosyası görüntülenir.

  3. Mevcut kodu aşağıdakilerle değiştirin:

    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;
            }
        }
    }
    

AdminPage.aspx sayfası, "canEdit" rolüne ait kullanıcının ürün eklemesine ve kaldırmasına olanak tanır. Yeni bir ürün eklendiğinde, ürünle ilgili ayrıntılar doğrulanır ve sonra veritabanına girilir. Yeni ürün, web uygulamasının tüm kullanıcıları tarafından hemen kullanılabilir.

Göze Çarpmayan Doğrulama

Kullanıcının AdminPage.aspx sayfasında sağladığı ürün ayrıntıları doğrulama denetimleri ( ve RegularExpressionValidator)RequiredFieldValidator kullanılarak doğrulanır. Bu denetimler otomatik olarak engelleyici olmayan doğrulamayı kullanır. Göze çarpmayan doğrulama, doğrulama denetimlerinin istemci tarafı doğrulama mantığı için JavaScript kullanmasına olanak tanır ve bu da sayfanın doğrulanması için sunucuya bir yolculuk gerektirmediği anlamına gelir. Varsayılan olarak, aşağıdaki yapılandırma ayarına bağlı olarakWeb.config dosyasına engelsiz doğrulama eklenir:

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

Normal İfadeler

AdminPage.aspx sayfasındaki ürün fiyatı RegularExpressionValidator denetimi kullanılarak doğrulanır. Bu denetim, ilişkili giriş denetiminin değerinin ("AddProductPrice" TextBox) normal ifade tarafından belirtilen desenle eşleşip eşleşmediğini doğrular. Normal ifade, belirli karakter desenlerini hızla bulmanızı ve eşleştirmenizi sağlayan desen eşleştirme gösterimidir. RegularExpressionValidator denetimi, aşağıda gösterildiği gibi fiyat girişini doğrulamak için kullanılan normal ifadeyi içeren adlı ValidationExpression bir özellik içerir:

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

Giriş ve doğrulama denetimlerine ek olarak, AdminPage.aspx sayfasına FileUpload denetimini eklediniz. Bu denetim dosyaları karşıya yükleme olanağı sağlar. Bu durumda, yalnızca görüntü dosyalarının karşıya yüklenmesine izin verirsiniz. Arkadaki kod dosyasında (AdminPage.aspx.cs), öğesine tıklandığında AddProductButton kod FileUpload denetiminin özelliğini denetlerHasFile. Denetimin bir dosyası varsa ve dosya türüne (dosya uzantısına göre) izin veriliyorsa, görüntü Images klasörüne ve uygulamanın Images/Thumbs klasörüne kaydedilir.

Model Bağlama

Bu öğretici serisinin önceki bölümlerinde ListView denetimini, FormsView denetimini, GridView denetimini ve DetailView denetimini doldurmak için model bağlamayı kullandınız. Bu öğreticide, DropDownList denetimini ürün kategorileri listesiyle doldurmak için model bağlamayı kullanacaksınız.

AdminPage.aspx dosyasına eklediğiniz işaretleme, adlı DropDownAddCategorybir DropDownList denetimi içerir:

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

Özniteliğini ve özniteliğini ayarlayarak bu DropDownList öğesini ItemType doldurmak için model bağlamasını SelectMethod kullanırsınız. özniteliği, ItemType denetimi doldurma sırasında türünü kullandığınızı WingtipToys.Models.Category belirtir. Sınıfını oluşturarak Category bu öğretici serisinin başında bu türü tanımladığınızda (aşağıda gösterilmiştir). Category sınıfı Category.csdosyasının models klasöründedir.

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; }
}

SelectMethodDropDownList denetiminin özniteliği, arka planda kod dosyasına (AdminPage.aspx.cs) dahil edilen yöntemini (aşağıda gösterilmiştir) kullandığınızı GetCategories belirtir.

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

Bu yöntem, bir türe karşı Category sorguyu IQueryable değerlendirmek için bir arabirimin kullanıldığını belirtir. Döndürülen değer, sayfanın işaretlemesindeki DropDownList değerini doldurmak için kullanılır (AdminPage.aspx).

Listedeki her öğe için görüntülenen metin, özniteliği ayarlanarak DataTextField belirtilir. özniteliği, DataTextFieldDropDownList denetimindeki Category her kategoriyi görüntülemek için sınıfının (yukarıda gösterilen) öğesini kullanırCategoryName. DropDownList denetiminde bir öğe seçildiğinde geçirilen gerçek değer özniteliğini DataValueField temel alır. DataValueField özniteliği sınıfında tanımlandığı Category gibi değerine ayarlanır CategoryID (yukarıda gösterilmiştir).

Uygulama Nasıl Çalışır?

"canEdit" rolüne ait kullanıcı sayfaya ilk kez gittiği zaman, DropDownAddCategoryDropDownList denetimi yukarıda açıklandığı gibi doldurulur. DropDownRemoveProductDropDownList denetimi de aynı yaklaşımı kullanan ürünlerle doldurulur. "canEdit" rolüne ait kullanıcı kategori türünü seçer ve ürün ayrıntılarını ekler (Ad, Açıklama, Fiyat ve Görüntü Dosyası). "canEdit" rolüne ait kullanıcı Ürün Ekle düğmesine tıkladığında, AddProductButton_Click olay işleyici tetikler. AddProductButton_Click Arka plandaki kod dosyasında (AdminPage.aspx.cs) bulunan olay işleyicisi, izin verilen dosya türleriyle (.gif, .png, .jpeg veya .jpg) eşleştiğinden emin olmak için görüntü dosyasını denetler. Ardından görüntü dosyası Wingtip Toys örnek uygulamasının bir klasörüne kaydedilir. Ardından, yeni ürün veritabanına eklenir. Yeni bir ürün eklemeyi başarmak için sınıfının yeni bir örneği AddProducts oluşturulur ve ürünler olarak adlandırılır. AddProducts sınıfı adlı AddProductbir yönteme sahiptir ve products nesnesi veritabanına ürün eklemek için bu yöntemi çağırır.

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

Kod yeni ürünü veritabanına başarıyla eklerse, sayfa sorgu dizesi değeriyle ProductAction=addyeniden yüklenir.

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

Sayfa yeniden yüklendiğinde sorgu dizesi URL'ye eklenir. Sayfayı yeniden yükleyerek, "canEdit" rolüne ait kullanıcı AdminPage.aspx sayfasındaki DropDownList denetimlerinde güncelleştirmeleri hemen görebilir. Ayrıca, sorgu dizesini URL ile birlikte ekleyerek, sayfa kullanıcıya "canEdit" rolüne ait bir başarı iletisi görüntüleyebilir.

AdminPage.aspx sayfası yeniden yüklendiğinde olay Page_Load çağrılır.

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!";
    }
}

Olay işleyicisi Page_Load sorgu dizesi değerini denetler ve başarı iletisinin gösterilip gösterilmeyeceğini belirler.

Uygulamayı Çalıştırma

Alışveriş sepetindeki öğeleri nasıl ekleyebileceğinizi, silebileceğinizi ve güncelleştirebileceğinizi görmek için uygulamayı şimdi çalıştırabilirsiniz. Alışveriş sepeti toplamı, alışveriş sepetindeki tüm öğelerin toplam maliyetini yansıtır.

  1. Çözüm Gezgini'da Wingtip Toys örnek uygulamasını çalıştırmak için F5 tuşuna basın.
    Tarayıcı açılır ve Default.aspx sayfasını gösterir.

  2. Sayfanın üst kısmındaki Oturum aç bağlantısına tıklayın.

    Üyelik ve Yönetim - Oturum Açma Bağlantısı

    Login.aspx sayfası görüntülenir.

  3. Kullanıcı adı ve parolayı girin.

    Üyelik ve Yönetim - Oturum Açma Sayfası

  4. Sayfanın alt kısmındaki Oturum aç düğmesine tıklayın.

  5. Sonraki sayfanın üst kısmından Yönetici bağlantısını seçerek AdminPage.aspx sayfasına gidin.

    Üyelik ve Yönetim - Yönetici Bağlantısı

  6. Giriş doğrulamasını test etmek için ürün ayrıntıları eklemeden Ürün Ekle düğmesine tıklayın.

    Üyelik ve Yönetim - Yönetici Sayfası

    Gerekli alan iletilerinin görüntülendiğine dikkat edin.

  7. Yeni bir ürünün ayrıntılarını ekleyin ve ardından Ürün Ekle düğmesine tıklayın.

    Üyelik ve Yönetim - Ürün Ekle

  8. Eklediğiniz yeni ürünü görüntülemek için üst gezinti menüsünden Ürünler'i seçin.

    Üyelik ve Yönetim - Yeni Ürünü Göster

  9. Yönetim sayfasına dönmek için Yönetici bağlantısına tıklayın.

  10. Sayfanın Ürün Kaldır bölümünde DropDownListBox'a eklediğiniz yeni ürünü seçin.

  11. Yeni ürünü uygulamadan kaldırmak için Ürünü Kaldır düğmesine tıklayın.

    Üyelik ve Yönetim - Ürünü Kaldır

  12. Ürünün kaldırıldığını onaylamak için üst gezinti menüsünden Ürünler'i seçin.

  13. Mevcut yönetim modu için Oturumu kapat'a tıklayın.
    Üst gezinti bölmesinde artık Yönetici menü öğesinin gösteril olmadığına dikkat edin.

Özet

Bu öğreticide, özel bir rol ve özel role ait bir kullanıcı eklediniz, yönetim klasörüne ve sayfaya erişimi kısıtlamıştınız ve özel role ait kullanıcı için gezinti sağladınız. DropDownList denetimini verilerle doldurmak için model bağlamayı kullandınız. FileUpload denetimini ve doğrulama denetimlerini uyguladınız. Ayrıca, veritabanından ürün eklemeyi ve kaldırmayı da öğrendinsiniz. Sonraki öğreticide ASP.NET yönlendirmeyi uygulamayı öğreneceksiniz.

Ek Kaynaklar

Web.config - authorization Öğesi
ASP.NET Kimlik
Azure Web Sitesine Üyelik, OAuth ve SQL Veritabanı ile Güvenli ASP.NET Web Forms Uygulaması Dağıtma
Microsoft Azure - Ücretsiz Deneme