Sdílet prostřednictvím


Ukládání dalších informací o uživatelích (C#)

Scott Mitchell

Poznámka

Od napsání tohoto článku se zprostředkovatelé členství ASP.NET nahradili službou ASP.NET Identity. Důrazně doporučujeme aktualizovat aplikace tak, aby používaly platformu ASP.NET Identity Platform místo zprostředkovatelů členství, které se objevovalo v době psaní tohoto článku. ASP.NET Identity má oproti systému členství ASP.NET řadu výhod, mezi které patří:

  • Lepší výkon
  • Vylepšená rozšiřitelnost a testovatelnost
  • Podpora OAuth, OpenID Connect a dvojúrovňového ověřování
  • Podpora identit založených na deklarací identity
  • Lepší interoperabilita s ASP.Net Core

Stažení kódu nebo stažení souboru PDF

V tomto kurzu odpovíme na tuto otázku vytvořením velmi základní aplikace guestbook. Podíváme se přitom na různé možnosti modelování informací o uživatelích v databázi a pak zjistíme, jak tato data přidružit k uživatelským účtům vytvořeným architekturou membership.

Úvod

ASP. Rozhraní Membership na platformě NET nabízí flexibilní rozhraní pro správu uživatelů. Rozhraní API členství zahrnuje mimo jiné metody ověřování přihlašovacích údajů, načítání informací o aktuálně přihlášených uživatelích, vytvoření nového uživatelského účtu a odstranění uživatelského účtu. Každý uživatelský účet v rámci členství obsahuje pouze vlastnosti potřebné k ověřování přihlašovacích údajů a provádění základních úloh souvisejících s uživatelskými účty. To je důkazem metod a vlastností MembershipUser třídy, která modeluje uživatelský účet v rámci členství. Tato třída má vlastnosti, jako jsou UserName, Emaila IsLockedOut, a metody, jako jsou GetPassword a UnlockUser.

Aplikace často potřebují ukládat další informace o uživatelích, které nejsou součástí architektury členství. Online prodejce může například potřebovat, aby si každý uživatel uložil dodací a fakturační adresu, platební údaje, předvolby doručení a kontaktní telefonní číslo. Každá objednávka v systému je navíc přidružená ke konkrétnímu uživatelskému účtu.

Třída MembershipUser neobsahuje vlastnosti jako PhoneNumber nebo DeliveryPreferences nebo PastOrders. Jak tedy můžeme sledovat informace o uživateli, které aplikace potřebuje, a integrovat je s architekturou členství? V tomto kurzu odpovíme na tuto otázku vytvořením velmi základní aplikace guestbook. Podíváme se přitom na různé možnosti modelování informací o uživatelích v databázi a pak zjistíme, jak tato data přidružit k uživatelským účtům vytvořeným architekturou membership. Pusťme se do toho.

Krok 1: Vytvoření datového modelu aplikace knihy hostů

K zachycení informací o uživateli v databázi a jejich přidružení k uživatelským účtům vytvořeným v rámci členství je možné použít celou řadu technik. Abychom mohli tyto techniky ilustrovat, budeme muset rozšířit výukovou webovou aplikaci tak, aby zachytila nějaký druh dat souvisejících s uživatelem. (V současné době datový model aplikace obsahuje pouze tabulky aplikačních služeb, které SqlMembershipProviderpotřebuje .)

Pojďme vytvořit velmi jednoduchou aplikaci knihy hostů, kde ověřený uživatel může zanechat komentář. Kromě ukládání komentářů k knize hostů, umožníme každému uživateli uložit své domovské město, domovskou stránku a podpis. Pokud ho zadáte, zobrazí se na každé zprávě, kterou uživatel v knize hostů opustil, domovská stránka a podpis.

GuestbookCommentsPřidání tabulky

Aby bylo možné zachytit komentáře k knize hostů, musíme vytvořit tabulku databáze s názvem GuestbookComments , která obsahuje sloupce jako CommentId, SubjectBody, a CommentDate. Také musíme, aby každý záznam v GuestbookComments tabulce odkazoval na uživatele, který komentář opustil.

Pokud chcete přidat tuto tabulku do databáze, přejděte v sadě Visual Studio do Průzkumníka databáze a přejděte k podrobnostem databáze SecurityTutorials . Klikněte pravým tlačítkem na složku Tabulky a zvolte Přidat novou tabulku. Tím se vytvoří rozhraní, které nám umožňuje definovat sloupce pro novou tabulku.

Přidání nové tabulky do databáze SecurityTutorials

Obrázek 1: Přidání nové tabulky do SecurityTutorials databáze (kliknutím zobrazíte obrázek v plné velikosti)

Dále definujte GuestbookCommentssloupce . Začněte přidáním sloupce s názvem CommentId typu uniqueidentifier. Tento sloupec bude jednoznačně identifikovat jednotlivé komentáře v knize hostů, takže je zakažte NULL a označte ho jako primární klíč tabulky. Místo zadání hodnoty pro CommentId pole u každého INSERTpole můžeme označit, že by se pro toto pole měla automaticky vygenerovat nová uniqueidentifier hodnota, a to nastavením výchozí hodnoty sloupce na INSERTNEWID(). Po přidání tohoto prvního pole, jeho označení jako primárního klíče a nastavení výchozí hodnoty by obrazovka měla vypadat podobně jako na obrázku 2.

Přidání primárního sloupce s názvem CommentId

Obrázek 2: Přidání primárního sloupce s názvem CommentId (kliknutím zobrazíte obrázek v plné velikosti)

Dále přidejte sloupec s názvem Subject type nvarchar(50) a sloupec s názvem Body typu nvarchar(MAX), který v obou sloupcích zakáže NULL s. Potom přidejte sloupec s názvem CommentDate typu datetime. NULL Zakázat a nastavit CommentDate výchozí hodnotu sloupce na getdate().

Zbývá jen přidat sloupec, který ke každému komentáři k knize hostů přidruží uživatelský účet. Jednou z možností je přidat sloupec s názvem UserName typu nvarchar(256). Jedná se o vhodnou volbu SqlMembershipProviderpři použití jiného poskytovatele členství než . Ale při použití SqlMembershipProvider, jak jsme v této sérii kurzů, není zaručeno, UserName že sloupec v aspnet_Users tabulce bude jedinečný. aspnet_Users Primární klíč tabulky je UserId a je typu uniqueidentifier. GuestbookComments Proto tabulka potřebuje sloupec s názvem UserId typu uniqueidentifier (nepovolující NULL hodnoty). Pokračujte a přidejte tento sloupec.

Poznámka

Jak jsme probrali v kurzu Vytvoření schématu členství v SQL Server, architektura Membership je navržená tak, aby umožňovala více webovým aplikacím s různými uživatelskými účty sdílet stejné uživatelské úložiště. Dělá to rozdělením uživatelských účtů do různých aplikací. A i když je zaručeno, že každé uživatelské jméno bude v rámci aplikace jedinečné, stejné uživatelské jméno může být použito v různých aplikacích, které používají stejné úložiště uživatelů. V tabulce je složené UNIQUE omezení aspnet_Users pro UserName pole a ApplicationId , ale ne jedno omezení pouze pro UserName pole. V důsledku toho může mít tabulka aspnet_Users dva (nebo více) záznamů se stejnou UserName hodnotou. Existuje však UNIQUE omezení aspnet_Users pro pole tabulky UserId (protože se jedná o primární klíč). Omezení UNIQUE je důležité, protože bez něj nemůžeme vytvořit omezení cizího klíče mezi tabulkami GuestbookComments a aspnet_Users .

Po přidání UserId sloupce uložte tabulku kliknutím na ikonu Uložit na panelu nástrojů. Pojmenujte novou tabulku GuestbookComments.

V tabulce musíme řešit GuestbookComments poslední problém: mezi sloupcem a sloupcem musíme vytvořit omezeníGuestbookComments.UserId cizího aspnet_Users.UserId klíče. Chcete-li toho dosáhnout, klikněte na ikonu Relace na panelu nástrojů a spusťte dialogové okno Vztahy cizích klíčů. (Případně můžete toto dialogové okno otevřít tak, že přejdete do nabídky Designer tabulky a zvolíte Relace.)

Klikněte na tlačítko Přidat v levém dolním rohu dialogového okna Vztahy cizích klíčů. Tím se přidá nové omezení cizího klíče, i když stále potřebujeme definovat tabulky, které se účastní relace.

Použití dialogového okna Relace cizího klíče ke správě omezení cizího klíče tabulky

Obrázek 3: Použití dialogového okna Vztahy cizích klíčů ke správě omezení cizího klíče tabulky (kliknutím zobrazíte obrázek v plné velikosti)

Potom klikněte na ikonu se třemi tečkami v řádku "Specifikace tabulky a sloupců" na pravé straně. Tím se otevře dialogové okno Tabulky a sloupce, ve kterém můžeme zadat tabulku a sloupec primárního klíče a sloupec cizího GuestbookComments klíče z tabulky. Konkrétně vyberte aspnet_Users a UserId jako tabulku a sloupec primárního klíče a UserId z GuestbookComments tabulky jako sloupec cizího klíče (viz Obrázek 4). Po definování tabulek a sloupců primárního a cizího klíče se kliknutím na OK vraťte do dialogového okna Relace cizího klíče.

Vytvoření omezení cizího klíče mezi tabulkami aspnet_Users a GuesbookComments

Obrázek 4: Vytvoření omezení cizího klíče mezi aspnet_Users tabulkami a GuesbookComments (kliknutím zobrazíte obrázek v plné velikosti)

V tomto okamžiku bylo stanoveno omezení cizího klíče. Přítomnost tohoto omezení zajišťuje relační integritu mezi oběma tabulkami tím, že zaručuje, že nikdy nebude existovat položka knihy hostů odkazující na neexistující uživatelský účet. Omezení cizího klíče ve výchozím nastavení zakáže odstranění nadřazeného záznamu, pokud existují odpovídající podřízené záznamy. To znamená, že pokud uživatel vytvoří jeden nebo více komentářů k knize hostů a pak se pokusíme tento uživatelský účet odstranit, odstranění se nezdaří, pokud jeho komentáře k knize hostů nejsou nejprve odstraněny.

Omezení cizího klíče lze nakonfigurovat tak, aby při odstranění nadřazeného záznamu automaticky odstranila přidružené podřízené záznamy. Jinými slovy, toto omezení cizího klíče můžeme nastavit tak, aby se při odstranění uživatelského účtu automaticky odstranily položky knihy hostů uživatele. Chcete-li to provést, rozbalte část "INSERT and UPDATE Specification" a nastavte vlastnost "Odstranit pravidlo" na Cascade.

Konfigurace omezení cizího klíče na kaskádová odstranění

Obrázek 5: Konfigurace omezení cizího klíče na kaskádová odstranění (kliknutím zobrazíte obrázek v plné velikosti)

Chcete-li uložit omezení cizího klíče, kliknutím na tlačítko Zavřít ukončete relace cizího klíče. Potom kliknutím na ikonu Uložit na panelu nástrojů tabulku a tuto relaci uložte.

Uložení domovského města uživatele, domovské stránky a podpisu

Tabulka GuestbookComments ukazuje, jak ukládat informace, které sdílejí relaci 1:N s uživatelskými účty. Vzhledem k tomu, že každý uživatelský účet může mít libovolný počet přidružených komentářů, je tato relace modelována vytvořením tabulky, ve které se bude uchovávat sada komentářů, která obsahuje sloupec, který odkazuje jednotlivé komentáře na konkrétního uživatele. Při použití SqlMembershipProviderpříkazu se toto propojení nejlépe vytvoří vytvořením sloupce s názvem UserId typu uniqueidentifier a omezením cizího klíče mezi tímto sloupcem a aspnet_Users.UserId.

K jednotlivým uživatelským účtům teď potřebujeme přidružit tři sloupce, abychom uložili domovské město, domovskou stránku a podpis uživatele, které se zobrazí v komentářích k jeho knize hostů. Existuje několik různých způsobů, jak toho dosáhnout:

  • Přidání nových sloupců doaspnet_UsersNeboaspnet_MembershipTabulky. Tento přístup nedoporučuji, protože upravuje schéma používané SqlMembershipProvidernástrojem . Toto rozhodnutí se může vrátit, aby vás pronásledovat na cestě. Co když například budoucí verze ASP.NET používá jiné SqlMembershipProvider schéma. Microsoft může zahrnout nástroj pro migraci dat ASP.NET 2.0 SqlMembershipProvider do nového schématu, ale pokud jste upravili schéma ASP.NET 2.0 SqlMembershipProvider , nemusí být takový převod možný.

  • Použijte ASP. NET definuje vlastnost profilu pro domovské město, domovskou stránku a podpis. ASP.NET zahrnuje architekturu profilu, která je navržená tak, aby ukládala další data specifická pro uživatele. Stejně jako architektura členství je architektura profilů sestavena na základě modelu zprostředkovatele. Rozhraní .NET Framework se dodává se sthat ukládáním SqlProfileProvider dat profilu do databáze SQL Server. Ve skutečnosti už naše databáze obsahuje tabulku používanou objektem SqlProfileProvider (aspnet_Profile), protože byla přidána při přidání aplikačních služeb zpět v kurzu Vytvoření schématu členství v SQL Server.
    Hlavní výhodou architektury profilů je to, že umožňuje vývojářům definovat vlastnosti profilu v Web.config – není nutné zapsat žádný kód pro serializaci dat profilu do a z podkladového úložiště dat. Stručně řečeno, definovat sadu vlastností profilu a pracovat s nimi v kódu je neuvěřitelně snadné. Pokud jde o správu verzí, systém profilů ale nechává mnoho požadavků, takže pokud máte aplikaci, ve které očekáváte, že se později přidají nové vlastnosti specifické pro uživatele, nebo existující vlastnosti, které se mají odebrat nebo upravit, nemusí být architektura profilů nejlepší volbou. Kromě toho SqlProfileProvider ukládá vlastnosti profilu vysoce denormalizovaným způsobem, takže je téměř nemožné spouštět dotazy přímo na data profilu (například kolik uživatelů má domovské město New York).
    Další informace o architektuře profilů najdete v části Další informace na konci tohoto kurzu.

  • Přidejte tyto tři sloupce do nové tabulky v databázi a vytvořte relaci 1:1 mezi touto tabulkou aaspnet_Users. Tento přístup zahrnuje o něco více práce než s architekturou profilů, ale nabízí maximální flexibilitu při modelování dalších vlastností uživatele v databázi. Tuto možnost použijeme v tomto kurzu.

Vytvoříme novou tabulku s názvem pro UserProfiles uložení domovského města, domovské stránky a podpisu pro každého uživatele. V okně Průzkumníka databází klikněte pravým tlačítkem na složku Tabulky a zvolte vytvořit novou tabulku. Pojmenujte první sloupec UserId a nastavte jeho typ na uniqueidentifier. NULL Zakázat hodnoty a označit sloupec jako primární klíč. Dále přidejte sloupce s názvy: HomeTown typu nvarchar(50); HomepageUrl typu nvarchar(100); a Podpis typu nvarchar(500). Každý z těchto tří sloupců může přijmout NULL hodnotu.

Vytvoření tabulky UserProfiles

Obrázek 6: Vytvoření UserProfiles tabulky (kliknutím zobrazíte obrázek v plné velikosti)

Uložte tabulku a pojmenujte ji UserProfiles. Nakonec vytvořte omezení cizího klíče mezi polem UserProfiles tabulky UserId a polem aspnet_Users.UserId . Stejně jako u omezení cizího klíče mezi GuestbookComments tabulkami a aspnet_Users nechte toto omezení kaskádovitě odstranit. Vzhledem k tomu, UserId že pole v UserProfiles souboru je primárním klíčem, zajistí se, že pro každý uživatelský účet nebude v UserProfiles tabulce více než jeden záznam. Tento typ relace se označuje jako 1:1.

Teď, když máme vytvořený datový model, jsme připraveni ho použít. V krocích 2 a 3 se podíváme na to, jak může aktuálně přihlášený uživatel zobrazit a upravit své domovské město, domovskou stránku a informace o podpisu. V kroku 4 vytvoříme rozhraní pro ověřené uživatele, kteří budou do knihy hostů odesílat nové komentáře a prohlížet si ty stávající.

Krok 2: Zobrazení domovské stránky, domovské stránky a podpisu uživatele

Aktuálně přihlášený uživatel může zobrazit a upravit informace o svém domovském městě, domovské stránce a podpisech různými způsoby. Uživatelské rozhraní bychom mohli vytvořit ručně pomocí ovládacích prvků TextBox a Label nebo bychom mohli použít některý z datových webových ovládacích prvků, jako je například ovládací prvek DetailsView. K provedení databáze SELECT a UPDATE příkazů bychom mohli napsat ADO.NET kód do třídy kódu na pozadí naší stránky nebo případně použít deklarativní přístup s SqlDataSource. V ideálním případě by naše aplikace obsahovala vrstvenou architekturu, kterou bychom mohli buď programově vyvolat z třídy kódu na pozadí stránky, nebo deklarativně prostřednictvím ovládacího prvku ObjectDataSource.

Vzhledem k tomu, že se tato série kurzů zaměřuje na ověřování formulářů, autorizaci, uživatelské účty a role, nebudeme podrobně diskutovat o těchto různých možnostech přístupu k datům ani o tom, proč je upřednostňována vrstvené architektury před spouštěním příkazů SQL přímo ze stránky ASP.NET. Chystám se projít pomocí DetailsView a SqlDataSource – nejrychlejší a nejjednodušší možnost – ale probírané koncepty se určitě dají použít na alternativní webové ovládací prvky a logiku přístupu k datům. Další informace o práci s daty v ASP.NET najdete v sérii kurzů Práce s daty v ASP.NET 2.0 .

AdditionalUserInfo.aspx Otevřete stránku ve Membership složce a přidejte na stránku ovládací prvek DetailsView, nastavte jeho ID vlastnost na UserProfile a vymažte jeho Width vlastnosti a Height vlastnosti. Rozbalte inteligentní značku DetailsView a zvolte její vazbu na nový ovládací prvek zdroje dat. Tím se spustí Průvodce konfigurací zdroje dat (viz obrázek 7). První krok vás vyzve k zadání typu zdroje dat. Vzhledem k tomu, že se připojíme přímo k SecurityTutorials databázi, zvolte ikonu Databáze a zadejte ID jako UserProfileDataSource.

Přidání nového ovládacího prvku SqlDataSource s názvem UserProfileDataSource

Obrázek 7: Přidání nového ovládacího prvku SqlDataSource s názvem UserProfileDataSource (kliknutím zobrazíte obrázek v plné velikosti)

Na další obrazovce se zobrazí výzva k použití databáze. Už jsme pro databázi definovali SecurityTutorials připojovací řetězecWeb.config. Tento název připojovacího řetězce – SecurityTutorialsConnectionString by měl být v rozevíracím seznamu. Vyberte tuto možnost a klikněte na Další.

V seznamu Drop-Down zvolte SecurityTutorialsConnectionString.

Obrázek 8: Výběr SecurityTutorialsConnectionString ze seznamu Drop-Down (kliknutím zobrazíte obrázek v plné velikosti)

Následující obrazovka nás vyzve k zadání tabulky a sloupců, které se mají dotazovat. V rozevíracím UserProfiles seznamu vyberte tabulku a zkontrolujte všechny sloupce.

Vrácení všech sloupců z tabulky UserProfiles

Obrázek 9: Vrácení všech sloupců z UserProfiles tabulky (kliknutím zobrazíte obrázek v plné velikosti)

Aktuální dotaz na obrázku 9 vrátí všechny záznamy v UserProfilesnástroji , ale zajímá nás pouze aktuálně přihlášený záznam uživatele. Pokud chcete přidat WHERE klauzuli, kliknutím na WHERE tlačítko zobrazte dialogové okno Přidat WHERE klauzuli (viz obrázek 10). Tady můžete vybrat sloupec, podle který chcete filtrovat, operátor a zdroj parametru filtru. Jako sloupec vyberte UserId "=" jako Operátor.

Bohužel neexistuje žádný předdefinovaný zdroj parametrů, který by vrátil aktuálně přihlášenou hodnotu uživatele UserId . Tuto hodnotu budeme muset uchopit programově. Proto nastavte rozevírací seznam Zdroj na Hodnotu "Žádný", kliknutím na tlačítko Přidat přidejte parametr a potom klikněte na TLAČÍTKO OK.

Přidání parametru filtru do sloupce UserId

Obrázek 10: Přidání parametru filtru do UserId sloupce (kliknutím zobrazíte obrázek v plné velikosti)

Po kliknutí na OK se vrátíte na obrazovku zobrazenou na obrázku 9. Tentokrát by ale dotaz SQL v dolní části obrazovky měl obsahovat klauzuli WHERE . Kliknutím na Další přejděte na obrazovku Test Query (Testovací dotaz). Tady můžete dotaz spustit a zobrazit výsledky. Dokončete průvodce kliknutím na Dokončit.

Po dokončení Průvodce konfigurací zdroje dat vytvoří Visual Studio ovládací prvek SqlDataSource na základě nastavení zadaných v průvodci. Kromě toho ručně přidá BoundFields do DetailsView pro každý sloupec vrácený SqlDataSource .SelectCommand Není nutné zobrazovat UserId pole v zobrazení DetailsView, protože uživatel nemusí znát tuto hodnotu. Toto pole můžete odebrat přímo z deklarativní značky ovládacího prvku DetailsView nebo kliknutím na odkaz Upravit pole z jeho inteligentní značky.

V tomto okamžiku by deklarativní kód stránky měl vypadat nějak takto:

<asp:DetailsView ID="UserProfile" runat="server"
     AutoGenerateRows="False" DataKeyNames="UserId"
     DataSourceID="UserProfileDataSource">
     <Fields>
          <asp:BoundField DataField="HomeTown" HeaderText="HomeTown"
               SortExpression="HomeTown" />
          <asp:BoundField DataField="HomepageUrl" HeaderText="HomepageUrl"
               SortExpression="HomepageUrl" />
          <asp:BoundField DataField="Signature" HeaderText="Signature"
               SortExpression="Signature" />
     </Fields>
</asp:DetailsView>
<asp:SqlDataSource ID="UserProfileDataSource" runat="server"
          ConnectionString="<%$ ConnectionStrings:SecurityTutorialsConnectionString %>"
          SelectCommand="SELECT [UserId], [HomeTown], [HomepageUrl], [Signature] FROM
          [UserProfiles] WHERE ([UserId] = @UserId)">
     <SelectParameters>
          <asp:Parameter Name="UserId" Type="Object" />
     </SelectParameters>
</asp:SqlDataSource>

Před výběrem dat musíme programově nastavit parametr ovládacího prvku UserId SqlDataSource na aktuálně přihlášeného uživatele UserId . Toho lze dosáhnout vytvořením obslužné rutiny události pro událost SqlDataSource Selecting a přidáním následujícího kódu:

protected void UserProfileDataSource_Selecting(object sender, 
          SqlDataSourceSelectingEventArgs e)
{
     // Get a reference to the currently logged on user
     MembershipUser currentUser = Membership.GetUser();
 
     // Determine the currently logged on user's UserId value
     Guid currentUserId = (Guid)currentUser.ProviderUserKey;
 
     // Assign the currently logged on user's UserId to the @UserId parameter
     e.Command.Parameters["@UserId"].Value = currentUserId;
}

Výše uvedený kód začíná získáním odkazu na aktuálně přihlášeného uživatele voláním Membership metody třídy GetUser . Vrátí objekt MembershipUser , jehož ProviderUserKey vlastnost obsahuje UserId. Hodnota UserId se pak přiřadí k parametru SqlDataSource @UserId .

Poznámka

Metoda Membership.GetUser() vrátí informace o aktuálně přihlášeného uživatele. Pokud stránku navštíví anonymní uživatel, vrátí hodnotu null. V takovém případě to při pokusu o přečtení ProviderUserKey vlastnosti povede NullReferenceException k následujícímu řádku kódu. Samozřejmě se nemusíme starat o Membership.GetUser() vrácení null hodnoty na AdditionalUserInfo.aspx stránce, protože jsme v předchozím kurzu nakonfigurovali autorizaci url tak, aby k ASP.NET prostředkům v této složce měli přístup jenom ověření uživatelé. Pokud potřebujete získat přístup k informacím o aktuálně přihlášených uživatelích na stránce, kde je povolený anonymní přístup, nezapomeňte před odkazováním na jeho vlastnosti zkontrolovat, zdanull MembershipUser je objekt vrácen z GetUser() metody.

Pokud stránku navštívíte AdditionalUserInfo.aspx v prohlížeči, zobrazí se prázdná stránka, protože jsme ještě do tabulky nepřidáli žádné řádky UserProfiles . V kroku 6 se podíváme na to, jak přizpůsobit ovládací prvek CreateUserWizard tak, aby automaticky přidal nový řádek do UserProfiles tabulky při vytvoření nového uživatelského účtu. Prozatím ale budeme muset ručně vytvořit záznam v tabulce.

V sadě Visual Studio přejděte do Průzkumníka databáze a rozbalte složku Tabulky. Klikněte pravým tlačítkem na aspnet_Users tabulku a zvolte Zobrazit data tabulky, aby se zobrazily záznamy v tabulce. To samé udělejte pro UserProfiles tabulku. Na obrázku 11 jsou tyto výsledky zobrazeny ve svislém dlaždici. V mé databázi jsou aktuálně aspnet_Users záznamy pro Bruce, Freda a Titoa, ale v UserProfiles tabulce nejsou žádné záznamy.

Zobrazí se obsah tabulek aspnet_Users a UserProfiles.

Obrázek 11: Zobrazí se obsah aspnet_Users tabulek a UserProfiles (kliknutím zobrazíte obrázek v plné velikosti)

Přidejte do tabulky nový záznam tak, že UserProfiles ručně zadáte hodnoty polí HomeTown, HomepageUrla Signature . Nejjednodušší způsob, jak získat platnou UserId hodnotu v novém UserProfiles záznamu, je vybrat UserId pole z konkrétního uživatelského účtu v aspnet_Users tabulce a zkopírovat ho UserId a vložit do pole v UserProfiles. Obrázek 12 znázorňuje UserProfiles tabulku po přidání nového záznamu pro Bruce.

Záznam byl přidán do userProfiles pro Bruce

Obrázek 12: Záznam byl přidán do UserProfiles pro Bruce (kliknutím zobrazíte obrázek v plné velikosti)

Vraťte se na AdditionalUserInfo.aspx stránku, jste přihlášeni jako Bruce. Jak ukazuje obrázek 13, zobrazí se nastavení Bruce.

Aktuálně hostujícímu uživateli se zobrazí jeho nastavení

Obrázek 13: Aktuálně hostujícímu uživateli se zobrazí jeho nastavení (kliknutím zobrazíte obrázek v plné velikosti)

Poznámka

Pokračujte a ručně přidejte záznamy do UserProfiles tabulky pro každého uživatele členství. V kroku 6 se podíváme na to, jak přizpůsobit ovládací prvek CreateUserWizard automaticky přidat nový řádek do UserProfiles tabulky při vytvoření nového uživatelského účtu.

Krok 3: Povolení uživateli upravovat své domovské město, domovskou stránku a podpis

V tomto okamžiku může aktuálně přihlášený uživatel zobrazit nastavení svého domovského města, domovské stránky a podpisu, ale zatím je nemůže upravit. Pojďme aktualizovat ovládací prvek DetailsView, aby bylo možné data upravovat.

První věc, kterou musíme udělat, je přidat UpdateCommand pro SqlDataSource a zadat UPDATE příkaz, který se má provést, a jeho odpovídající parametry. Vyberte SqlDataSource a v okno Vlastnosti kliknutím na tři tečky vedle vlastnosti UpdateQuery otevřete dialogové okno Editor příkazů a parametrů. Do textového pole zadejte následující UPDATE příkaz:

UPDATE UserProfiles SET
     HomeTown = @HomeTown,
     HomepageUrl = @HomepageUrl,
     Signature = @Signature
WHERE UserId = @UserId

Potom klikněte na tlačítko Aktualizovat parametry, které vytvoří parametr v kolekci ovládacího prvku UpdateParameters SqlDataSource pro každý z parametrů v příkazu UPDATE . Ponechte zdroj pro všechny parametry nastavený na Žádný a kliknutím na tlačítko OK dokončete dialogové okno.

Určení parametru UpdateCommand a UpdateParameters zdroje SqlDataSource

Obrázek 14: Určení UpdateCommand a UpdateParameters (Kliknutím zobrazíte obrázek v plné velikosti)

Díky doplňkům, které jsme provedli v ovládacím prvku SqlDataSource, může ovládací prvek DetailsView nyní podporovat úpravy. V inteligentní značce DetailsView zaškrtněte políčko Povolit úpravy. Tím se do kolekce ovládacího prvku Fields přidá CommandField s jeho ShowEditButton vlastností nastavenou na True. Tím se vykreslí tlačítko Upravit, když se DetailsView zobrazí v režimu jen pro čtení a tlačítka Aktualizovat a Zrušit, když se zobrazí v režimu úprav. Místo toho, aby uživatel musel kliknout na Upravit, ale můžeme detailsView vykreslit ve stavu "vždy upravitelné" nastavením vlastnosti DetailsView ovládacího prvku DefaultMode na Edit.

S těmito změnami by deklarativní kód ovládacího prvku DetailsView měl vypadat podobně jako následující:

<asp:DetailsView ID="UserProfile" runat="server"
          AutoGenerateRows="False" DataKeyNames="UserId"
          DataSourceID="UserProfileDataSource" DefaultMode="Edit">
     <Fields>
          <asp:BoundField DataField="HomeTown" HeaderText="HomeTown"
               SortExpression="HomeTown" />
          <asp:BoundField DataField="HomepageUrl" HeaderText="HomepageUrl"
               SortExpression="HomepageUrl" />
          <asp:BoundField DataField="Signature" HeaderText="Signature"
               SortExpression="Signature" />
          <asp:CommandField ShowEditButton="True" />
     </Fields>
</asp:DetailsView>

Všimněte si přidání CommandField a DefaultMode vlastnosti .

Pokračujte a otestujte tuto stránku v prohlížeči. Při návštěvě uživatele, který má odpovídající záznam v UserProfiles, se nastavení uživatele zobrazí v upravitelném rozhraní.

DetailsView vykreslí upravitelné rozhraní.

Obrázek 15: DetailsView vykreslí upravitelné rozhraní (kliknutím zobrazíte obrázek v plné velikosti)

Zkuste změnit hodnoty a kliknout na tlačítko Aktualizovat. Vypadá to, jako by se nic nestalo. Dojde k zpětnému odeslání a hodnoty se uloží do databáze, ale neexistuje žádná vizuální zpětná vazba, že k uložení došlo.

Pokud chcete tento problém napravit, vraťte se do sady Visual Studio a přidejte nad DetailsView ovládací prvek Popisek. Nastavte jeho ID hodnotu na SettingsUpdatedMessage, jeho Text vlastnost na "Vaše nastavení byla aktualizována" a jeho Visible vlastnosti a EnableViewState na false.

<asp:Label ID="SettingsUpdatedMessage" runat="server"
     Text="Your settings have been updated."
     EnableViewState="false"
     Visible="false"></asp:Label>

Popisek musíme zobrazit SettingsUpdatedMessage vždy, když se detailsView aktualizuje. Chcete-li toho dosáhnout, vytvořte obslužnou rutinu události pro událost DetailsView ItemUpdated a přidejte následující kód:

protected void UserProfile_ItemUpdated(object sender, DetailsViewUpdatedEventArgs e)
{
     SettingsUpdatedMessage.Visible = true;
}

Vraťte se na AdditionalUserInfo.aspx stránku prostřednictvím prohlížeče a aktualizujte data. Tentokrát se zobrazí užitečná stavová zpráva.

Při aktualizaci nastavení se zobrazí krátká zpráva.

Obrázek 16: Při aktualizaci nastavení se zobrazí krátká zpráva (kliknutím zobrazíte obrázek v plné velikosti)

Poznámka

Rozhraní pro úpravy ovládacího prvku DetailsView ponechá spoustu požadovaných. Používá textová pole standardní velikosti, ale pole Podpis by mělo být pravděpodobně víceřádkové textové pole. RegularExpressionValidator by se měl použít k zajištění, že adresa URL domovské stránky, pokud je zadána, začíná na "http://" nebo "https://". Navíc, protože DetailsView ovládací prvek má jeho DefaultMode vlastnost nastavena na Edit, Zrušit tlačítko nedělá nic. Měl by se buď odebrat, nebo po kliknutí přesměrovat uživatele na jinou stránku (například ~/Default.aspx). Tato vylepšení nechávám jako cvičení pro čtenáře.

V současné době web neposkytuje žádné odkazy na AdditionalUserInfo.aspx stránku. Jediný způsob, jak se k němu dostat, je zadat adresu URL stránky přímo do adresního řádku prohlížeče. Pojďme přidat odkaz na tuto stránku na stránce předlohy Site.master .

Vzpomeňte si, že stránka předlohy obsahuje ovládací prvek LoginView Web v jeho LoginContent ContentPlaceHolder, který zobrazuje různé značky pro ověřené a anonymní návštěvníky. Aktualizujte ovládací prvky LoginView tak, LoggedInTemplate aby obsahovaly odkaz na AdditionalUserInfo.aspx stránku. Po provedení těchto změn by měl deklarativní kód ovládacího prvku LoginView vypadat podobně jako následující:

<asp:LoginView ID="LoginView1" runat="server">
     <LoggedInTemplate>
          Welcome back,
          <asp:LoginName ID="LoginName1" runat="server" />.
          <br />
          <asp:HyperLink ID="lnkUpdateSettings" runat="server" 
               NavigateUrl="~/Membership/AdditionalUserInfo.aspx">
               Update Your Settings</asp:HyperLink>
     </LoggedInTemplate>
     <AnonymousTemplate>
          Hello, stranger.
     </AnonymousTemplate>
</asp:LoginView>

Všimněte si přidání lnkUpdateSettings ovládacího prvku HyperLink do .LoggedInTemplate S tímto odkazem můžou ověření uživatelé rychle přejít na stránku a zobrazit a upravit nastavení svého domovského města, domovské stránky a podpisu.

Krok 4: Přidání nových komentářů k knize hostů

Na Guestbook.aspx této stránce můžou ověření uživatelé zobrazit knihu hostů a přidat komentář. Začněme vytvořením rozhraní pro přidání nových komentářů k knize hostů.

Guestbook.aspx Otevřete stránku v sadě Visual Studio a vytvořte uživatelské rozhraní, které se skládá ze dvou ovládacích prvků TextBox, jednoho pro předmět nového komentáře a jednoho pro jeho text. Nastavte vlastnost prvního ovládacího prvku TextBox na Subject a jeho Columns vlastnost na hodnotu 40, hodnotu sekundy ID na Bodyhodnotu , její TextMode hodnotu na MultiLinehodnotu a Width vlastnosti a Rows na hodnotu 95 % a 8.ID Uživatelské rozhraní dokončíte tak, že přidáte webový ovládací prvek Tlačítko s názvem PostCommentButton a jeho vlastnost nastavíte Text na "Publikovat komentář".

Vzhledem k tomu, že každý komentář k knize hostů vyžaduje předmět a text, přidejte requiredFieldValidator pro každé textové pole. ValidationGroup Nastavte vlastnost těchto ovládacích prvků na "EnterComment"; podobně nastavte PostCommentButton vlastnost ovládacího prvku ValidationGroup na "EnterComment". Další informace o asp. Ovládací prvky pro ověření v ASP.NET najdete v tématu Ověření formuláře.

Po vytvoření uživatelského rozhraní by deklarativní kód stránky měl vypadat nějak takto:

<h3>Leave a Comment</h3>
<p>
     <b>Subject:</b>
     <asp:RequiredFieldValidator ID="SubjectReqValidator" runat="server"
          ErrorMessage="You must provide a value for Subject"
          ControlToValidate="Subject" ValidationGroup="EnterComment">
     </asp:RequiredFieldValidator><br/>
     <asp:TextBox ID="Subject" Columns="40" runat="server"></asp:TextBox>
</p>
<p>
     <b>Body:</b>
     <asp:RequiredFieldValidator ID="BodyReqValidator" runat="server"
          ControlToValidate="Body"
          ErrorMessage="You must provide a value for Body" ValidationGroup="EnterComment">
     </asp:RequiredFieldValidator><br/>
     <asp:TextBox ID="Body" TextMode="MultiLine" Width="95%"
          Rows="8" runat="server"></asp:TextBox>
</p>
<p>
     <asp:Button ID="PostCommentButton" runat="server" 
          Text="Post Your Comment"
          ValidationGroup="EnterComment" />
</p>

Po dokončení uživatelského rozhraní je naším dalším úkolem vložit nový záznam do GuestbookComments tabulky po kliknutí na PostCommentButton . Toho lze dosáhnout několika způsoby: můžeme napsat ADO.NET kód v obslužné rutině události Button Click ; můžeme přidat ovládací prvek SqlDataSource na stránku, nakonfigurovat jeho InsertCommanda pak volat jeho Insert metodu z Click obslužné rutiny události; nebo můžeme vytvořit střední vrstvu, která byla zodpovědná za vkládání nových komentářů k knize hostů, a vyvolat tuto funkci z Click obslužné rutiny události. Vzhledem k tomu, že jsme se v kroku 3 podívali na použití SqlDataSource, použijeme tady ADO.NET kód.

Poznámka

Třídy ADO.NET používané pro programový přístup k datům z databáze Microsoft SQL Server jsou umístěny v System.Data.SqlClient oboru názvů . Možná budete muset importovat tento obor názvů do třídy kódu na pozadí stránky (tj. using System.Data.SqlClient;).

Vytvořte obslužnou rutinu PostCommentButtonClick události pro událost a přidejte následující kód:

protected void PostCommentButton_Click(object sender, EventArgs e)
{
     if (!Page.IsValid)
          return;
 
     // Determine the currently logged on user's UserId
     MembershipUser currentUser = Membership.GetUser();
     Guid currentUserId = (Guid)currentUser.ProviderUserKey;
 
     // Insert a new record into GuestbookComments
     string connectionString = 
          ConfigurationManager.ConnectionStrings["SecurityTutorialsConnectionString"].ConnectionString;
     string insertSql = "INSERT INTO GuestbookComments(Subject, Body, UserId) VALUES(@Subject,
               @Body, @UserId)";
 
     using (SqlConnection myConnection = new SqlConnection(connectionString))
     {
          myConnection.Open();
          SqlCommand myCommand = new SqlCommand(insertSql, myConnection);
          myCommand.Parameters.AddWithValue("@Subject", Subject.Text.Trim());
          myCommand.Parameters.AddWithValue("@Body", Body.Text.Trim());
          myCommand.Parameters.AddWithValue("@UserId", currentUserId);
          myCommand.ExecuteNonQuery();
          myConnection.Close();
     }
 
     // "Reset" the Subject and Body TextBoxes
     Subject.Text = string.Empty;
     Body.Text = string.Empty;
}

