Introduction to the Personal Web Site Starter Kit


Bill Evjen

March 2005

Applies to:
   Microsoft ASP.NET 2.0
   Visual Web Developer 2005 Express Edition
   Visual Studio 2005

Summary: Learn about the new Personal Web Site Starter Kit, which is an available project type in Visual Studio 2005 and Visual Web Developer 2005 Express Edition. (22 printed pages)


Working with the Starter Kit Default Files
The Master Page: Default.master
The Configuration Page: Web.config
The First Content Page: Default.aspx
Including Your Resume Using Resume.aspx
Your Links to the World: Links.aspx
Picture This: Albums.aspx
Administering Your Own Albums
Registering Users: Register.aspx
Related Books


Inside Visual Web Developer 2005 Express Edition, you will find the Personal Web Site Starter Kit, ready for you to start working with right away. The Personal Web Site Starter Kit is designed to provide you with a tool that you can use to quickly put up a worthwhile Web site. This starter kit provides you with a basic home page, a page for your resume, another to place a collection of your favorite links, and another page that enables you to publish your photos. The home page of the Personal Web Site Starter Kit is presented here in Figure 1.


Figure 1. Personal Web Site Starter Kit home page

The biggest focus of this starter kit is the Albums page, which allows you to publish photo albums. One nice feature of the of the Albums page is that is allows for you to publish albums for the general public, or you can create restricted access to an album and allow it to be viewed only by a select audience. The default Albums page is shown in Figure 2.


Figure 2. Photo Gallery home page

All the pages in the Personal Web Site Starter Kit are ready for you to delete the default lorem ipsum text and replace it with your own words. Doing this will instantly give you a personalized Web site.

The Personal Web Site Starter Kit is a great way for you to learn the fundamentals of how to build a site. You can view the code from the pages of this application, and it uses some of the strongest features from the latest release of ASP.NET. Even if you are not interested in using this starter kit for an actual production Web site, it is still a valuable resource to use for learning on how to create an application using ASP.NET 2.0.

Before we look at working with this application, let's first start by taking a look at how it is installed.

Working with the Starter Kit Default Files

Installing the Personal Web Site Starter Kit is as simple as opening a project in Visual Web Developer 2005 Express Edition, since you will find that the application is one of the available projects in this IDE. To create an instance of the starter kit, click File, then select New Web Site from the Visual Studio menu. This will open the New Web Site dialog box, in which you can select the Personal Web Site Starter Kit, as shown in Figure 3.


Figure 3. New Web site

After you have selected the application, your first step will be to actually build the application and pull it up in a browser. This is so that the database file, ASPNETDB.mdf, is created for this particular application. This file is used for the membership and role management capabilities that are now provided by ASP.NET 2.0. When the application is first run, we are interested in having the application create a couple of roles within the role management system.

How are these roles created when the application is first run? Actually, it is pretty interesting how this occurs. Let's take a look at the application's Global.asax file to see how this occurs. Note that the Global.asax file contains an Application_Start function as shown below in Listing 1.

Listing 1. Creating new roles when the application is first run from the Global.asax

Sub Application_Start(ByVal sender As [Object], ByVal e As EventArgs)
   AddHandler SiteMap.SiteMapResolve, AddressOf Me.AppendQueryString
   If (Roles.RoleExists("Administrators") = False) Then
   End If
   If (Roles.RoleExists("Friends") = False) Then
   End If
End Sub

From this method, you can see that a couple of If Then statements first check to see whether the roles of the Administrators or Friends exist in the system. This is done using the Roles class's RoleExists method. If this check is found to be False, then the role is created using the CreateRole method.

Once you pull up the application, you can then shut it down, as the next step is to create an administrator user for the application. To create an administrator for the application, click the ASP.NET Configuration button from the Visual Studio Solution Explorer. This will pull up the Web Site Administration tool directly in Visual Studio. You can also pull up this page by selecting Website and then clicking ASP.NET Configuration from the Visual Studio menu.

After the ASP.NET Configuration page is created and pulled up directly in Visual Studio, you should then use this tool to create a new user who represents the administrator of the site.

To create this administrative user, click the Security tab from the ASP.NET Configuration page. This page is shown in Figure 4.


Figure 4. Administration page

