Klik hier om Silverlight te installeren*
NederlandWijzigen|Alle Microsoft sites
MSDN*
Zoek op Microsoft.com naar:
|Contact|Mijn gegevens|Nieuwsbrieven

De clubwebsite starterkit

In dit artikel wordt uitgelegd hoe u de nieuwe clubwebsite starterkit, een beschikbaar en geïnstalleerd projecttype voor Visual Studio 2005 of Visual Web Developer 2005 Express Edition, kunt uitbreiden.
 

Inleiding

Visual Studio 2005 en Visual Web Developer 2005 Express Edition worden geleverd met een project met de naam Personal Web Site Starter Kit. Hoewel dit het enige ASP.Net-startpakket is dat bij de standaardinstallatie van deze IDE's wordt geleverd, kunt u echter met beide IDE's ook andere startpakketten zoeken die u wilt gebruiken en aanpassen. (Kies daartoe in het IDE-menu Community, Community Search en vervolgens Starter Kits.)

Een van de startpakketten die u zult vinden, is de Clubwebsite Starter Kit (zie afbeelding 1 hieronder). Met dit startpakket kunt u snel een website voor een club of organisatie opzetten. Hoewel dit startpakket speciaal is bedoeld voor een voetbalclub, kunt u de toepassing gemakkelijk aanpassen, zodat deze ook kan worden gebruikt voor andere verenigingen. Meer gedetailleerde informatie over de beginselen van dit startpakket kunt u vinden in mijn eerdere artikel Introducing the clubwebsite Starter Kit. Als u een inleiding tot dit startpakket wenst, raad ik u aan eerst dit eerdere artikel te lezen.
 
Afbeelding 1. Introductiepagina clubsite
Afbeelding 1. Introductiepagina clubsite
 
Het startpakket Clubwebsite maakt gebruik van een aantal van de beste functies van de laatste versie van ASP.NET 2.0, zoals hoofdpagina's, beheersystemen voor lidmaatschappen en rollen en navigatiesystemen.

Dit websitestartpakket biedt u een introductiepagina, een pagina voor allerlei activiteiten, een plek voor nieuws, een fotoalbum, een pagina waarop al uw leden worden weergegeven, een pagina met koppelingen en een contactpagina. Hoewel het fotoalbum een centrale plaats in de toepassing inneemt, zijn ook de activiteiten- en nieuwssecties van de site nadrukkelijk in de toepassing aanwezig. Items met informatie over activiteiten en nieuws die in het systeem worden geplaatst, worden niet alleen op de respectievelijke pagina's weergegeven, maar ook op de introductiepagina (Default.aspx).
In dit artikel wordt uitgelegd hoe u de toepassing kunt uitbreiden en aanpassen, aangezien dit het doel is van de startpakketten. Ze heten niet voor niets startpakketten! Beschouw dit startpakket als een beginpunt voor het bouwen van een echt unieke toepassing. Misschien lijkt het uiteindelijke resultaat helemaal niet op iets wat een clubwebsite kan worden genoemd, en maakt u wel iets heel anders.
 

Standaardverbeteringen aanbrengen

Het is bijna vanzelfsprekend, maar uw eerste stappen bestaan uit het aanpassen van de clubwebsite Starter Kit. Deze aanpassingen bestaan uit het volledig personaliseren van de pagina's die u in de toepassing wilt behouden. Zowel de hoofdpagina als de contentpagina's binnen de toepassing moeten worden gepersonaliseerd.

Afgezien daarvan is het belangrijk te weten dat deze toepassing geen gebruikmaakt van de caching-mogelijkheden van .NET. Dit houdt in dat de pagina's niet voor hergebruik in de systeemcache worden opgeslagen, waardoor u zou besparen op de kosten van het opnieuw weergeven van de pagina.

Hoogstwaarschijnlijk gaat u gegevens aanbieden op de website van uw groep, die niet al te vaak hoeft te worden gewijzigd. Uw toepassing presteert daarom beter als u aangeeft dat uw ASP.NET-pagina's voor een bepaalde tijd in de cache moeten worden opgeslagen.

Aangezien deze toepassing echter ondersteuning biedt voor de nieuwe mogelijkheid van het werken met hoofdpagina's en contentpagina's, worden er twee pagina's samengevoegd tot één ASP.NET-pagina op het moment dat de pagina's worden aangeroepen. Waar zou u in dit geval de caching precies laten plaatsvinden?

Pas bij gebruik van hoofdpagina's caching toe op de contentpagina, niet op de hoofdpagina. Als u gebruikmaakt van de pagina-instructie OutputCache, moet u deze in de contentpagina plaatsen om caching te laten plaatsvinden. Dit kunt u hier zien:
 
<%@ OutputCache Duration="60" VaryByParam="None" %>

Als u deze pagina-instructie in een contentpagina van uw toepassing plaatst, wordt zowel de inhoud van de contentpagina als de bijbehorende hoofdpagina door het systeem gedurende 60 seconden in de cache opgeslagen (in dit geval is dat één pagina).
 

Een bestandssysteem toevoegen

Als voorbeeld van een uitbreiding van een startpakket, gaan we met de clubwebsite starterkit iets doen waar de leden van uw club of organisatie wat aan hebben. Uit de duizenden uitbreidingen die u zou kunnen bedenken en uitvoeren, kiezen wij er één en kijken we hoe u een eenvoudig bestandsbeheersysteem aan de toepassing zou kunnen toevoegen.

Dit bestandsbeheersysteem geeft gebruikers met de rol Administrator de mogelijkheid bestanden toe te voegen, te bewerken of te verwijderen. Beheerders kunnen ook bestanden in categorieën plaatsen die onder hun beheer staan.

Dit voorbeeld vereist het gebruik van een database. Hiervoor gebruiken wij de nieuwe Microsoft SQL Server Express Edition-bestanden, maar u kunt ook een andere database gebruiken als u dat wilt.