Obslužná rutina Click události začíná kontrolou, zda jsou data zadaná uživatelem platná. Pokud tomu tak není, obslužná rutina události se před vložením záznamu ukončí. Za předpokladu, že jsou zadaná data platná, hodnota aktuálně přihlášeného uživatele UserId se načte a uloží do currentUserId místní proměnné. Tato hodnota je potřebná, protože při vkládání záznamu UserId do GuestbookCommentsmusíme zadat hodnotu .

Potom se načte Web.config připojovací řetězec pro SecurityTutorials databázi a zadá se INSERT příkaz SQL. Objekt SqlConnection se pak vytvoří a otevře. SqlCommand Dále se vytvoří objekt a přiřadí se hodnoty parametrů použitých v INSERT dotazu. Příkaz INSERT se pak spustí a připojení se ukončí. Na konci obslužné rutiny události jsou Subject vlastnosti a Body TextBoxes Text vymazány, aby hodnoty uživatele nebyly zachovány v rámci zpětného odeslání.

Pokračujte a otestujte tuto stránku v prohlížeči. Vzhledem k tomu, že se tato stránka nachází ve Membership složce, není přístupná anonymním návštěvníkům. Proto se budete muset nejprve přihlásit (pokud jste to ještě neudělali). Do textových polí a zadejte hodnotu Subject a a klikněte na PostCommentButton tlačítko .Body To způsobí přidání nového záznamu do GuestbookComments. Při zpětném odeslání se předmět a text, které jste zadali, vymažou z textových polí.