From the Security page, you can create an administrator user by selecting the Create user link. This will pull up a page with a form for you to input all the user's information, which will be saved to the ASPNETDB.mdf file. This form is shown in Figure 5.


Figure 5. Adding an administrator

As shown in Figure 5, input the administrator's user name, password, e-mail address, and a security question and an answer for the security question. Before clicking the Create User button, be sure to select the roles in which the administrator belongs. For this example, check the Administrators check box and then click the Create User button to create this administrative user. If your application is going to have more than one administrator, simply create another user using the same process.

Let's next take a look at the pieces of the starter kit so you can understand exactly where you apply the customization points that are required to make this application unique.

The Master Page: Default.master

The first item for this starter kit we will examine is the Default.master page. ASP.NET 2.0 introduces a way in which to build templated pages. This means that you can build a master template or a master page, which you can then apply to each and every page you designate. You will notice that the single master page used in the Personal Web Site Starter Kit, Default.master, also includes a code-behind page (Default.master.vb or Default.master.cs), as do the standard .aspx pages. However, since this master page is only dealing with presentation and is not concerned about any other business logic, you will find that the code-behind page is just the actual code framework of the code-behind page and doesn't include any actual code.

All the presentation for this page is contained within the Default.master page itself. Visual Studio does an excellent job of letting you look at the .master page visually. Clicking the Design tab in the Visual Studio IDE, you can view what the master page actually looks like. This is shown here in Figure 6.


Figure 6. Master page

From this figure, you can see that Visual Studio will apply this look and feel to any content page that uses this master page (I will discuss this shortly). Also, you will find a collection of HTML server and Web server controls placed on the page. These controls include the Menu, SiteMapPath, and LoginStatus controls. Probably the most interesting control on this page is the ContentPlaceHolder control.

The ContentPlaceHolder control is a defined area that allows for any content page that uses this particular master page to interject content into. Basically, when you construct your master pages, you are allowing content pages to use specified sections of the page. A content page will not be able to work outside the bounds of this content area. Though it is possible to include multiple content areas through the use of multiple ContentPlaceHolder controls placed on the master page, this example (our Default.master page) uses only one of these controls.

From this master page, you should modify the page either from the Design view shown in Visual Studio, or by directly changing the code of the page from the code view. What are you changing, exactly? Well, for instance, you will probably want to change the Your Name Here parts to the name you want to give to the site.

On the Default.master page, you can also see that there is a SiteMapDataSource control at the bottom of the page. The SiteMapDataSource control is one of the new data source controls that have been added to ASP.NET 2.0. This control is designed to work with any web.sitemap files that are contained within your application. The web.sitemap file is basically an XML representation of your application's page structure that can then be bound to a couple of site navigation controls that you will find at your disposal. In fact, the Default.master page includes a couple of these new site navigation controls, one being the Menu server control. This control is shown here in Listing 2.

Listing 2. Looking at the Menu control

<asp:menu id="menua" runat="server" 
  staticdisplaylevels="2" />

From this code, you can see that the Menu control points to the web.sitemap file by way of the SiteMapDataSource1 control on this page. This is done by using the DataSourceId attribute in the Menu control. An important attribute to pay attention to in this control is the Orientation attribute, which specifies that the links should be laid out horizontally. Also, note the use of the StaticDisplayLevels attribute and the fact that it is only set to a value of 2, so that only the first two layers of links will be displayed (Home being the first layer and Resume, Links, and Albums being the second layer).

Besides the Menu control on this page, there is also the SiteMapPath control, which is also using the data found in the web.sitemap file. When generated and if the end user browses to one of the sub-pages, you can see how this control uses what is called bread-crumb navigation on the page to inform the user where in the application they reside. This is illustrated here in Figure 7.


Figure 7. Bread-crumb navigation

The interesting thing about this control is that it is not associated with the web.sitemap file through the use of the SiteMapDataSource control. Instead, this control directly binds itself to the web.sitemap file automatically. In terms of customizing this control, one attribute that is easily modifiable is the PathSeparator attribute, which specifies the character that is used between each of the page levels.

As far as modifying the Default.master page, let's stop there and move onto some of the other components of the site.

The Configuration Page: Web.config

Having a web.config file within an ASP.NET application is nothing new; what is new is all the new features provided by ASP.NET 2.0 that have been made configurable through this XML configuration file.