De eerste stap in het bouwen van dit elementaire bestandsbeheersysteem bestaat uit het wijzigen van het navigatiesysteem van de toepassing. Er moet namelijk voor de leden met de rol Administrator een pagina in het systeem worden opgenomen die hen in staat stelt te werken met bestanden en bestandscategorieën.
 

De bestandsbeheerpagina configureren

De eerste stap is het configureren van de toepassing door er een bestandsbeheerpagina in op te nemen. Deze pagina is alleen toegankelijk voor geregistreerde gebruikers met de rol Administrator. Via deze pagina kunnen zij bestanden uploaden en beheren, en de categorieën beheren waarin deze bestanden worden geplaatst.

Daartoe moet er een koppeling Admin in het navigatiesysteem worden opgenomen. Omdat we willen dat alleen gebruikers met de rol Administrator deze koppeling zien, maken we gebruik van de functie security trimming van ASP.NET 2.0.

Security trimming is de mogelijkheid om op basis van de rol van de gebruiker elementen uit het navigatiesysteem weg te laten. Dit kunnen we doen door een paar instellingen te wijzigen in het het bestand Web.config en een paar andere in het bestand Web.sitemap.

Hoewel security trimming al is ingeschakeld voor de clubwebsite starter kit, is het toch goed om het bestand Web.config eens te bekijken. U begrijpt dan beter hoe deze functionaliteit is geïmplementeerd. Het gedeelte van het bestand Web.config waarin dit wordt afgehandeld, bevindt zich in de sectie <siteMap> van het bestand en wordt hier weergegeven in listing 1.
 
<siteMap defaultProvider="AspNetXmlSiteMapProvider" enabled="true">
   <providers>
      <remove name="AspNetXmlSiteMapProvider" />
      <add name="AspNetXmlSiteMapProvider"
        description="SiteMap provider that reads in
                     .sitemap XML files."
        type="System.Web.XmlSiteMapProvider"
        securityTrimmingEnabled="true"
        siteMapFile="Web.sitemap" />
   </providers>
</siteMap>
Listing 1: Het deel van het bestand Web.sitemap waarmee security trimming wordt geregeld
 
Eenmaal ingeschakeld, worden pagina's die vergrendeld zijn niet weergegeven in het navigatiesysteem van de toepassing. De clubwebsite starterkit doet dit door bepaalde pagina's alleen toegankelijk te maken voor geregistreerde gebruikers door middel van de sectie <location> in het bestand Web.config, zoals u kunt zien in listing 2.
 
<location path="member_list.aspx" >
   <system.web>
      <authorization >
         <deny users="?" />
      </authorization>
   </system.web>
</location>
<location path="member_details.aspx" >
   <system.web>
      <authorization >
         <deny users="?"/>
      </authorization>
   </system.web>
</location>
Listing 2: Bepaalde pagina's alleen toegankelijk maken voor beheerders
 
Dit wordt ingesteld in het bestand Web.config, maar u kunt bepalen of gebruikers pagina's (en de koppelingen naar die pagina's op de navigatiebalk) wel of niet kunnen zien. Dit kunt u doen door de instellingen in het bestand Web.sitemap dienovereenkomstig te wijzigen en door gebruik te maken van het het attribuut roles in het element <siteMapNode>.
 
<siteMapNode url="admin.aspx" title="Admin"
 description="Administer File System" roles="Administrators" />

In ons voorbeeld gaan we de pagina Admin.aspx maken, die alleen beschikbaar zal zijn voor geregistreerde gebruikers die de rol Administrator hebben. Daartoe bewerken we het bestand Web.sitemap, zoals wordt weergegeven in listing 3. 
 
<location path="Admin.aspx" >
   <system.web>
     <authorization >
       <allow roles="Administrators"/>
       <deny users="*"/>
     </authorization>
   </system.web>
</location>
Listing 3: Het bestand Web.sitemap wijzigen om de pagina Admin.aspx te vergrendelen
 
De eerste wijziging die we aanbrengen in het bestand Web.config van de toepassing is het toevoegen van een extra sectie <location>, die verwijst naar de pagina Admin.aspx die we nu gaan maken. Zoals u in listing 3 kunt zien, is deze pagina alleen toegankelijk voor gebruikers met de rol Administrator.

Nu de toegangsregels zijn ingesteld voor de pagina die we gaan maken, kunnen we de database gaan maken waar de pagina Admin.aspx gebruik van gaat maken.
 

De beheersectie van het bestandsbeheersysteem maken

Het doel van de pagina Admin.aspx is om gebruikers met de rol Administrator de mogelijkheid te geven bestanden te uploaden naar het bestandsbeheersysteem. Om het bestandssysteem echter voor leden gebruiksvriendelijker te maken, bieden we geen lange lijst met documenten aan, maar maken we gebruik van een categorieënsysteem.
 
We gaan dus een categorieënsysteem maken en geven aan gebruikers met de rol Administrator toestemming om categorieën, waarin documenten geplaatst worden, te maken, bewerken en verwijderen. Beheerders die documenten naar de toepassing uploaden, kunnen deze dan tevens toewijzen aan een categorie.
 
Aan dit bestandsbeheersysteem voegen we voor beheerders tevens de mogelijkheid toe om te beslissen of een categorie wel of niet in het uiteindelijke beheerssysteem wordt weergegeven. We gaan er ook voor zorgen dat metagegevens van bestanden kunnen worden opgeslagen, zoals commentaar dat betrekking heeft op de bestanden en de tijd waarop een bestand naar het systeem is overgebracht.
 