Po kliknutí na PostCommentButton tlačítko se žádná vizuální zpětná vazba, že byl komentář přidán do knihy hostů. Tuto stránku ještě musíme aktualizovat, aby se zobrazily existující komentáře k knize hostů, což uděláme v kroku 5. Jakmile toho dosáhneme, právě přidaný komentář se zobrazí v seznamu komentářů a poskytne odpovídající vizuální zpětnou vazbu. Prozatím zkontrolujte obsah tabulky tak, že zkontrolujete, GuestbookComments jestli byl váš komentář k knize hostů uložený.

Obrázek 17 znázorňuje obsah GuestbookComments tabulky po tom, co zbyly dva komentáře.

Komentáře k knize hostů najdete v tabulce GuestbookComments.

Obrázek 17: V tabulce můžete vidět komentáře GuestbookComments k knize hostů (kliknutím zobrazíte obrázek v plné velikosti)

Poznámka

Pokud se uživatel pokusí vložit komentář k knize hostů, který obsahuje potenciálně nebezpečné kódy ( například HTML), ASP.NET vyvolá .HttpRequestValidationException Další informace o této výjimce, proč je vyvolána a jak uživatelům povolit odesílání potenciálně nebezpečných hodnot, najdete v dokumentu white paper pro žádosti o ověření.