You can make the biggest modification to the look and feel of your site by changing the theme of the application. Looking at the web.config file, you can see that the theme of any page generated is using a theme called White.

<pages styleSheetTheme="White" />

If you look in the Solution Explorer, you will see a folder called App_Themes. Inside this folder there are two themes that have been consolidated into two folders—Black and White. By default, the Personal Web Site Starter Kit will use the White theme.

A theme contains the styling for the application. Themes can be applied at a control, page, or site level. In the case of this starter kit though, the theme is applied application-wide through the specification made in the web.config file. If you open up one of the theme folders, you will notice that both the Black and White themes are made up of not only .css files, but also .skin files and images. A .skin file defines the styling that is applied to server controls through the use of their attributes.

Changing the theme of the page is as simple as changing the value of the styleSheetTheme attribute in the web.config file as shown here:

<pages styleSheetTheme="Black" />

Both the Black and White themes of the Personal Web Site Starter Kit are represented here in Figure 8.

Click for larger image

Figure 8. Comparing themes (click to enlarge)

To modify the overall appearance of the application, you can either choose one of the predefined themes or you can create your own theme. To do this, simply create a new theme folder in the App_Themes directory and create your own .css, .skin, and images. Then you can either change the theme for an individual page using the Theme attribute in the @Page directive, or you can globally change the theme in your entire application through the use of the styleSheetTheme attribute in the <pages> element of the web.config file.

Now let's take a look at the <location> section at the bottom of the web.config file.

<location path="Admin">
         <allow roles="Administrators" />
         <deny users="*" />

In most cases, developers apply settings to the web.config file as a means of applying a configuration setting to everything contained within the application as a whole. Note though that through the use of the <location> element in the web.config file, you can also control the configurations applied to folders or even specific pages contained within the application that are outside the realm of configurations that were applied to the application as a whole.

The section shown above is defining specific configuration settings for the Admin folder of the Personal Web Site application. This means that everything defined here is defined to each and every file contained within the Admin folder. The settings applied, through the use of the <authorization> element, will allow only authenticated users who are in the Administrators role to view the content. If a user is found outside of the Administrators role, then they will be locked out from viewing any of the pages contained in this folder.

The First Content Page: Default.aspx

Looking at the Default.aspx page, you will notice that it isn't your standard .aspx page. This is a content page. This page, like most in this application, uses a master page as a template. Let's look at the basic structure of this page, as shown in Listing 3.

Listing 3. The structure of the Default.aspx page

<%@   Page Language="VB" MasterPageFile="~/Default.master" 
            Title="Your Name Here | Home"
   CodeFile="Default.aspx.vb" Inherits="Default_aspx" %>

<asp:content id="Content1" contentplaceholderid="Main" runat="server">


All .aspx pages that are meant to be content pages use the MasterPageFile attribute in the @Page directive. From Listing 3, you can see that the MasterPageFile attribute points to the Default.master page. This is the page template from which this content page will inherit.

Since this is a content page, you will not need to include any of the standard HTML tags (such as the opening and closing <html>, <body>, and <form> tags), because these are defined in the master page and there is thus no need to repeat the tag representation. What is included is a single Content server control. This control binds itself to the single ContentPlaceHolder control that was used on the master page. The association between the two controls is done by using the ContentPlaceHolderID attribute within the Content control. In Listing 3 you can see that the value of the ContentPlaceHolderId attribute is Main, which you will find to be the value of the ID attribute from the ContentPlaceHolder control on the master page. It is within this Content control where the entire page's content is defined. If you end up adding additional ContentPlaceHolder controls on the master page, then you can also bind to these instances by adding additional Content controls on the content page.

The nice thing about using a content page with a master page is that you can work with it in Visual Web Developer 2005 Express Edition. Clicking the Design view of the Default.aspx page, you will see the following view of the page.


Figure 9. Design view

From this figure, you can see that the contents that were defined in the master page are shown in gray, while the sections that are modifiable from the content page are shown in the standard white or clear view.

The Default.aspx page is the home page of the application. The first thing you can do here to personalize the application is to replace all the lorem ipsum text with meaningful text. All the lorem ipsum text on this page is hard-coded text and is not data-driven, so you will just need to change this text directly in the .aspx page itself.