De vereiste databasebestanden maken
De pagina Admin.aspx werkt nauw samen met een onderliggende database. Daarom moeten we een aantal nieuwe tabellen maken in het bestand clubsite.mdf. Dit is een SQL Server 2005 Express Edition-bestand en wordt al gebruikt voor een aantal andere zaken in de standaard clubwebsite starterkit.

We maken de nieuwe tabellen door in Visual Web Developer op het tabblad Database Explorer te klikken. In dit venster van de IDE bevindt zich een hoofdknooppunt met de naam Data Connection. Dubbelklik hierop en u ziet nu een verwijzing naar het databasebestand clubsite.mdf. Als u dit databasebestand uitvouwt, ziet u onder andere een lijst met tabellen, views en stored procedures. Afbeelding 2 hieronder is daar een voorbeeld van.
 
Afbeelding 2. Clubsite-database
Afbeelding 2. Clubsite-database
 
Klik met de rechtermuisknop op de map Tables en selecteer Add New Table. Hierdoor wordt de Table Designer rechtstreeks in Visual Web Developer gestart. Maak vanuit dit nieuwe venster in Visual Web Developer een tabel met de gegevens uit afbeelding 3.
 
Afbeelding 3. De tabel DocumentCategories maken
Afbeelding 3. De tabel DocumentCategories maken
 
De tabel bevat de kolommen CategoryID (int), CategoryName (nvarchar(50)) en IsPublic (bit). U ziet in afbeelding 3 dat de CategoryID een gele sleutel heeft aan het begin van de rij. Dit betekent dat CategoryID een primaire sleutel is, die wordt gebruikt voor identificatiedoeleinden. U kunt van CategoryID een primaire sleutel maken door met de rechtermuisknop op de rij te klikken (eigenlijk op het grijze vakje aan het begin van de rij) en Set Primary Key te kiezen in het menu dat wordt weergegeven. Er moeten ook een aantal wijzigingen worden aangebracht in de eigenschappen van de rij CategoryID. Markeer de rij (door weer op het grijze vakje aan begin van de rij te klikken). De eigenschappen van deze rij worden dan in het venster Column Properties weergegeven. Wijzig de eigenschappen zodanig dat de CategoryID een identiteitswaarde is die voor elke rij met 1 wordt opgehoogd. Deze eigenschapinstellingen worden weergegeven in afbeelding 4.
 
Afbeelding 4. Een primaire sleutel toevoegen
Afbeelding 4. Een primaire sleutel toevoegen
 
Sla de tabel op. Er wordt nu een dialoogvenster weergegeven waarin u wordt gevraagd een naam voor de tabel op te geven. Geef de tabel in dit geval de naam DocumentCategories (zie afbeelding 5).
 
Afbeelding 5. De tabel een naam geven
Afbeelding 5. De tabel een naam geven
 
We gaan nu een tabel maken waarin de metagegevens worden opgeslagen van de bestanden die op schijf worden opgeslagen. Maak een tabel op dezelfde manier als hierboven beschreven, met dien verstande dat de kolommen overeen moeten komen met die in afbeelding 6.
 
Afbeelding 6. Eigenschappen voor de tabel DocumentCategories
Afbeelding 6. Eigenschappen voor de tabel DocumentCategories
 
Deze tabel heeft kolommen voor de ID en de naam van het bestand, de datum waarop het bestand naar het systeem is overgebracht, een kolom voor informatie over het document (metagegevens), een kolom voor de categorie waaraan het document is toegewezen en een kolom waarin wordt aangegeven of het document een "top document" is, een term waarop ik aan het einde van dit artikel nog terugkom.

Sla de tabel op onder de naam Documents. Hierna moet uw Database Explorer er als volgt uitzien:
 
Afbeelding 7. Na toevoeging van de tabel
Afbeelding 7. Na toevoeging van de tabel
 
Nu de database voor het bestandssysteem gereed is, kunnen we de pagina Admin.aspx maken. Deze pagina werkt samen met de onderliggende database die we zojuist hebben gemaakt, en geeft ons de mogelijkheid zowel categorieën als bestanden toe te voegen, te bewerken of te verwijderen.
 

De pagina Admin.aspx maken

Maak met behulp van de pagina Default.master een nieuwe contentpagina en geef deze de naam Admin.aspx. Deze pagina bevat twee aparte secties, één voor het beheer van categorieën en één voor het beheer van bestanden. Elke sectie wordt op de pagina gedefinieerd door middel van <div>-secties. Dit wordt weergegeven in listing 4.
 
<%@ Page Language="VB" MasterPageFile="~/Default.master"
    Title="File Management System" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1"
 Runat="Server">
    <div id="body">
        <div class="fullwidth">
            <h2>Administer Categories</h2>         
        </div>
 
        <div class="fullwidth">
            <h2>Administer Files</h2>
        </div>         
    </div>
</asp:Content>
Listing 4: Het raamwerk voor de pagina Admin.aspx
In dit codefragment kunt u zien dat het raamwerk voor de pagina Admin.aspx ruimte biedt aan twee secties. Elke sectie is visueel gevat in een grijs vak, vanwege de declaratie class="fullwidth" in de <div>-codes.

Nu gaan we kijken naar de eerste sectie van de pagina, die voor het beheer van categorieën.
Het categoriebeheersysteem opzetten

De categoriebeheersectie van de pagina Admin.aspx is eenvoudig te maken. Deze sectie bevat een GridView-control waarmee beheerders de categorieën kunnen beheren die zich al in het systeem bevinden. Meteen daaronder bevindt zich een klein formulier waarmee nieuwe categorieën kunnen worden gemaakt. Uiteindelijk moet de ontwerpweergave van deze sectie er uitzien als in afbeelding 8.
 
Afbeelding 8. Categoriebeheersysteem
Afbeelding 8. Categoriebeheersysteem
 