Krok 5: Výpis existujících komentářů k knize hostů

Kromě ponechání komentářů by uživatel, který navštíví Guestbook.aspx stránku, měl mít také možnost zobrazit stávající komentáře k knize hostů. Chcete-li toho dosáhnout, přidejte ovládací prvek ListView s názvem CommentList do dolní části stránky.

Poznámka

Ovládací prvek ListView je novinkou ASP.NET verze 3.5. Je navržen tak, aby zobrazoval seznam položek ve velmi přizpůsobitelném a flexibilním rozložení, ale přesto nabízí integrované funkce pro úpravy, vkládání, odstraňování, stránkování a řazení, jako je GridView. Pokud používáte ASP.NET 2.0, budete muset místo toho použít ovládací prvek DataList nebo Repeater. Další informace o použití ListView najdete v položce blogu Scotta Guthrieho, Ovládací prvek asp:ListView a můj článek Zobrazení dat pomocí ovládacího prvku ListView.

Otevřete inteligentní značku ListView a v rozevíracím seznamu Zvolit zdroj dat vytvořte vazbu ovládacího prvku na nový zdroj dat. Jak jsme viděli v kroku 2, spustí se Průvodce konfigurací zdroje dat. Vyberte ikonu Databáze, pojmenujte výsledný zdroj dat SqlDataSource CommentsDataSourcea klikněte na OK. Potom vyberte SecurityTutorialsConnectionString připojovací řetězec z rozevíracího seznamu a klikněte na Další.