The interesting thing about this page is that it includes some the more exciting pieces of ASP.NET 2.0. The page's left-hand column is defined at the top of the page. The first control defined here is a LoginView control. Since we are working with an application that will allow users to log in to the application, this page will have viewers who are considered authenticated and authorized users (meaning that they have logged into the application and were authorized for a specific role). This page will also have viewers who have not gone through the authentication and authorization process. Because of these dynamics, there will be scenarios in which you will display specific data for authenticated users while displaying other content to users who are not authenticated. The LoginView control allows for this kind of behavior.

The LoginView control has two templates, <AnonymousTemplate> and <LoggedInTemplate>. Looking at the code from Default.aspx, you can see that the AnonymousTemplate section includes a form that allows the end user to attempt to log in to the application. If the user is authenticated after logging into the application, they will then be presented with the contents provided in the LoggedInTemplate section. This section only contains some text and a LoginName control. The LoginName control is used simply to present the name of the authenticated user. An example of both of these views is presented in Figure 10.


Figure 10. Unauthenticated vs. authenticated view

Below the login form, you will find a FormView control, which presents a random photo from a random album. The FormView control will get this picture and associated data from the Default.aspx page's ObjectDataSouce control (you will find this control at the bottom of the page). The code for the ObjectDataSource control is shown here in Listing 4.

Listing 4. The ObjectDataSource control

<asp:ObjectDataSource ID="ObjectDataSource1" Runat="server" 
  TypeName="PhotoManager" SelectMethod="GetPhotos">

The ObjectDataSource control is meant to retrieve data from a middle-tier component. In this case, the ObjectDataSource1 control uses the TypeName attribute to point to a class called PhotoManager and a method contained within this class called GetPhotos. You will actually find this class within the App_Code folder of your application. So, what happens is that when the Default.aspx page is requested, the PhotoManager class is invoked by the ObjectDataSource control, which then binds the provided information using simple binding syntax such as <% Eval("AlbumID") %>.

To create a thumbnail of the image on the Default.aspx page, a custom http handler is employed. The http handler is used from an HTML <img> element, as illustrated here in Listing 5.

Listing 5. Using the http handler for the images

<img src="Handler.ashx?PhotoID=<%# Eval("PhotoID") %>&Size=M" 
 class="photo_198" style="border:4px solid white" 
 alt='Photo Number <%# Eval("PhotoID") %>' />

From this example, you can see that the actual image is retrieved from the http handler Handler.ashx. You will also find this file contained within your application. Review this file as an example of how you can use your own http handlers from an ASP.NET page.

Including Your Resume Using Resume.aspx

The starter kit's resume page is another content page. Pulling up this page in the browser, you will see that this page uses the same master page that is used by the Default.aspx page.

The Resume.aspx page is a page that allows you to present your resume (also known as curriculum vitae or simply CV). Besides being a content page, this page simply contains a collection of static images and text, all of which are contained within the page's Content server control.

To customize this page by adding your resume to it, simply replace the lorem ipsum text with your own. For the image, place a picture of yourself in the Images folder of the application and point to this new picture from the page's <img> HTML element.

<img src="images/resume-evjen.jpg" class="photo_198" 
style="border:4px solid white" alt="Resume Photo"/>

Another basic page is the Links.aspx page. This page is another content page that uses Default.master. This page is simply a list of links that are organized into categories such as Top 5, Cool Site Designs, Photo Sites, and Resources.

You can edit the Links.aspx page to customize the categories and the links that are presented on this page.

Picture This: Albums.aspx

One of the big areas of focus for the Personal Web Site Starter Kit is the photo album system that it contains. Clicking the Album page will bring you to Albums.aspx. The default view of this page is shown here in Figure 11.

Click for larger image

Figure 11. Photo Gallery home page (click for larger image)

The photo album system included in this application allows you to display all your personal pictures in custom albums. Included in the default view is a single album for demonstration purposes. This album view shows the first picture in the album as well as showing the number of photos that are included in the album. Clicking the album name (which is a hyperlink) will bring you to a page that displays the pictures contained in the album. This is illustrated here in Figure 12.


Figure 12. Photo album

From this figure, you can see each of the photos in the album is represented with a thumbnail image of the larger image. Also included is the name of the picture. Clicking on one of the images will open the larger image. This is shown here in Figure 13.