De communicatie met de SQL Express-database die wij eerder maakten, vindt plaats door middel van het control SqlDataSource op de pagina. Nadat u het control SqlDataSource op de pagina hebt geplaatst, markeert u het element en opent u de infolabel van het control (door de groene pijl te selecteren in de rechterbovenhoek van het control). Selecteer in de infolabel de koppeling Configure Data Source. Er wordt een dialoogvenster weergegeven waarin u het control SqlDataSource kunt configureren. Met de eerste optie kunt u de gegevensverbinding selecteren die u voor de verbinding met het bestand clubsite.mdf wilt gebruiken. Omdat deze verbinding al bij de standaardinstallatie van de clubwebsite starterkit is gedefinieerd, selecteert u ClubSiteDB in de vervolgkeuzelijst. Dit wordt weergegeven in afbeelding 9.
 
Afbeelding 9. Verbinding maken met de database
Afbeelding 9. Verbinding maken met de database
 
Op de volgende pagina van het dialoogvenster kunnen we de tabel (DocumentCategories) en de kolommen selecteren die we willen gebruiken. Omdat we alle kolommen willen gebruiken, schakelt u het selectievakje voor alles (het teken "*") in. Voordat we doorgaan naar de volgende pagina van het dialoogvenster, klikt u op de knop Advanced, en schakelt u het selectievakje in dat ervoor zorgt dat Visual Web Designer behalve de standaardinstructie SELECT ook de instructies INSERT, UPDATE en DELETE genereert. Deze instellingen worden weergegeven in afbeelding 10.
Afbeelding 10. Stored procedures genereren
Afbeelding 10. Stored procedures genereren
 
De volgende stap bestaat uit het configureren van de GridView, zodat deze samenwerkt met het control SqlDataSource dat we zojuist hebben gemaakt. Open hiervoor de ontwerpweergave van de pagina en vervolgens de infolabel voor het control GridView. In de infolabel kunt u in de lijst met beschikbare bronnen het control SqlDataSource1 selecteren. Hierdoor worden automatisch de kolommen van de tabel DocumentCategories in het control GridView weergegeven.