V tomto okamžiku v kroku 2 jsme zadali data, která se mají dotazovat, tak, že jsme z rozevíracího seznamu vybrali UserProfiles tabulku a vybrali sloupce, které se mají vrátit (podívejte se zpět na Obrázek 9). Tentokrát ale chceme vytvořit příkaz SQL, který stáhne nejen záznamy z GuestbookComments, ale také domovského města komentátora, domovské stránky, podpisu a uživatelského jména. Proto vyberte přepínač "Zadejte vlastní příkaz SQL nebo uloženou proceduru" a klikněte na Další.

Zobrazí se obrazovka Definovat vlastní příkazy nebo uložené procedury. Kliknutím na tlačítko Tvůrce dotazů sestavte dotaz graficky. Tvůrce dotazů začne tím, že nás vyzve k zadání tabulek, ze které se chceme dotazovat. GuestbookCommentsVyberte tabulky , UserProfilesa aspnet_Users a klikněte na OK. Tím se na návrhovou plochu přidají všechny tři tabulky. Vzhledem k tomu, že mezi tabulkami , UserProfilesa aspnet_Users existují omezení cizího GuestbookCommentsklíče, Tvůrce dotazů tyto tabulky automaticky JOIN vytvoří.

Zbývá jen zadat sloupce, které se mají vrátit. GuestbookComments V tabulce vyberte Subjectsloupce , Bodya CommentDate , vraťte HomepageUrlHomeTownsloupce , a Signature z UserProfiles tabulky a vraťte UserName hodnotu z aspnet_Userstabulky . Na konec SELECT dotazu také přidejte ,ORDER BY CommentDate DESC aby se jako první vrátily nejnovější příspěvky. Po provedení těchto výběrů by mělo rozhraní Tvůrce dotazů vypadat podobně jako na snímku obrazovky na obrázku 18.

Vytvořené dotazy JOINs GuestbookComments, UserProfiles a aspnet_Users tabulky

Obrázek 18: Vytvořený dotaz JOIN s GuestbookCommentstabulkami , UserProfilesa aspnet_Users (kliknutím zobrazíte obrázek v plné velikosti)

Kliknutím na OK zavřete okno Tvůrce dotazů a vraťte se na obrazovku Definovat vlastní příkazy nebo uložené procedury. Kliknutím na Další přejděte na obrazovku Testovací dotaz, kde můžete zobrazit výsledky dotazu kliknutím na tlačítko Testovací dotaz. Až budete připraveni, kliknutím na Dokončit dokončete průvodce Konfigurací zdroje dat.

Po dokončení průvodce Konfigurací zdroje dat v kroku 2 byla kolekce přidruženého Fields ovládacího prvku DetailsView aktualizována tak, aby zahrnovala BoundField pro každý sloupec vrácený objektem SelectCommand. ListView, nicméně, zůstává beze změny; stále potřebujeme definovat jeho rozložení. Rozložení ListView lze vytvořit ručně prostřednictvím deklarativní značky nebo z možnosti "Konfigurovat ListView" v jeho inteligentní značce. Obvykle dávám přednost ručnímu definování značky, ale použijte jakoukoli metodu, která je pro vás nejpřirozenější.

Nakonec jsem pro ovládací prvek ListView používal(a) následující LayoutTemplate, ItemTemplatea ItemSeparatorTemplate :

<asp:ListView ID="CommentList" runat="server" DataSourceID="CommentsDataSource">
     <LayoutTemplate>
          <span ID="itemPlaceholder" runat="server" />
          <p>
               <asp:DataPager ID="DataPager1" runat="server">
                    <Fields>
                         <asp:NextPreviousPagerField ButtonType="Button" 
                              ShowFirstPageButton="True"
                              ShowLastPageButton="True" />
                    </Fields>
               </asp:DataPager>
          </p>
     </LayoutTemplate>
     <ItemTemplate>
          <h4><asp:Label ID="SubjectLabel" runat="server" 
               Text='<%# Eval("Subject") %>' /></h4>
          <asp:Label ID="BodyLabel" runat="server" 
               Text='<%# Eval("Body").ToString().Replace(Environment.NewLine, "<br />") %>' />
          <p>
               ---<br />
               <asp:Label ID="SignatureLabel" Font-Italic="true" runat="server"
                    Text='<%# Eval("Signature") %>' />
               <br />
               <br />
               My Home Town:
               <asp:Label ID="HomeTownLabel" runat="server" 
                    Text='<%# Eval("HomeTown") %>' />
               <br />
               My Homepage:
               <asp:HyperLink ID="HomepageUrlLink" runat="server" 
                    NavigateUrl='<%# Eval("HomepageUrl") %>' 
                    Text='<%# Eval("HomepageUrl") %>' />
          </p>
          <p align="center">
               Posted by
               <asp:Label ID="UserNameLabel" runat="server" 
                    Text='<%# Eval("UserName") %>' /> on
               <asp:Label ID="CommentDateLabel" runat="server" 
                    Text='<%# Eval("CommentDate") %>' />
          </p>
     </ItemTemplate>
     <ItemSeparatorTemplate>
          <hr />
     </ItemSeparatorTemplate>