Figure 13. Displaying a photo

When viewing a single image, you will notice that there is a navigation system provided. This image navigation system is defined here in the following figure.


Figure 14. Navigating the photos

This page also includes a download photo button. Clicking this button will take you to a page that will show the image in its actual size. The viewer is asked to right-click the image in order to save it to disk.

A personalized Albums.aspx page is shown in Figure 15.


Figure 15. Personalized album

Like the home page of the site, which uses an ObjectDataSource control to get a random picture from a random album to display as the picture of the day, the Albums.aspx page uses an ObjectDataSource control to get a list of albums (plus the first picture from the album) to display.

<asp:ObjectDataSource ID="ObjectDataSource1" Runat="server" 
  TypeName="PhotoManager" SelectMethod="GetAlbums">

In this case, the ObjectDataSource1 control is using the same class, PhotoManager, but instead is using the GetAlbums method to retrieve this list of albums. The GetAlbums method is shown here in Listing 6.

Listing 6. The GetAlbums method

Public Function GetAlbums() As Generic.List(Of Album)
   command.CommandText = "GetAlbums"
   command.Parameters.Add(new SqlParameter("@IsPublic", filter))
   Dim reader As SqlDataReader = command.ExecuteReader()
   Dim list As New Generic.List(Of Album)()
   Do While (reader.Read())
      Dim temp As New Album(CInt(reader("AlbumID")), & _
         CInt(reader("NumberOfPhotos")), & _
         CStr(reader("Caption")), CBool(reader("IsPublic")))

   Return list
End Function

From this bit of code, you can see that the GetAlbums method takes no input parameters and returns a generic list of Albums. The Albums type is defined in the ObjectTypes.vb or ObjectTypes.cs file, which you will also find in the App_Code folder. Once each album is retrieved from the database, some of the album details are presented through the use of some declarative binding, as shown here:

<h4><a href="Photos.aspx?AlbumID=<%# Eval("AlbumID") %>">
<%# Server.HtmlEncode(Eval("Caption").ToString()) %></a></h4>
<%# Eval("Count") %> Photo(s)

From these statements, you can see that the AlbumID and the Caption are used to construct a hyperlink to the album details. Then the Count property is used to provide a count of the number of images that the album contains.

Note On a side note, the GetAlbums method is a nice example of the new generics capabilities provided by the .NET Framework 2.0. Generics allow you to make a strongly typed collection that allows you to avoid the process of boxing and unboxing, which is what occurs when working with collections outside of collections that are based upon generics. You will find that generic collections are easier to work with and provide better performance.

Administering Your Own Albums

If you logged into the Personal Web Site Starter Kit as a user defined under the Administrators role, you will notice that there is an additional accessible page found in the navigation structure of the application. The name of this page is Manage and is shown here in Figure 16.


Figure 16. Administering your albums

Clicking on the Manage page will take you to a page found in Admin\Albums.aspx. This Albums.aspx page allows you to administer the albums that are presented through your application. This page is shown in Figure 17.


Figure 17. Creating a new album

From this view, you can see that the sample album is shown in the list of albums. You can rename, edit, or delete each listed album. Feel free to delete the sample album as we are going to add our own.

To add a new album, provide a name for the album in the text box of the Add New Album section of the page. You will need to decide whether or not this album is going to be a public, viewable album or if it is going to be an album that is considered private. Later, we will cover what it means for an album to be private.

To add images to your new album, click the Edit button from the list of albums. This will pull up a detailed view of the album (shown here in Figure 18).

Click for larger image

Figure 18. Setting details information (click for larger image)

From this page, you can add a new image to the album as well as provide a name for the image that will be displayed to the viewer. After these values are provided, simply click the Add button and you will see the image listed in the album.


Figure 19. Adding photos

Not only can you add single images one at a time in this manner, but you can also add numerous images at once by copying the images to the Uploads folder that you will find in the application. Once you have copied all the images you are interested in placing in the album in the Uploads folder, go back to the manager view of the album and click the Import button from the left column. This will move the images to the database for storage. After the images are moved to the database, you will see the images listed in the album page as shown in Figure 20.


Figure 20. After adding new images