Schakel vervolgens in de infolabel van het control GridView de selectievakjes Enable Paging, Enable Sorting, Enable Editing en Enable Deleting in. Voltooi vervolgens de configuratie van het control GridView door via de koppeling Auto Format een betere stijl te kiezen of wijzig gewoon de breedte van het control (die van mij heb ik ingesteld op 75%). Het resultaat van al deze stappen is een `GridView-control zoals in afbeelding 8.

De code voor deze categoriesectie wordt hier weergegeven in listing 5.
 
<div class="fullwidth">
   <h2>File Category System</h2>
   <p>
   <asp:GridView ID="GridView1" runat="server" AllowPaging="True"
    AllowSorting="True" AutoGenerateColumns="False"
    DataKeyNames="CategoryID" DataSourceID="SqlDataSource1"
    EmptyDataText="There are no categories present." Width="75%">
      <Columns>
         <asp:CommandField ShowDeleteButton="True"
          ShowEditButton="True" />
         <asp:BoundField DataField="CategoryID" HeaderText="CategoryID"
          InsertVisible="False" ReadOnly="True"
          SortExpression="CategoryID" />
         <asp:BoundField DataField="CategoryName"
          HeaderText="CategoryName" SortExpression="CategoryName" />
          <asp:CheckBoxField DataField="IsPublic" HeaderText="IsPublic"
           SortExpression="IsPublic" />
      </Columns>
   </asp:GridView>
   <p>
   <strong><span style="text-decoration: underline">Add a New
   Category</span></strong></p>
   <p>Category Name:<br />
   <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox></p>
   <p>
   <asp:CheckBox ID="CheckBox1" runat="server"
    Text="Check if category is public" /></p>
    <p>
    <asp:Button ID="Button1" runat="server" Text="Add Category"
     OnClick="Button1_Click" />
    <asp:SqlDataSource ID="SqlDataSource1" runat="server"
     ConnectionString="<%$ ConnectionStrings:ClubSiteDB %>"
     DeleteCommand="DELETE FROM [DocumentCategories] WHERE [CategoryID] =
        @original_CategoryID"
     InsertCommand="INSERT INTO [DocumentCategories] ([CategoryName],
        [IsPublic]) VALUES (@CategoryName, @IsPublic)"
     SelectCommand="SELECT * FROM [DocumentCategories]"
     UpdateCommand="UPDATE [DocumentCategories] SET [CategoryName] =
        @CategoryName, [IsPublic] = @IsPublic WHERE [CategoryID] =
        @original_CategoryID">
      <DeleteParameters>
         <asp:Parameter Name="original_CategoryID"
          Type="Int32" />
      </DeleteParameters>
      <UpdateParameters>
         <asp:Parameter Name="CategoryName" Type="String" />
         <asp:Parameter Name="IsPublic" Type="Boolean" />
         <asp:Parameter Name="original_CategoryID" Type="Int32" />
      </UpdateParameters>
      <InsertParameters>
         <asp:Parameter Name="CategoryName" Type="String" />
         <asp:Parameter Name="IsPublic" Type="Boolean" />
      </InsertParameters>
   </asp:SqlDataSource>
   </p>           
</div>
Listing 5: De visuele constructie van de categoriesectie
 
Voordat we door kunnen gaan, moeten we nog één wijziging aanbrengen in dit codefragment. In zijn huidige staat werkt de methode Insert niet voor ons. Daarom moeten we de door Visual Web Developer gegenereerde code hier en daar wijzigen.

Als u kijkt naar de waarde van het kenmerk InsertCommand in het hoofdknooppunt van het control SqlDataSource, ziet u dat onze Insert-opdracht naar twee parameters zoekt: één voor de naam van de categorie (@CategoryName) en een Boolean-waarde die aangeeft of de categorie wel of niet openbaar is (@IsPublic).

Aangezien deze waarden afkomstig zijn uit de ASP.NET-server control op dezelfde pagina bevinden, moeten we de sectie <InsertParameters> van het control SqlDataSource aanpassen aan de bron van de waarden. Dus in plaats van:
<InsertParameters>
   <asp:Parameter Name="CategoryName" Type="String" />
   <asp:Parameter Name="IsPublic" Type="Boolean" />
</InsertParameters>

wijzigen wij onze sectie <InsertParameters> in het volgende: 
 
<InsertParameters>
   <asp:ControlParameter Name="CategoryName" Type="String"
    ControlID="TextBox1" />
   <asp:ControlParameter Name="IsPublic" Type="Boolean"
    ControlID="CheckBox1" />
</InsertParameters>

In de parametersectie van de DataSource-controlen kunt u aangeven hoe de waarden van deze parameters met behulp van declaraties moeten worden verkregen. Beschikbare opties zijn:
  • <asp:Parameter>
  • <asp:ControlParameter>
  • <asp:CookieParameter>
  • <asp:FormParameter>
  • <asp:ProfileParameter>
  • <asp:QueryStringParameter>
  • <asp:SessionParameter>

In ons geval gebruiken we het control <asp:ControlParameter>, omdat we hiermee de vereiste waarden op declarieve manier rechtstreeks uit een aantal ASP.NET-server controls kunnen halen die zich op ons eenvoudige formulier bevinden. De twee <asp:ControlParameter>-controls die we in de sectie <InsertParameters> gebruiken, wijzen naar het control TextBox1 voor de waarde van de categorienaam en naar het control CheckBox1 voor de vereiste Boolean-waarde die bepaalt of de categorie voor iedereen zichtbaar is.

Nu we de visuele aspecten van deze sectie hebben ingesteld en het control SqlDataSource gereed is, bestaat de volgende stap uit het maken van een aantal acties die worden gestart als de eindgebruiker op de knop Add Category klikt. Dit doen we door middel van de gebeurtenis Button1_Click.
 
Afbeelding 11. Clubsite met categorieën
 
De gebeurtenis Button1_Click voegt een nieuwe categorie toe aan het algemene categoriesysteem. Deze methode wordt toegelicht in listing 6.
 
Protected Sub Button1_Click(ByVal sender As Object, _
   ByVal e As System.EventArgs)
        SqlDataSource1.Insert()
        TextBox1.Text = ""
        CheckBox1.Checked = False
End Sub
Listing 6: Een categorie toevoegen door middel van de gebeurtenis Button_1
[Visual Basic]
 
protected void Button1_Click(object sender, EventArgs e)
{
   SqlDataSource1.Insert();
   TextBox1.Text = "";
   CheckBox1.Checked = false;
}
Listing 6: Een categorie toevoegen door middel van de gebeurtenis Button_1
[C#]
 
De gebeurtenis Button1_Click voert een aantal basisbewerkingen uit. Op de eerste plaats start deze de methode Insert() van het control SqlDataSource. Deze methode zorgt ervoor dat het control SqlDataSource de waarden ophaalt uit de twee server- controls (TextBox1 en CheckBox1) en dat deze waarden worden ingevoegd in het databasebestand. Nadat de methode Insert() is uitgevoerd, maken we het formulier leeg door lege waarden toe te wijzen aan zowel het control TextBox1 als het control CheckBox1. Dit doen we om te voorkomen dat de beheerder twee keer op de knop Add Category klikt, waardoor de categoriegegevens twee keer aan het systeem zouden worden toegevoegd.

De pagina Admin.aspx is nu in staat categorieën toe te voegen, te bewerken en te verwijderen waarin bestanden kunnen worden geplaatst. Laten we onze aandacht nu richten op het bestandsbeheergedeelte van de pagina Admin.aspx.
 
Het bestandsbeheersysteem opzetten

Het categoriebeheersysteem is nu gereed. De volgende stap is het opzetten van het bestandsbeheersysteem. Net zoals het categoriebeheersysteem, bevat het bestandsbeheersysteem een control GridView waarin de bestanden worden weergeven die zich in het systeem bevinden, plus een formulier waarmee nieuwe bestanden aan het systeem kunnen worden toegevoegd.
Afbeelding 12 laat zien hoe de volledige sectie eruit ziet in de Visual Web Developer designer.
 
Afbeelding 12. Bestandsbeheersysteem
Afbeelding 12. Bestandsbeheersysteem
 
De implementatie van de server-controls die zich op deze pagina bevinden, is niet moeilijk. Het formulier waarmee u een nieuw bestand aan het bestandsbeheersysteem kunt toevoegen, bevat een vervolgkeuzelijst, een tekstvak, een aantal radiobuttond, een control voor het uploaden van bestanden, een knop en een eenvoudige label.

Het control DropDownList waarin boven aan de pagina de beschikbare categorieën worden weergegeven waaraan u een bestand kunt toewijzen, wordt in feite aangestuurd vanuit het control SqlDataSource1 dat boven aan de pagina voor het categoriebeheersysteem is gebruikt.

Markeer het control DropDownList en open de infolabel van het element. In deze infolabel bevindt zich de optie waarmee u een gegevensbron voor het control kunt kiezen. Als u deze optie selecteert, wordt het dialoogvenster uit afbeelding 13 weergegeven.
Afbeelding 13. De gegevensbron instellen voor een DropDownList
Afbeelding 13. De gegevensbron instellen voor een DropDownList
 
In dit dialoogvenster kunt u de gegevensbron selecteren waarmee het control moet worden verbonden, evenals het gegevensveld dat de bron is voor de tekst die wordt gepresenteerd aan de eindgebruiker en de waarde die voor het geselecteerde item wordt gebruikt. Klik hierna op de knop OK om door te gaan.

De volgende stap is de configuratie van het control DataSource, dat het control GridView vult met de bestanden die zich in het systeem bevinden. Sleep daartoe een nieuw SqlDataSource-control naar het ontwerpvenster van de pagina en volg dezelfde configuratiestappen als in het voorbeeld van het control SqlDataSource van het categoriebeheersysteem hierboven.

Selecteer in het configuratieproces van het control SqlDataSource2 de tabel Documents en zorg ervoor dat alle items die in de tabel Documents beschikbaar zijn, worden geselecteerd. Net als bij de configuratie van het control SqlDataSource dat voor het categoriebeheerstysteem is gebruikt, moet u op de knop Advanced klikken, zodat u voor de wizard de optie kunt selecteren die behalve de instructie SELECT, ook de instructies INSERTUPDATE en DELETE maakt. Dit wordt geïllustreerd in afbeelding 14.
Afbeelding 14. De tabel Documents configureren
Afbeelding 14. De tabel Documents configureren
 
Hoewel deze wizard het control SqlDataSource voor u instelt, moet er nog een aantal wijzigingen worden aangebracht in de code die vanuit de wizard is gegenereerd. Als we naar de verschillende parameterdefinities van het control SqlDataSource kijken, zien we dat de sectie <InsertParameters> er als volgt uitziet:
 
 
<InsertParameters>
   <asp:Parameter Name="DocumentName" Type="String" />
   <asp:Parameter Name="DateInput" Type="DateTime" />
   <asp:Parameter Name="Comments" Type="String" />
   <asp:Parameter Name="DocumentCategory" Type="Int32" />
   <asp:Parameter Name="TopDoc" Type="Boolean" />
</InsertParameters>

Hoewel dit alle parameters zijn die we nodig hebben om een item aan de tabel Documents toe te voegen, moeten we deze structuur toch wijzigen, omdat sommige van deze parameters worden aangestuurd door server-controls die zich op de pagina bevinden, terwijl we andere parameters dynamisch maken en toevoegen. Daarom wijzigen we de sectie <InsertParameters> in het volgende:
 
<InsertParameters>
   <asp:ControlParameter Name="Comments" Type="String"
    ControlID="TextBox2" />
   <asp:ControlParameter Name="DocumentCategory" Type="Int32"
    ControlID="DropDownList1" PropertyName="SelectedValue" />
   <asp:ControlParameter Name="TopDoc" Type="Boolean"
    ControlID="RadioButtonList1" PropertyName="SelectedValue" />
</InsertParameters>

In deze gewijzigde code kunt u zien dat we een aantal van de parameters uit de lijst hebben gehaald (zoals de parameters DocumentName en DateInput). Dit zijn de parameters die we dynamisch gaan genereren in de gebeurtenis Button2_Click, waar we spoedig op terugkomen.

De andere parameters werden gewijzigd in het type ControlParameter, omdat deze parameters door bepaalde server-controls op het formulier van waarden worden voorzien. Met de eigenschap ControlID kunnen we verwijzen naar een bepaald control, waaruit de vereiste waarde kan worden opgehaald. Voor het verkrijgen van deze waarde, is het voor sommige van deze eigenschappen vereist dat de naam van de eigenschap wordt opgegeven. Zo is bijvoorbeeld de waarde uit het control DropDownList die wij willen gebruiken de eigenschap SelectedValue. Deze eigenschap wordt ingesteld via het kenmerk PropertyName. Dit zijn alle wijzigingen die moeten worden aangebracht in het control SqlDataSource2.

Nu we het control SqlDataSource hebben ingesteld voor het tweede GridView-control, bestaat de volgende stap uit het verbinden van het control GridView2 met het control SqlDataSource2. Hiervoor openen we de infolabel van het control GridView2 en selecteren we het control SqlDataSource2 in de vervolgkeuzelijst die daarin wordt weergegeven. Door de betreffende selectievakjes in te schakelen kunt u pagineren, sorteren, bewerken en verwijderen inschakelen. Dit wordt geïllustreerd in afbeelding 15.
 
Afbeelding 15. Pagineren, sorteren, bewerken en verwijderen inschakelen
Afbeelding 15. Pagineren, sorteren, bewerken en verwijderen inschakelen
 
Omdat we in de hyperlinkconstructie waarmee eindgebruikers naar bestanden kunnen zoeken, gebruik willen gaan maken van de eigenschap DocumentName, moeten we ervoor zorgen dat de waarde DocumentName niet kan worden gewijzigd. Daarom schakelen we de bewerkingsmogelijkheid voor deze kolom in het control GridView2 uit. Klik daartoe in de infolabel van het control GridView op de koppeling Edit Columns. Hierdoor wordt het dialoogvenster Fields geopend (zie afbeelding 16).
 
Afbeelding 16. Kolommen bewerken voor de GridView
Afbeelding 16. Kolommen bewerken voor de GridView
 
Markeer in de sectie Selected fields van het dialoogvenster Fields het veld DocumentName. Aan de rechterkant van het dialoogvenster worden nu de eigenschappen van het veld DocumentName weergegeven. Om te voorkomen dat dit veld kan worden bewerkt, wijzigt u de instelling van de eigenschap ReadOnly van False (de standaardinstelling) in True.

Hiermee is het bestandsbeheersysteem van de pagina ingesteld. U kunt de toepassing nu uitvoeren, u aanmelden als beheerder en onder meer categorieën maken en bestanden uploaden. We richten onze aandacht nu op de pagina waarop de categorie- en bestandsgegevens aan de eindgebruiker worden gepresenteerd.

De Docs.aspx-pagina maken

We moeten nu een pagina maken waarmee de eindgebruiker door de categorieën kan navigeren en bestanden kan selecteren die zich in deze categorieën bevinden. Om te beginnen wijzigen we de naam van de pagina Links.aspx in Docs.aspx. Klik daartoe in de Visual Web Developer Solution Explorer met de rechtermuisknop op de pagina Links.aspx en geef deze de naam Docs.aspx. Geef vervolgens in het bestand Web.sitemap op dat niet Links.aspx maar Docs.aspx moet worden gebruikt.
 
<siteMapNode url="Docs.aspx" title="Docs" 
 description="Useful Documents" />

De Docs.aspx-pagina wordt een tamelijk eenvoudige pagina, omdat het een pagina is die gebruikmaakt van gegevensbinding in één richting. Er komt geen functionaliteit op de pagina die de eindgebruiker in staat stelt bestanden in het systeem te bewerken, te verwijderen of aan het systeem toe te voegen. Ze zullen alleen bestanden in het systeem kunnen openen.

Uiteindelijk zal onze pagina er in het ontwerpvenster van Visual Web Developer uitzien als het voorbeeld in afbeelding 17.
Afbeelding 17. Pagina "Useful Documents"
Afbeelding 17. Pagina "Useful Documents"
 
Zoals u in de ontwerpweergave van deze pagina kunt zien, is de deze verdeeld in twee secties. De eerste is de categoriesectie. Deze sectie stuurt de documentsectie aan die zich direct onder de categoriesectie bevindt.

Eindgebruikers categorieën laten selecteren

De categoriesectie bestaat uit een control DataList en een control SqlDataSource. Sleep eerst een DataList-control naar het ontwerpvenster van de pagina. Open de infolabel van het control DataList en selecteer <New data source...> in de vervolgkeuzelijst met beschikbare gegevensbronnen. Het dialoogvenster Choose Data Source wordt geopend. Selecteer in dit dialoogvenster Database en klik op Next. Selecteer net als bij de pagina Admin.aspx de verbinding ClubSiteDB. Selecteer op de volgende pagina van het dialoogvenster de tabel DocumentCategories en selecteer * om de beschikking te krijgen over alle velden van de tabel. Klik hier in het dialoogvenster op de knop WHERE.... Het dialoogvenster Add WHERE Clause wordt weergegeven (zie afbeelding 18).
 
Afbeelding 18. WHERE-component toevoegen aan query
Afbeelding 18. WHERE-component toevoegen aan query
 
Omdat we alleen categorieën willen weergeven waarvoor de IsPublic-waarde is ingesteld op True, moeten we dit in de SQL-instructie opgeven met een WHERE-component. Selecteer daartoe IsPublic in de vervolgkeuzelijst Column, met het "="-teken als operator. Selecteer None in de vervolgkeuzelijst als bron en plaats de waarde True in het tekstvak Value van de eigenschappen van Parameter. Klik hierna op de knop Add en vervolgens op OK om het dialoogvenster te sluiten en het proces te voltooien.

Omdat we de categorieën in alfabetische volgorde willen presenteren, klikt u nu in het dialoogvenster Configure Data Source op de knop ORDER BY.... Hierdoor wordt het dialoogvenster Add ORDER BY Clause geopend (zie afbeelding 19).
 
Afbeelding 19. Order By-component toevoegen
Afbeelding 19. Order By-component toevoegen
 
Selecteer in dit dialoogvenster in de vervolgkeuzelijst Sort by het veld CategoryName en laat het radiobutton Ascending ingeschakeld (dit betekent dat er oplopend wordt gesorteerd, van A tot Z).
Nadat u dit hebt gedaan, ziet het control DataList er als volgt uit.
 
Afbeelding 20. DataList na configuratie
Afbeelding 20. DataList na configuratie
 
We moeten van de items in deze standaardlijst in het control DataList hyperlinks maken, zodat ze door de eindgebruikers kunnen worden geselecteerd. Wanneer de eindgebruiker op een categoriekoppeling klikt, moeten de bestanden in die categorie worden weergegeven in het control GridView op de pagina. Voor het instellen van het control DataList opent u de infolabel van het element en klikt u op de koppeling Edit Templates. Hierdoor wordt de sectie ItemTemplate van het control geopend (zie afbeelding 21).
 
Afbeelding 21. ItemTemplate bewerken
Afbeelding 21. ItemTemplate bewerken
 
Omdat we niet, zoals hier in deze sjabloon, elk item willen weergeven, verwijderen we alles en voegen we in plaats daarvan een Hyperlink-control toe. Nadat het Hyperlink-control aan de sectie ItemTemplate is toegevoegd, opent u de infolabel van het control en selecteert u de enige koppeling: Edit DataBindings. Het dialoogvenster DataBindings van HyperLink1 wordt geopend.
Verbind in het dialoogvenster DataBindings van HyperLink1 de eigenschap Text met het veld CategoryName. Stel vervolgens voordat u op OK klikt de eigenschap NavigateUrl in, zodat deze verbonden wordt met de volgende expressie.
<%# Eval("CategoryID", @"Docs.aspx?categoryid={0}") %>

Deze Eval-instructie, die door de eigenschap NavigateUrl van het HyperLink-control wordt gebruikt, verandert de categorie in de lijst in een koppeling die een queryreeks bevat. Een voorbeeld daarvan is Docs.aspx?categoryid=4. Nu het HyperLink-control gereed is, is de volgende stap het weergeven van de betreffende bestanden wanneer een eindgebruiker op een van de categoriekoppelingen klikt.
 
De bestanden weergeven

De bestandsweergavesectie van de pagina bestaat uit slechts twee delen: een GridView-control en een SqlDataSource-control. Bij de configuratie van het control SqlDataSource2 wilt u werken met de categoryid-queryreeks, die samen met de URL binnenkomt wanneer de eindgebruiker op een van de dynamisch gegenereerde categoriekoppelingen klikt.

Selecteer daartoe in de configuratiewizard van het control SqlDataSource alle kolommen. Klik vervolgens op de knop WHERE om op te geven wat u nodig hebt voor de categoryid-queryreekswaarde. Selecteer daartoe in het dialoogvenster Add WHERE Clause in de vervolgkeuzelijst Columns de optie DocumentCategory en geef op dat deze gelijk moet zijn aan het queryreeksveld van categoryid. Deze instelling wordt weergegeven in afbeelding 22.
Afbeelding 22. De category SqlDataSource configureren
Afbeelding 22. De category SqlDataSource configureren
 
adat u deze items hebt geconfigureerd, voltooit u de configuratie van het SqlDataSource-control door op de knop ORDER te klikken en op te geven dat de lijst in aflopende volgorde moet worden gesorteerd op de kolom DateInput. Uiteindelijk moet de waarde van SelectCommand in het control SqlDataSource2 er zo uitzien:
 
SelectCommand="SELECT * FROM [Documents] WHERE ([DocumentCategory] =
   @DocumentCategory) ORDER BY [DateInput] DESC"

Nu het control SqlDataSource2 is ingesteld, is het de volgende stap om ervoor te zorgen dat het control GridView op de pagina ermee samenwerkt. Daartoe moeten wij eerst met behulp van de infolabel van het control GridView een verbinding maken tussen het element GridView en het element SqlDataSource2. Schakel ook pagineren en sorteren in en stel de breedte van het control in op 100%.

Als u in de infolabel van het control op de koppeling Edit Columns klikt, wordt het dialoogvenster Fields geopend. Hierin kunt u opgeven hoe elke kolom wordt weergegeven en hoe deze zich gedraagt. Aangezien deze lijst met documenten bestemd is voor de eindgebruiker, zijn er waarschijnlijk verschillende waarden die niet hoeven te worden weergegeven. Verwijder daarom de kolommen DocumentIDDocumentCategory en TopDoc uit de lijst in het dialoogvenster.

Kenmerkend voor de resterende drie kolommen is dat het BoundField-kolommen zijn. Daarom wijzigen we de kolom DocumentName in een sjabloonkolom. In plaats van alleen een String-waarde uit de kolom DocumentName weer te geven, willen we de documentnaam weergeven als koppeling naar het document. Dit is alleen mogelijk als we de weergave van de kolom in eigen hand nemen.

Markeer in het dialoogvenster Fields de kolom DocumentName. U ziet dan een koppeling onder in het dialoogvenster waarmee we de kolom kunnen converteren naar een sjabloonveld. Dit wordt weergegeven in afbeelding 23.
 
Afbeelding 23. De kolom DocumentName converteren naar een sjabloonveld
Afbeelding 23. De kolom DocumentName converteren naar een sjabloonveld
 
Nadat u op de koppeling Convert this field into a TemplateField hebt geklikt, hoeft u slechts op OK te klikken om door te kunnen gaan met de laatste stap.
Open de infolabel van het control GridView opnieuw en klik op de koppeling Edit Templates onder in de infolabel. De ItemTemplate voor de kolom DocumentName wordt weergegeven. Als u de vervolgkeuzelijst met beschikbare sjablonen opent, zult u merken dat u veel meer kunt wijzigen, zoals u kunt zien in deze afbeelding van de inhoud van de vervolgkeuzelijst.
 
Figure 24. Lijst Edit Templates
Afbeelding 24. Lijst Edit Templates
 
Op dit moment zijn we echter alleen geïnteresseerd in het wijzigen van de sectie ItemTemplate. Selecteer dit item daarom in de vervolgkeuzelijst en verwijder het control Label dat die zich in deze weergave van de kolom bevindt. Voeg in plaats van een Label-control een HyperLink-control toe. Bewerk vervolgens de gegevensbindingen van het control HyperLink en stel de eigenschap Text van het control in op de kolom DocumentName. Stel vervolgens de eigenschap NavigateUrl in op het volgende:
 
<%# Eval("DocumentName", @"~\Files\{0}") %>
 

Build maken en de toepassing uitvoeren

Dit is alles wat het basisraamwerk van het bestandsbeheersysteem betreft. U kunt nu uw eigen toepassing bouwen en gebruiken. Uiteindelijk hebt u een pagina waarmee eindgebruikers door een categorieënsysteem kunnen navigeren en bestanden kunnen weergeven of downloaden. Als u beheerder bent, kunt u categorieën en bestanden toevoegen, bewerken of uit het systeem verwijderen.

U zult wellicht gemerkt hebben dat we de kolom TopDoc niet hebben gebruikt in deze demonstratie. Deze kolom kan worden gebruikt voor een speciaal GridView-control, dat u op een willekeurige plek in de toepassing kunt plaatsen (bijvoorbeeld op de introductiepagina van de site) en waarin alleen de documenten worden weergegeven waarvoor de waarde TopDoc is ingesteld op True. Dit is een leuke manier om de aandacht te vestigen op de belangrijkste documenten in uw lijst met bestanden. Dit komt vooral van pas als uw bestandssysteem een groot aantal bestanden bevat.
 

Samenvatting

In dit artikel wordt gedemonstreerd hoe u kunt werken met de basisfunctionaliteit van de clubwebsite starterkit en hoe u deze kunt aanpassen aan uw persoonlijk gebruik. Zoals u ziet, is het opnemen van uw eigen functies in dit gemakkelijk te gebruiken startpakket tamelijk eenvoudig.
Veel plezier en happy coding!
 
 
Beoordeel deze pagina

1 2 3 4 5 6 7 8 9
Slecht Goed
Gratis magazine voor .NET ontwikkelaars

Neem een gratis abonnement op het .NET Magazine voor developers

©2008 Microsoft Corporation. Alle rechten voorbehouden. Contact opnemen |Gebruiksvoorwaarden |Handelsmerken |Privacyverklaring
Microsoft