</asp:ListView>

Definuje LayoutTemplate značky generované ovládacím prvku, zatímco ItemTemplate vykresluje každou položku vrácenou SqlDataSource. Výsledný ItemTemplatekód se umístí do LayoutTemplateitemPlaceholder ovládacího prvku . Kromě itemPlaceholder, LayoutTemplate zahrnuje DataPager ovládací prvek, který omezuje ListView na zobrazení pouze 10 komentářů k knize hostů na stránku (výchozí) a vykresluje stránkovací rozhraní.

My ItemTemplate zobrazí každý komentář k knize hostů v elementu <h4> s textem umístěným pod předmětem. Všimněte si, že syntaxe používaná k zobrazení textu převezme data vrácená příkazem Eval("Body") databinding, převede je na řetězec a nahradí konce řádků elementem <br /> . Tento převod je nutný k zobrazení konců řádků zadaných při odeslání komentáře, protože kód HTML ignoruje prázdné znaky. Podpis uživatele se zobrazuje kurzívou pod textem, za kterým následuje rodné město uživatele, odkaz na jeho domovskou stránku, datum a čas, kdy byl komentář proveden, a uživatelské jméno osoby, která komentář opustila.

Chvíli si stránku prohlédněte v prohlížeči. Tady by se měly zobrazit komentáře, které jste přidali do knihy hostů v kroku 5.

Guestbook.aspx nyní zobrazuje komentáře k knize hostů

Obrázek 19: Guestbook.aspx Nyní zobrazí komentáře k knize hostů (kliknutím zobrazíte obrázek v plné velikosti).

Zkuste do knihy hostů přidat nový komentář. Po kliknutí na PostCommentButton tlačítko se stránka vrátí zpět a komentář se přidá do databáze, ale ovládací prvek ListView se neaktualizuje tak, aby zobrazoval nový komentář. To se dá opravit některým z těchto:

  • Aktualizace obslužné PostCommentButton rutiny události tlačítka Click tak, aby po vložení nového komentáře do databáze vyvolala metodu ovládacího prvku DataBind() ListView nebo
  • Nastavení vlastnosti ovládacího prvku EnableViewState ListView na false. Tento přístup funguje, protože zakázáním stavu zobrazení ovládacího prvku se musí znovu připojit k podkladovým datům při každém zpětném odeslání.

Obě techniky ilustruje web kurzu ke stažení z tohoto kurzu. Vlastnost ovládacího prvku EnableViewState ListView a false kód potřebný k programovému obnovení vazby dat na ListView se nachází v obslužné rutině Click události, ale je zakomentován.

Poznámka

AdditionalUserInfo.aspx V současné době stránka umožňuje uživateli zobrazit a upravit nastavení svého domovského města, domovské stránky a podpisu. Může být vhodné aktualizovat AdditionalUserInfo.aspx , aby se zobrazily komentáře k knize hostů přihlášeného uživatele. To znamená, že kromě zkoumání a úpravy svých informací může uživatel navštívit AdditionalUserInfo.aspx stránku, aby viděl, jaké komentáře k knize hostů udělal v minulosti. Nechávám to jako cvičení pro čtenáře, který se o to zajímá.

Krok 6: Přizpůsobení ovládacího prvku CreateUserWizard tak, aby zahrnoval rozhraní pro domovské město, domovskou stránku a podpis

Dotaz SELECT , který Guestbook.aspx stránka používá, používá ke INNER JOIN kombinování souvisejících záznamů mezi tabulkami GuestbookComments, UserProfilesa aspnet_Users . Pokud uživatel, který nemá žádný záznam v UserProfiles , vytvoří komentář k knize hostů, komentář se nezobrazí v ListView, protože INNER JOIN vrátí GuestbookComments pouze záznamy, pokud existují odpovídající záznamy v UserProfiles a aspnet_Users. A jak jsme viděli v kroku 3, pokud uživatel záznam nemá, UserProfiles nemůže zobrazit ani upravit nastavení na AdditionalUserInfo.aspx stránce.

Netřeba říkat, že vzhledem k našim rozhodnutím o návrhu je důležité, aby každý uživatelský účet v systému členství měl v UserProfiles tabulce odpovídající záznam. Chceme, aby byl odpovídající záznam přidán do UserProfiles pokaždé, když se vytvoří nový uživatelský účet Membership prostřednictvím Průvodce uživatelem CreateUserWizard.

Jak je popsáno v kurzu Vytváření uživatelských účtů , po vytvoření nového uživatelského účtu Členství vyvolá ovládací prvek CreateUserWizard svou CreatedUser událost. Pro tuto událost můžeme vytvořit obslužnou rutinu události, získat Id uživatele pro právě vytvořeného uživatele a potom vložit záznam do UserProfiles tabulky s výchozími hodnotami sloupců HomeTown, HomepageUrla Signature . Navíc je možné uživatele vyzvat k zadání těchto hodnot přizpůsobením rozhraní ovládacího prvku CreateUserWizard tak, aby zahrnovalo další textová pole.

Nejprve se podíváme na to, jak do tabulky v obslužné rutině CreatedUser události přidat nový řádek UserProfiles s výchozími hodnotami. Potom uvidíme, jak přizpůsobit uživatelské rozhraní ovládacího prvku CreateUserWizard tak, aby zahrnovalo další pole formuláře pro shromažďování domovského města nového uživatele, domovské stránky a podpisu.

Přidání výchozího řádku doUserProfiles

V kurzu Vytváření uživatelských účtů jsme na CreatingUserAccounts.aspx stránku ve Membership složce přidali ovládací prvek CreateUserWizard. Aby ovládací prvek CreateUserWizard přidal záznam do UserProfiles tabulky při vytvoření uživatelského účtu, musíme aktualizovat funkce ovládacího prvku CreateUserWizard. Místo toho, abychom tyto změny CreatingUserAccounts.aspx na stránce udělali, přidáme na EnhancedCreateUserWizard.aspx stránku nový ovládací prvek CreateUserWizard a provedeme změny pro tento kurz tam.

EnhancedCreateUserWizard.aspx Otevřete stránku v sadě Visual Studio a přetáhněte ovládací prvek CreateUserWizard ze sady nástrojů na stránku. Nastavte vlastnost ovládacího prvku ID CreateUserWizard na NewUserWizard. Jak jsme probrali v kurzu Vytváření uživatelských účtů, výchozí uživatelské rozhraní CreateUserWizard vyzve návštěvníka k zadání potřebných informací. Jakmile jsou tyto informace dodány, ovládací prvek interně vytvoří nový uživatelský účet v rámci členství, aniž by bylo nutné napsat jediný řádek kódu.

CreateUserWizard Ovládací prvek vyvolá řadu událostí během jeho pracovního postupu. Jakmile návštěvník poskytne informace o požadavku a odešle formulář, aktivuje ovládací prvek CreateUserWizard svou CreatingUser událost. Pokud během procesu vytváření dojde k problému, CreateUserError událost se aktivuje. Pokud se však uživatel úspěšně vytvoří, CreatedUser událost se vyvolá. V kurzu Vytváření uživatelských účtů jsme pro událost vytvořili obslužnou rutinu CreatingUser události, abychom měli jistotu, že zadané uživatelské jméno neobsahuje žádné úvodní nebo koncové mezery a že se uživatelské jméno nikde v hesle nezobrazí.

Abychom mohli přidat řádek do UserProfiles tabulky pro právě vytvořeného uživatele, musíme pro událost vytvořit obslužnou rutinu CreatedUser události. V době, kdy se CreatedUser událost aktivuje, už byl uživatelský účet vytvořen v rámci členství, což nám umožňuje načíst hodnotu UserId účtu.

Vytvořte obslužnou rutinu NewUserWizardCreatedUser události pro událost a přidejte následující kód:

protected void NewUserWizard_CreatedUser(object sender, EventArgs e)
{
     // Get the UserId of the just-added user
     MembershipUser newUser = Membership.GetUser(NewUserWizard.UserName);
     Guid newUserId = (Guid)newUser.ProviderUserKey;
 
     // Insert a new record into UserProfiles
     string connectionString = 
          ConfigurationManager.ConnectionStrings["SecurityTutorialsConnectionString"].ConnectionString;
     string insertSql = "INSERT INTO UserProfiles(UserId, HomeTown, HomepageUrl,
          Signature) VALUES(@UserId, @HomeTown, @HomepageUrl, @Signature)";
 
     using (SqlConnection myConnection = new SqlConnection(connectionString))
     {
          myConnection.Open();
          SqlCommand myCommand = new SqlCommand(insertSql, myConnection);
          myCommand.Parameters.AddWithValue("@UserId", newUserId);
          myCommand.Parameters.AddWithValue("@HomeTown", DBNull.Value);
          myCommand.Parameters.AddWithValue("@HomepageUrl", DBNull.Value);
          myCommand.Parameters.AddWithValue("@Signature", DBNull.Value);
          myCommand.ExecuteNonQuery();
          myConnection.Close();
     }
}

Výše uvedený kód se načte id uživatele právě přidaného uživatelského účtu. Toho se dosahuje pomocí Membership.GetUser(username) metody k vrácení informací o konkrétním uživateli a potom pomocí ProviderUserKey vlastnosti k načtení id uživatele. Uživatelské jméno zadané uživatelem v ovládacím prvku CreateUserWizard je k dispozici prostřednictvím jeho UserName vlastnosti.