Note that after you have moved the images from the Uploads folder to the database, you should then delete the images you placed in the Uploads folder, since clicking the Import button again will simply upload the images for a second time and you will have two copies of each image in your folder.

After the images are uploaded to the database and are included in your album, if you used the bulk upload you will notice that the name used for each image is simply the name of the file. You may wish to rename each of the images to something a little more meaningful. To accomplish this task, simply click the Rename button next to the photo and you will then be presented with a text box that enables you to rename the file. This is shown in Figure 21.


Figure 21. Renaming a photo

Registering Users: Register.aspx

Clicking on the Register link in the navigation of the application, viewers will be directed to a page that will allow them to register for the application. This page can also be accessed when a viewer clicks the Create Account button on the home page. The Register.aspx page is presented in Figure 22.


Figure 22. Requesting a new account

What are users actually registering for? The viewer who has registered will find that once the registration is complete they will not have any new access capabilities. Instead, they will first have to be activated for more privileges by a user in the Administrator role.

There are two roles in the Personal Web Site Starter Kit—Administrators and Friends—both of which warrant a little more definition.

An individual who is considered an administrator will be able to manage the application. This means that a user in this role will be able to create new albums and photos, delete albums and photos, rename items, and decide whether any of these items are public or private. Administrators also have the ability to manage the application's registered users. Administrators can add and delete users from the Administrator role as well as add or delete users from the Friends role.

A user who is defined as being in the Friends role will not be able to manage any of the items that are mentioned above. Instead, users defined in the Friends role will be able to view the albums that are earmarked as private.

Albums that are earmarked as private are viewable only by users who are in the Administrators or Friends role. Unauthenticated users will not be able to view any albums that are not marked public.

When users register for your personal web site they will be placed in the list of users found in the ASP.NET Web Site Administration Tool. You can get to this tool by clicking the ASP.NET Web Site Administration Tool link from the Users and Settings section of the Manage page in the application. The other way to pull up this page is to click the appropriate button in the Visual Studio Solution Explorer or by selecting Website, then selecting ASP.NET Configuration.

When this configuration tool opens, select the Security tab. From the security page, select the Manage users link. You will then be presented with a list of registered users. An example of this is presented in Figure 23.


Figure 23. Listing users

From this page, you can edit or delete users. Right away, you can see whether the user you are working with is considered active in the application. Active means that their login (their defined username and password) will work in order to get authenticated and authorized for the application. Checking the check box next to the user will make them active. Clearing (unchecking) the checkbox will turn off the user's active status.

If someone has registered for your application, they are essentially asking to be considered to be in the Administrators or the Friends role. If you are interested in assigning them to one of these roles, click on the Edit roles link next to their name and select the appropriate role. If they are then considered an active user and in the role of Friends, the next time they log into the application, they will be able to see all the albums that are earmarked as private, which unauthenticated users will be unable to do.


The Personal Web Site Starter Kit is both valuable and fun for a several reasons. First, it allows you to quickly and easily create a Web site that contains some personal information about yourself. Second and more importantly, this starter kit shows off some of the new capabilities found in ASP.NET 2.0 as well as some new features provided by the underlying .NET Framework 2.0.

From generics to new controls, there is a lot to learn from this application. Some of the more important items to pay attention to are the new membership and role management systems that ASP.NET 2.0 provides. These new security systems allow for you to easily manage access to your application and to not only authenticate users in a general fashion, but to also place the authenticated user in a particular role that will have different access rights.

The idea of this starter kit is not to use it as is, but instead to customize it heavily. You needn't limit yourself to just changing the lorem ipsum text, but instead you should look at how to add additional roles, privileges, new pages, and new capabilities. Explore further possibilities in my article Extending the Personal Web Site Starter Kit. Have fun and happy coding!


About the author

Bill Evjen is an active proponent of .NET Framework technologies and community-based learning initiatives for .NET. He is a technical director for Reuters, the international news and financial services company ( based in St. Louis, Missouri. Bill is the founder and executive director of INETA (, the International .NET Association, which represents more than 100,000 members worldwide. Bill is also an author and speaker and has written such books as ASP.NET Professional Secrets, XML Web Services for ASP.NET, Web Services Enhancements, and the Visual Basic .NET Bible (all from John Wiley at

© Microsoft Corporation. All rights reserved.