Dále se připojovací řetězec načte z Web.config a zadá se INSERT příkaz . Vytvoří se instance potřebných ADO.NET objektů a provede se příkaz . Kód přiřadí DBNull instanci parametrům @HomeTown, @HomepageUrla @Signature , což má za následek vložení databázových NULL hodnot pro HomeTownpole , HomepageUrla Signature .

Přejděte na EnhancedCreateUserWizard.aspx stránku v prohlížeči a vytvořte nový uživatelský účet. Potom se vraťte do sady Visual Studio a prozkoumejte obsah aspnet_Users tabulek a UserProfiles (jako jsme to udělali na obrázku 12). Nový uživatelský účet by se měl zobrazit v aspnet_Users a odpovídající UserProfiles řádek (s NULL hodnotami pro HomeTown, HomepageUrla Signature).

Byl přidán nový uživatelský účet a záznam profilu uživatele

Obrázek 20: Byl přidán nový uživatelský účet a UserProfiles záznam (kliknutím zobrazíte obrázek v plné velikosti)

Jakmile návštěvník zadá informace o svém novém účtu a klikne na tlačítko Vytvořit uživatele, vytvoří se uživatelský účet a do UserProfiles tabulky se přidá řádek. Průvodce CreateUserWizard pak zobrazí svou CompleteWizardStep, která zobrazí zprávu o úspěchu a tlačítko Pokračovat. Kliknutí na tlačítko Pokračovat způsobí zpětné odeslání, ale žádná akce se neprovedou a uživatel se na EnhancedCreateUserWizard.aspx stránce zasekne.

Prostřednictvím vlastnosti ovládacího ContinueDestinationPageUrlprvku CreateUserWizard můžeme zadat adresu URL, na které se má uživatel po kliknutí na tlačítko Pokračovat. Nastavte ContinueDestinationPageUrl vlastnost na ~/Membership/AdditionalUserInfo.aspx. Tím se nový uživatel přesune do AdditionalUserInfo.aspx, kde může zobrazit a aktualizovat svá nastavení.

Přizpůsobení rozhraní CreateUserWizard pro zobrazení výzvy k zadání domovské stránky, domovské stránky a podpisu nového uživatele

Výchozí rozhraní ovládacího prvku CreateUserWizard je dostatečné pro jednoduché scénáře vytváření účtů, kde je potřeba shromažďovat pouze základní informace o uživatelském účtu, jako je uživatelské jméno, heslo a e-mail. Ale co kdybychom chtěli při vytváření účtu vyzvat návštěvníka, aby zadal své domovské město, domovskou stránku a podpis? Je možné přizpůsobit rozhraní ovládacího prvku CreateUserWizard pro shromažďování dalších informací při registraci a tyto informace mohou být použity v obslužné rutině CreatedUser události k vložení dalších záznamů do podkladové databáze.

Ovládací prvek CreateUserWizard rozšiřuje ovládací prvek průvodce ASP.NET, což je ovládací prvek, který umožňuje vývojáři stránky definovat řadu uspořádaných WizardSteps. Ovládací prvek Průvodce vykreslí aktivní krok a poskytuje navigační rozhraní, které návštěvníku umožňuje procházet těmito kroky. Ovládací prvek Průvodce je ideální pro rozdělení dlouhé úlohy do několika krátkých kroků. Další informace o ovládacím prvku Průvodce najdete v tématu Vytvoření podrobného uživatelského rozhraní pomocí ovládacího prvku průvodce ASP.NET 2.0.

Výchozí značky ovládacího prvku CreateUserWizard definují dvě WizardSteps: CreateUserWizardStep a CompleteWizardStep.

<asp:CreateUserWizard ID="NewUserWizard" runat="server"
     ContinueDestinationPageUrl="~/Membership/AdditionalUserInfo.aspx">
     <WizardSteps>
          <asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server">
          </asp:CreateUserWizardStep>
          <asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server">
          </asp:CompleteWizardStep>
     </WizardSteps>
</asp:CreateUserWizard>

První WizardStep, CreateUserWizardStepvykreslí rozhraní, které zobrazí výzvu k zadání uživatelského jména, hesla, e-mailu atd. Jakmile návštěvník tyto informace poskytne a klikne na Vytvořit uživatele, zobrazí CompleteWizardStepse zpráva o úspěchu a tlačítko Pokračovat.

Chcete-li přizpůsobit rozhraní ovládacího prvku CreateUserWizard tak, aby zahrnovalo další pole formuláře, můžeme:

  • Vytvoření jednoho nebo více novýchWizardSteps, aby obsahovaly další prvky uživatelského rozhraní. Chcete-li přidat nový WizardStep do CreateUserWizard, kliknutím na odkaz Přidat nebo odebrat WizardStepsz inteligentní značky spusťte WizardStep Editor kolekcí. Odtud můžete přidat, odebrat nebo změnit pořadí kroků v průvodci. Toto je přístup, který použijeme v tomto kurzu.

  • PřeveďteCreateUserWizardStepdo upravitelného objektuWizardStep. Tím se nahradí CreateUserWizardStep ekvivalentem WizardStep , jehož značky definují uživatelské rozhraní, které odpovídá hodnotě CreateUserWizardStep's. CreateUserWizardStepWizardStep Převodem na ovládací prvky můžeme přemístit ovládací prvky nebo do tohoto kroku přidat další prvky uživatelského rozhraní. Pokud chcete převést CreateUserWizardStep nebo CompleteWizardStep na upravitelný WizardStep, klikněte na odkaz Přizpůsobit krok vytvoření uživatele nebo Přizpůsobit dokončený krok z inteligentní značky ovládacího prvku.

  • Použijte kombinaci výše uvedených dvou možností.

Jedna důležitá věc, kterou je třeba mít na paměti, je, že ovládací prvek CreateUserWizard spustí proces vytvoření uživatelského účtu při kliknutí na tlačítko "Vytvořit uživatele" z jeho CreateUserWizardStep. Nezáleží na tom, jestli jsou po CreateUserWizardStep něm další WizardStep nebo ne.

Při přidávání vlastního WizardStep do ovládacího prvku CreateUserWizard pro shromažďování dalších uživatelských vstupů lze vlastní WizardStep umístit před nebo za CreateUserWizardStep. Pokud je před CreateUserWizardStep tím, je pro CreatedUser obslužnou rutinu události k dispozici další uživatelský vstup shromážděný z vlastníhoWizardStep. Pokud však vlastní WizardStep přijde po CreateUserWizardStep , pak v okamžiku zobrazení vlastního WizardStep je nový uživatelský účet již vytvořen a CreatedUser událost se již aktivovala.

Obrázek 21 znázorňuje pracovní postup, když přidaná WizardStep hodnota předchází CreateUserWizardStep. Vzhledem k tomu, že další informace o uživateli byly shromážděny v době, kdy CreatedUser se událost aktivuje, stačí aktualizovat obslužnou rutinu CreatedUser události, aby načetla tyto vstupy a použila je pro INSERT hodnoty parametrů příkazu (místo DBNull.Value).

Pracovní postup CreateUserWizard, když další krok průvodce předchází kroku CreateUserWizardStep

Obrázek 21: Pracovní postup CreateUserWizard, když WizardStep před (CreateUserWizardStepkliknutím zobrazíte obrázek v plné velikosti)

Pokud je vlastní WizardStep umístěn zaCreateUserWizardStep, ale proces vytvoření uživatelského účtu nastane předtím, než uživatel bude moct vstoupit do svého domovského města, domovské stránky nebo podpisu. V takovém případě je potřeba tyto další informace vložit do databáze po vytvoření uživatelského účtu, jak je znázorněno na obrázku 22.

Pracovní postup CreateUserWizard, když následuje další průvodceKrok po kroku CreateUserWizardStep

Obrázek 22: Pracovní postup CreateUserWizard, když následuje CreateUserWizardStep další WizardStep (kliknutím zobrazíte obrázek v plné velikosti)

Pracovní postup zobrazený na obrázku 22 čeká na vložení záznamu UserProfiles do tabulky, dokud se krok 2 neskončí. Pokud však návštěvník zavře prohlížeč po kroku 1, dosáhneme stavu, kdy byl vytvořen uživatelský účet, ale nebyl přidán žádný záznam do UserProfiles. Jedním z alternativních řešení je vložit záznam s NULL výchozími hodnotami UserProfilesCreatedUser nebo do obslužné rutiny události (která se aktivuje po kroku 1) a po dokončení kroku 2 tento záznam aktualizovat. Tím se zajistí přidání záznamu UserProfiles pro uživatelský účet i v případě, že uživatel ukončí proces registrace v polovině.

Pro účely tohoto kurzu vytvoříme nový WizardStep , který nastane za objektem CreateUserWizardStep , ale před CompleteWizardStep. Pojďme nejprve nastavit a nakonfigurovat průvodce a pak se podíváme na kód.

Z inteligentní značky ovládacího prvku CreateUserWizard vyberte možnost Přidat nebo odebrat WizardStep , která zobrazí WizardStep dialogové okno Editor kolekcí. Přidejte nový WizardStepobjekt , který nastaví ID na UserSettings, na Title "Vaše nastavení" a na StepTypeStep. Pak ho umístěte tak, aby se zobrazil za CreateUserWizardStep ("Registrace nového účtu") a před CompleteWizardStep ("Dokončeno"), jak je znázorněno na obrázku 23.

Přidání nového průvodceKrok do ovládacího prvku CreateUserWizard

Obrázek 23: Přidání nového WizardStep do ovládacího prvku CreateUserWizard (kliknutím zobrazíte obrázek v plné velikosti)

Kliknutím na OK zavřete dialogové okno Editor kolekcí WizardStep . Nový WizardStep je dokládá aktualizovaným deklarativním kódem ovládacího prvku CreateUserWizard:

<asp:CreateUserWizard ID="NewUserWizard" runat="server"
     ContinueDestinationPageUrl="~/Membership/AdditionalUserInfo.aspx">
     <WizardSteps>
          <asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server">
          </asp:CreateUserWizardStep>
          <asp:WizardStep runat="server" ID="UserSettings" StepType="Step"
               Title="Your Settings">
          </asp:WizardStep>
          <asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server">
          </asp:CompleteWizardStep>
     </WizardSteps>
</asp:CreateUserWizard>

Všimněte si nového <asp:WizardStep> prvku. Potřebujeme přidat uživatelské rozhraní, abychom shromáždili domovské město, domovskou stránku a podpis nového uživatele. Tento obsah můžete zadat v deklarativní syntaxi nebo prostřednictvím Designer. Pokud chcete použít Designer, vyberte krok Vaše nastavení v rozevíracím seznamu v inteligentní značce a zobrazte krok v Designer.

Poznámka

Výběrem kroku v rozevíracím seznamu Inteligentní značka se aktualizuje vlastnost ovládacího prvku ActiveStepIndexCreateUserWizard, která určuje index počátečního kroku. Proto pokud použijete tento rozevírací seznam k úpravě kroku "Vaše nastavení" v Designer, nezapomeňte ho nastavit zpět na "Zaregistrovat se ke svému novému účtu", aby se tento krok zobrazil, když uživatelé stránku poprvé navštívíEnhancedCreateUserWizard.aspx.

V kroku Vaše nastavení vytvořte uživatelské rozhraní, které obsahuje tři ovládací prvky TextBox s názvem HomeTown, HomepageUrla Signature. Po vytvoření tohoto rozhraní by deklarativní kód CreateUserWizard měl vypadat podobně jako následující:

<asp:CreateUserWizard ID="NewUserWizard" runat="server"
     ContinueDestinationPageUrl="~/Membership/AdditionalUserInfo.aspx">
     <WizardSteps>
          <asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server">
          </asp:CreateUserWizardStep>
          <asp:WizardStep runat="server" ID="UserSettings" StepType="Step"
               Title="Your Settings">
               <p>
                    <b>Home Town:</b><br />
                    <asp:TextBox ID="HomeTown" runat="server"></asp:TextBox>
               </p>
               <p>
                    <b>Homepage URL:</b><br />
                    <asp:TextBox ID="HomepageUrl" Columns="40" runat="server"></asp:TextBox>
               </p>
               <p>
                    <b>Signature:</b><br />
                    <asp:TextBox ID="Signature" TextMode="MultiLine" Width="95%"
                         Rows="5" runat="server"></asp:TextBox>
               </p>
          </asp:WizardStep>
          <asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server">
          </asp:CompleteWizardStep>
     </WizardSteps>
</asp:CreateUserWizard>

Přejděte na tuto stránku v prohlížeči a vytvořte nový uživatelský účet s určením hodnot pro domovské město, domovskou stránku a podpis. Po dokončení CreateUserWizardStep se uživatelský účet vytvoří v rozhraní členství a CreatedUser spustí se obslužná rutina události, která přidá nový řádek do UserProfiles, ale s hodnotou databáze NULL pro HomeTown, HomepageUrla Signature. Hodnoty zadané pro domovské město, domovskou stránku a podpis se nikdy nepoužívají. Výsledkem je nový uživatelský účet se záznamem UserProfiles , jehož HomeTownpole , HomepageUrla Signature ještě nebyla zadána.

Po kroku "Vaše nastavení" musíme spustit kód, který převezme hodnoty domovského města, honepage a podpisu zadané uživatelem a aktualizuje příslušný UserProfiles záznam. Pokaždé, když uživatel přejde mezi kroky v ovládacím prvku Průvodce, aktivuje se ActiveStepChanged událost průvodce. Pro tuto událost můžeme vytvořit obslužnou rutinu UserProfiles události a po dokončení kroku Nastavení aktualizovat tabulku.

Přidejte obslužnou rutinu události pro událost CreateUserWizard ActiveStepChanged a přidejte následující kód:

protected void NewUserWizard_ActiveStepChanged(object sender, EventArgs e)
{
     // Have we JUST reached the Complete step?
     if (NewUserWizard.ActiveStep.Title == "Complete")
     {
          WizardStep UserSettings = NewUserWizard.FindControl("UserSettings") as
          WizardStep;
 
          // Programmatically reference the TextBox controls
          TextBox HomeTown = UserSettings.FindControl("HomeTown") as TextBox;
          TextBox HomepageUrl = UserSettings.FindControl("HomepageUrl") as TextBox;
          TextBox Signature = UserSettings.FindControl("Signature") as TextBox;
 
          // Update the UserProfiles record for this user
          // Get the UserId of the just-added user
          MembershipUser newUser = Membership.GetUser(NewUserWizard.UserName);
          Guid newUserId = (Guid)newUser.ProviderUserKey;
 
          // Insert a new record into UserProfiles
          string connectionString = 
               ConfigurationManager.ConnectionStrings["SecurityTutorialsConnectionString"].ConnectionString;
          string updateSql = "UPDATE UserProfiles SET HomeTown = @HomeTown, HomepageUrl
               = @HomepageUrl, Signature = @Signature WHERE UserId = @UserId";
 
          using (SqlConnection myConnection = new SqlConnection(connectionString))
          {
               myConnection.Open();
               SqlCommand myCommand = new SqlCommand(updateSql, myConnection);
               myCommand.Parameters.AddWithValue("@HomeTown", HomeTown.Text.Trim());
               myCommand.Parameters.AddWithValue("@HomepageUrl", HomepageUrl.Text.Trim());
               myCommand.Parameters.AddWithValue("@Signature", Signature.Text.Trim());
               myCommand.Parameters.AddWithValue("@UserId", newUserId);
               myCommand.ExecuteNonQuery();
               myConnection.Close();
          }
     }
}

Výše uvedený kód začíná určením, jestli jsme právě dosáhli kroku Dokončit. Vzhledem k tomu, že krok "Dokončeno" nastane okamžitě po kroku "Vaše nastavení", pak když návštěvník dosáhne kroku "Dokončeno", znamená to, že právě dokončil krok "Vaše nastavení".

V takovém případě musíme programově odkazovat na ovládací prvky TextBox v rámci UserSettings WizardStep. Toho dosáhnete tak, že nejprve použijete metodu FindControl k programovému odkazování na UserSettings WizardStepobjekt a pak znovu použijete odkazování na textová pole v rámci objektu WizardStep. Po odkazování na textová pole jsme připraveni příkaz spustit UPDATE . Příkaz UPDATE má stejný počet parametrů jako INSERT příkaz v CreatedUser obslužné rutině události, ale zde používáme hodnoty domovského města, domovské stránky a podpisu zadané uživatelem.

Když je tato obslužná rutina události na místě, navštivte EnhancedCreateUserWizard.aspx stránku prostřednictvím prohlížeče a vytvořte nový uživatelský účet, který určuje hodnoty pro domovské město, domovskou stránku a podpis. Po vytvoření nového účtu byste měli být přesměrováni na AdditionalUserInfo.aspx stránku, kde se zobrazí informace o právě zadaném domovském městě, domovské stránce a podpisu.

Poznámka

Náš web má v současné době dvě stránky, ze kterých si návštěvník může vytvořit nový účet: CreatingUserAccounts.aspx a EnhancedCreateUserWizard.aspx. Mapa webu a přihlašovací stránka odkazují na CreatingUserAccounts.aspx stránku, ale CreatingUserAccounts.aspx stránka nevytádá uživatele k zadání jeho domovského města, domovské stránky a podpisových informací a nepřidá odpovídající řádek do UserProfiles. Proto buď aktualizujte CreatingUserAccounts.aspx stránku tak, aby tuto funkci nabízí, nebo aktualizujte stránku mapy webu a přihlašovací stránky tak, aby odkazovat EnhancedCreateUserWizard.aspx místo CreatingUserAccounts.aspx. Pokud zvolíte druhou možnost, nezapomeňte aktualizovat Membership soubor složky Web.config tak, aby přístup ke EnhancedCreateUserWizard.aspx stránce povolil anonymním uživatelům.

Souhrn

V tomto kurzu jsme se podívali na techniky modelování dat, které souvisejí s uživatelskými účty v rámci rozhraní členství. Konkrétně jsme se podívali na modelování entit, které sdílejí relaci 1:N s uživatelskými účty, a také na data, která sdílejí relaci 1:1. Kromě toho jsme viděli, jak se tyto související informace dají zobrazit, vkládat a aktualizovat pomocí některých příkladů pomocí ovládacího prvku SqlDataSource a jiných pomocí ADO.NET kódu.

Tento kurz doplňuje náš přehled o uživatelských účtech. Od dalšího kurzu se zaměříme na role. V dalších několika kurzech se podíváme na architekturu Rolí, podíváme se, jak vytvářet nové role, jak přiřazovat role uživatelům, jak určit, ke kterým rolím patří uživatel, a jak použít autorizaci na základě rolí.

Šťastné programování!

Další čtení

Další informace o tématech probíraných v tomto kurzu najdete v následujících zdrojích informací:

O autorovi

Scott Mitchell, autor několika knih o ASP/ASP.NET a zakladatel 4GuysFromRolla.com, pracuje s webovými technologiemi Microsoftu od roku 1998. Scott pracuje jako nezávislý konzultant, školitel a spisovatel. Jeho nejnovější kniha je Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Scotta můžete zastihnout na adrese mitchell@4guysfromrolla.com nebo prostřednictvím svého blogu na adrese http://ScottOnWriting.NET.

Zvláštní poděkování...

Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Chtěli byste si projít své nadcházející články na webu MSDN? Pokud ano, dejte mi řádek na mitchell@4GuysFromRolla.com.