At the heart of ASP.NET is its ability to create dynamic form content.
Whether you’re creating a complex shopping cart application, or a simple
page to collect user information and send the results out via email, Web Forms
have a solution. They allow you to use HTML controls and Web controls to create
dynamic pages with which users can interact. In this chapter, you will learn
how Web Forms, HTML controls, and Web controls, in conjunction with VB.NET
and C# code, should change the way you look at, and develop for, the Web.
In this chapter I’ll introduce you to the following concepts:
HTML controls
Web Forms
Web controls
Handling page navigation
Formatting controls with CSS
Toward the end of the chapter, you’ll put all of these concepts
to work into a real world application! I’ll introduce the Dorknozzle
Intranet Application that you’ll be building throughout this book, and
see how what you learned in this chapter can be applied to some of the pages
for the project.
Working with HTML Controls
HTML controls are outwardly identical to plain old HTML 4.0 tags,
but employ the runat="server" attribute. For each of HTML’s
most common tags, a corresponding server-side HTML control exists, although
Microsoft has added a few tags and some extra properties for each. Creating
HTML controls is easy—we simply stick a runat="server" attribute
on the end of a normal HTML tag to create the HTML control version of that
tag. The complete list of current HTML control classes and their associated
tags is given in Table 4.1.
These HTML control classes are all contained within the System.Web.UI.HtmlControls namespace.
Because HTML controls are processed on the server side by the ASP.NET
runtime, we can easily access their properties through code elsewhere in the
page. If you’re familiar with JavaScript, HTML, and CSS, then you’ll
know that manipulating text within HTML tags, or even manipulating inline
styles within an HTML tag, can be cumbersome and error-prone. HTML controls
aim to solve this by allowing you to manipulate the page easily with your
choice of .NET language, for instance, using VB.NET or C#. We’ll start
by looking at the HTML controls library, then we’ll explore in more
detail the properties exposed by the controls when we process a simple form
containing HTML controls and code.
This line would create a new hyperlink with the text “Click Here.”
Once the link is clicked, the user would be redirected to somepage.aspx as
given by the href attribute.
HtmlButton
The HtmlButton control creates a server-side
HTML <button> tag.
Notice that we’re using events here. On HTML controls, we need
to use OnServerClick to specify the ASP.NET handler
for clicks on the button, because onclick is reserved for
handling clicks with JavaScript on the client side. In this example, the handler
subroutine is called Click, and would be declared in a
script block with the same form as the Click handlers we
looked at for <asp:Button> tags previously:
<script runat="server" language="VB">
Sub Click(s As Object, e As EventArgs)
Response.Write(myButton.ID)
End Sub
</script>
In this case, when the user clicks the button, the ServerClick event
is raised, the Click() subroutine is called to handle
it, and the ID of the HtmlButton control is written
onto the screen with Response.Write() (the Write() method
of the Response object).
HtmlForm
The HtmlFormcontrol creates a server-side <form> tag.
Most HTML controls, Web controls, etc., must be placed inside an HtmlForm control.
<form runat="server">
<!-- ASP.NET controls in here -->
</form>
HtmlImage
The HtmlImage control creates a server-side <img> tag.
The following code shows how we might place an HtmlImage control
on a page, along with an HtmlButton:
What will happen if these controls are placed on a page along with the
script block? First of all, the image arrow.gif will
appear. When the HtmlButton control is clicked, it
changes to welcome.gif. Behind the scenes, the ServerClick event
is raised when the button is clicked, thus the Click() subroutine
is called, and the Src property of the HtmlImage control
is changed from arrow.gif to welcome.gif.
HtmlGenericControl
The HtmlGenericControl creates a server-side control for HTML
tags that do not have an HTML control associated with them. Perfect examples
of this are the <span> and <div> tags.
The following example illustrates how you can modify text within a <span> tag
to change the content from I like ASP.NET to Why
would anyone need PHP? dynamically.
We simply add the following code to respond to the ServerClick event
and change the text:
<script runat="server" language="VB">
Sub Click(s As Object, e As EventArgs)
myGenericControl.InnerText = "Why would anyone need PHP?"
End Sub
</script>
<script runat="server" language="C#">
void Click(Object s, EventArgs e) {
myGenericControl.InnerText = "Why would anyone need PHP?";
}
</script>
HtmlInputButton
The HtmlInputButton control creates
a server-side <input type="submit">, <input
type="reset">, or <input type="button"> HTML
tag.
The HtmlInputCheckBox control is the perfect
choice when you want to allow your users to select multiple items from a list.
HtmlInputFile
The HtmlInputFile control creates a server-side <input type="file"> tag
in the HTML. This displays a text box and Browse button
to allow users to upload files from ASP.NET pages. There is no Web control
equivalent for this tag, so it’s typically required when working with
file uploads—even with Web Forms (which we’ll discuss shortly).
Try viewing the source of any one of your ASP.NET pages from your browser,
and you’re likely to find this tag being used to store view state information.
HtmlInputImage
The HtmlInputImage control creates a server-side <input type="image"> tag.
This tag provides an alternative to the HtmlInputButton control.
They both function in the same way; the difference is that the HtmlInputImage control
uses a custom image rather than the beveled gray Windows-style button. The
mouse coordinates are also sent along with the form submission when the user
clicks a control of this type.
HtmlInputRadioButton
The HtmlInputRadioButton control creates a server-side radio button. The following code, for instance,
offers a choice of Male or Female:
Similar to the HtmlInputCheckBox control, the HtmlInputRadioButton control
creates a list of items for users to choose from. The difference, however,
is that the user is only able to select one item at a time.
HtmlInputText
The HtmlInputText controlcreates a server-side <input
type="text"> or <input type="password"> tag.
The preceding code creates a typical login screen layout.
HtmlSelect
The HtmlSelect controlcreates a server-side version of the <select> tag
for creating drop-down lists or list boxes. The following code creates a drop-down
menu:
Select your favorite movie:<br />
<select id="selectMovie" runat="server">
<option>Star Wars</option>
<option>Spider Man</option>
<option>The Godfather</option>
<option>Lord of the Rings</option>
</select>
The following code creates a multiple-selection list box:
Which of these movies do you like?<br />
<select id="selectMovie" runat="server" multiple="true" size="4">
<option>Star Wars</option>
<option>Spider Man</option>
<option>The Godfather</option>
<option>Lord of the Rings</option>
</select>
You’ll notice the <option> tag within the
main <select> tag; this is used to denote each item
to appear in the list box or drop-down menu.
HtmlTable, HtmlTableRow and HtmlTableCell
The HtmlTable, HtmlTableRow,
andHtmlTableCell controls
create server-side versions of the <table>, <tr>, <td>,
and <th> tags. The following code creates a server-side
table:
<table id="myTable" border="1" cellspacing="0" cellpadding="0"
runat="server">
<tr runat="server" id="row1">
<td runat="server" id="cell1">Table Data 1</td>
<td runat="server" id="cell2">Table Data 2</td>
</tr>
<tr runat="server" id="row2">
<td runat="server" id="cell3">Table Data 3</td>
<td runat="server" id="cell4">Table Data 4</td>
</tr>
</table>
<button id="myButton" OnServerClick="Click" runat="server">Click
Here</button>
You could add the following code to respond to the Click event
raised by the HtmlButton control and change the content
of the first cell to read "Hello World."
<script runat="server" language="VB">
Sub Click(s As Object, e As EventArgs)
cell1.InnerText = "Hello World"
End Sub
</script>
We’ve glanced only briefly over the HTML controls, as they should
all be fairly familiar from your experience with HTML. But if you’d
like more information on the HTML controls including the properties, methods,
and events for each, see Appendix A, HTML Control Reference.
Processing a Simple Form
Now that you have a basic understanding of ASP.NET page structure, the
languages VB.NET and C#, and HTML controls, let’s put everything together
and create a simple ASP.NET application.
The application that we will create, in VB.NET and C#, will be a simple survey
form that uses the following HTML controls:
HtmlForm
HtmlButton
HtmlInputText
HtmlSelect
Let’s begin by creating a new file within your favorite code editor.
The following code creates the visual interface for the survey:
Example 4.1. SimpleForm.aspx (excerpt)
<html>
<head>
…
</head>
<body>
<form runat="server">
<h2>Take the Survey!</h2>
<p>Name:<br />
<input type="text" id="txtName" runat="server" /></p>
<p>Email:<br />
<input type="text" id="txtEmail" runat="server" /></p>
<p>Which server technologies do you use?<br />
<select id="servermodel" runat="server" multiple="true">
<option>ASP.NET</option>
<option>PHP</option>
<option>JSP</option>
<option>CGI</option>
<option>Coldfusion</option>
</select></p>
<p>Do you like .NET so far?<br />
<select id="likedotnet" runat="server">
<option selected>Yes</option>
<option>No</option>
</select></p>
<p><button id="myButton" OnServerClick="Click" runat="server">
Confirm</button></p>
</form>
</body>
</html>
From what we’ve already covered on HTML controls, you should have
a good idea of what this page will look like. All we’ve done is place
some HtmlInputText controls, an HtmlButton control, and an HtmlSelect control inside the obligatory HtmlForm control.
Remember, HTML controls are essentially just HTML tags with the runat="server" attribute.
When it’s complete, the interface will resemble Figure 4.1.
Figure 4.1. Create the interface of the ASP.NET page using HTML controls.
When users click the button, we’ll simply display their responses
in their browsers. In a real application, we’d probably be more likely
to save this to a database and perhaps show the results as a chart. Whatever
the case, we’d access the properties of the HTML controls as shown in
the following code:
Example 4.2. SimpleForm.aspx (excerpt)
<script runat="server" language="VB">
Sub Click(s As Object, e As EventArgs)
Response.Write("Your name is: " & txtName.value & "<br />")
Response.Write("Your email is: " & txtEmail.value & "<br />")
Response.Write("You like to work with: " & servermodel.value & _
"<br />")
Response.Write("You like .NET: " & likedotnet.value)
End Sub
</script>
Example 4.3. SimpleForm.aspx (excerpt)
<script runat="server" language="C#">
void Click(Object s, EventArgs e) {
Response.Write("Your name is: " + txtName.Value + "<br />");
Response.Write("Your email is: " + txtEmail.Value + "<br />");
Response.Write("You like to work with: " + servermodel.Value +
"<br />");
Response.Write("You like .NET: " + likedotnet.Value);
}
</script>
Just as you’ve seen with examples from previous chapters, we place
our VB.NET and C# code inside a server-side script block within the <head> part
of the page. Next, we create a new Click event handler
which takes the two usual parameters. Finally, we use the Response object’s Write() method
to print out the user’s responses within the page.
Once you’ve written the code, you can save your work and test
the results from your browser. Enter some information and click the button.
What you type in should appear at the top of the page when the button is clicked.
Introduction to Web Forms
With the inception of new technologies, there’s
always new terminology to master. ASP.NET is no different. With ASP.NET, even
the simplest terms that were previously used to describe a Web page have changed
to reflect the processes that occur within them. Before we begin to describe
the process followed by Web Forms, let’s discuss the foundation concept
of Web pages.
On the most basic level, a Web page is a text
file that contains markup. Web pages are meant to be viewed from a browser
window, which parses the file containing markup to present the information
to the user in the layout envisaged by the developer. Web pages can include
text, video, sound, animations, graphics, and even chunks of "code" from a
variety of technologies.
An HTML form, as you learned in the previous
sections, is a page that contains one or more form elements grouped together
within an HTML <form> tag. Users interact with the various
form elements to make certain choices, or provide certain information; this
information is then sent to the server for processing upon the click of a
submit button. This is useful to us as ASP.NET developers because regular
HTML forms have a built-in mechanism that allows forms to be submitted to
the server. Once the form has been submitted, some kind of extra technology—in
this case, ASP.NET—needs to be present on the server to perform the
actual form processing.
In ASP.NET, we call Web pages Web Forms;
they contain presentational elements (ASP.NET Web controls) in an HTML form,
as well as any code (the processing logic) we’ve added for the page’s
dynamic features.
Figure 4.2. A Web Form contains code for processing logic and Web controls for
presentational purposes.
The next section looks at the various Web controls and how they may
be used within your Web Forms. They’re very similar in appearance to
HTML, so you shouldn’t have any trouble coming to grips with them.
Introduction to Web Controls
As we’ve just
seen, Web Forms allow users to interact with our site using Web
controls. With Web controls, Microsoft basically reinvented HTML
from scratch. For example, it created two different Web controls that correspond
to the two different versions of the HTML <select> tag:
a DropDownList control and a ListBox control.
This means there isn’t a direct one-to-one correspondence between the
Web controls and standard HTML tags, as there is with HTML controls. Web controls
follow the same basic pattern as HTML tags, but the tag name is preceded by asp: and
the name is capitalized using "CamelCasing." Consider the
HTML <input> tag, which creates an input text box on screen:
<input type="text" name="username" size="30" />
The equivalent Web control is the TextBox control, and it would look like this:
Note that, unlike many HTML tags, Web controls always require a closing
tag (the </asp:TextBox> part above). We can also use
the shorthand /> syntax if our Web control tag doesn’t
contain anything between its opening and closing tags. So, we could also
write this TextBox like so:
To sum up, the key points to remember when working with Web controls
are:
All Web controls must be placed within a <form
runat="server"> tag to function properly.
All Web controls require id and runat="server" properties
to function properly.
All Web controls follow the same pattern, but different properties
(attributes) are available to different controls.
They all start with the asp prefix, followed
by a colon.
There are more Web controls than HTML controls, and some offer advanced
features that simply aren’t available in HTML alone. Controls that we’ll
discuss in this and future chapters are as follows:
The basic Web controls perform the on-screen layout of a Web
page, and mirror in many ways the HTML controls that are based on regular
HTML. However, they offer some new refinements and enhancements, and should
be used in place of HTML whenever possible. In this section, we’ll look
at the controls in this group, namely:
Label
TextBox
Button
Image
ImageButton
LinkButton
HyperLink
RadioButton
RadioButtonList
CheckBox
CheckBoxList
DropDownList
ListBox
Panel
PlaceHolder
Label
The easiest way to display static text on your page is simply to add
the text to
the body of the page without enclosing it in any tag. However, if you want
to modify the text displayed on a page from ASP.NET code, you can display
your text within a Label control. Here’s a typical
example:
The following code sets the Text property of the Label control
to display the text “Hello World”:
Public Sub Page_Load()
lblMessage.Text = "Hello World"
End Sub
public void Page_Load() {
lblMessage.Text = "Hello World";
}
Reading this Page_Load() handler code, we can
see that when the page first loads, the Text property
of the Label control with the ID of lblMessage will
be set to “Hello World.”
TextBox
The TextBox control is used to create on screen a box in which the
user can type or read standard text. This Web control can be set to display
a standard HTML text input field, an HTML password field, or an HTML text
area, using the TextMode property. The following code
shows how we might use it in a simple login page:
In each of the three instances above, the attribute TextMode dictates
the kind of text box to render.
Button
By default, the Button control renders the same form submit button that’s
rendered by the HTML <input type="Submit"> tag. When
a button is clicked, the form containing the button is submitted to the server
for processing, and both click and command events are raised. The following code displays a Button control
and a Label:
Notice the OnClick attribute on
the control. Unlike the HtmlButton HTML control, OnClick assigns
a server-side event handler—there is no need to
remember to use OnServerClick. When the button is clicked,
the Click event is raised and the WriteText() subroutine
is called. The WriteText() subroutine will contain
the code that performs the intended function for this button, such as displaying
a message for the user:
Public Sub WriteText(s As Object, e As EventArgs)
lblMessage.Text = "Hello World"
End Sub
It’s important to realize that most Web controls have events associated
with them, and the basic idea and techniques are the same as for the Click event
of the Button control.
Image
An Image control places on the page an image that can be accessed dynamically
from code; it equates to the <img> tag in HTML. Here’s
an example:
A LinkButton control renders a hyperlink on your
page. From the point of view of ASP.NET code, LinkButtons
can be treated in much the same way as buttons, hence the name.
The HyperLink control, which is similar to the LinkButton control,
creates a hyperlink on your page. It’s simpler and faster to process
than LinkButton, but, unlike the LinkButton control,
which offers features such as Click events and validation, HyperLink can
be used only to click and navigate from one page to the next.
The ImageUrl attribute, if specified, causes the
control to display a linked image instead of the text provided.
RadioButton
You can add individual radio buttons to your page one by one, using
the RadioButton control. Radio buttons are grouped
together using the GroupName property. Only one RadioButton control
from each group can be selected at a time.
The main event associated with RadioButtons is
the CheckChanged event; which can be handled with the OnCheckChanged attribute.
RadioButtonList
Like the RadioButton control, the RadioButtonList control represents radio buttons.
However, the RadioButtonList control represents a list
of radio buttons and uses more compact syntax. Here’s an example:
One of the great features of the RadioButtonList is
its ability to bind to a data source.
For instance, imagine you have a list of employees in a database. You could
create a page that binds a selection from that database to the RadioButtonList control,
to list dynamically certain employees within the control. The user would then
be able to select one (and only one) employee from that list, and our code
could determine the choice.
The most useful event produced by RadioButtonList is
the SelectedIndexChanged event, to which you can assign
a handler with the OnSelectedIndexChanged attribute
CheckBox
You can use a CheckBox control to represent a choice that can be only a yes
(checked) or no (unchecked) value.
<asp:CheckBox id="chkQuestion" Text="I like .NET!" runat="server"
/>
As with the RadioButton control, he main event
associated with a CheckBox is the CheckChanged event;
which can be handled with the OnCheckChanged attribute.
CheckBoxList
As you
may have guessed, the CheckBoxList control represents
a group of check boxes; it’s equivalent to using several CheckBox controls
in row:
Like the RadioButtonList control, the CheckBoxList control
has the capability to bind to a data source, and
produces a SelectedIndexChanged event that you can
handle with OnSelectedIndexChanged.
DropDownList
A DropDownList control is similar to the HTML <select> tag.
The DropDownList control allows you to select one item
from a list using a drop-down menu.
As is the case with other collection-based controls, such as the CheckBoxList and RadioButtonList controls, the DropDownList control can be bound to
a database, thus allowing you to extract dynamic content
into a drop-down menu. The main event produced by this control, as you might
expect, is SelectedIndexChanged, handled with OnSelectedIndexChanged.
ListBox
A ListBox control equates to the HTML <select> tag
with the size attribute set to 2 or more. The ListBox control
allows you to select items from a multiline menu. If you set the SelectionMode attribute
to Multiple, the user will be able to select more than
one item from the list, as in this example:
Again, because the ListBox control is a collection-based
control, it can be dynamically bound to a data source.
The most useful event that this control provides is—you guessed it—SelectedIndexChanged,
with the corresponding OnSelectedIndexChanged attribute.
Panel
The Panel control functions similarly to the <div> tag
in HTML, in that the set of items that resides within the tag can be manipulated
as a group. For instance, the Panel could be made visible
or hidden by a Button’s Click event:
The code above creates two TextBox controls within
a Panel control. The Button control
is outside of the panel. The HidePanel() subroutine
would then control the Panel’s visibility by
setting its Visible property to False:
Public Sub HidePanel(s As Object, e As EventArgs)
pnlMyPanel.Visible = False
End Sub
In this case, when the user clicks the button, the Click event
is raised and the HidePanel() subroutine is called,
which sets the Visible property of the Panel control
to False.
PlaceHolder
The PlaceHolder control lets us add elements at a particular place on
a page at any time, dynamically, through code.
The following code dynamically adds a new HtmlButton control
within the place holder.
Public Sub Page_Load()
Dim btnButton As HtmlButton = New HtmlButton()
btnButton.InnerText = "My New Button"
phMyPlaceHolder.Controls.Add(btnButton)
End Sub
public void Page_Load() {
HtmlButton btnButton = new HtmlButton();
btnButton.InnerText = "My New Button";
phMyPlaceHolder.Controls.Add(btnButton);
}
That’s it for our quick tour of the basic Web controls. For more
information on Web controls, including the properties, methods, and events
for each, have a look at Appendix B, Web Control Reference.
Handling Page Navigation
Links from
page to page are what drives the Web. Without linking, the Web would be little
more than a simple page-based information source. Links enable us to move
effortlessly from page to page with a single click; they bridge the gaps between
related ideas, regardless of the boundaries imposed by geography and politics.
This section focuses on page navigability using:
the HyperLink control
navigation objects and their methods
Suppose for a minute that you have created a Website that allows your
users to choose from a selection of items on one page. You could call this
page viewcatalog.aspx. Imagine that you have a second
page, called viewcart.aspx. Once users select an item
from viewcatalog.aspx, you’d probably want to link
them directly to viewcart.aspx so that they can keep
track of their orders. To achieve this, we clearly must pass the information
from the viewcatalog.aspx page over to the viewcart.aspx page.
Using The HyperLink Control
The HyperLink control creates a simple HTML hyperlink on a page. Once
it’s clicked, the user is redirected to the page specified by the NavigateUrl property. For instance:
Here, the NavigateUrl property specifies that this
link leads to the page called viewcart.aspx. Figure 4.3 shows
how the HyperLink control is rendered in the browser.
Figure 4.3. The HyperLink control renders similar to the
anchor tag in the browser.
However, once we’ve arrived at the new page, it has no way of
accessing the information from the first page. If we need to provide the user
some continuity of information, we need something else.
Navigation Objects And Their Methods
The previous example
rendered a simple control similar to the HTML anchor tag. Once the link is
followed, however, we have no record of the previous page or any data it contained
(the Web is a stateless technology).
If we wish to pass information
from one page to the next, we can use one of the three methods listed below
to create the link between the pages:
Response.Redirect()
Navigates to
a second page from code. This is equivalent to using the HyperLink control,
but allows us to set parameters on the query string dynamically.
Server.Transfer()
Ends the current
Web Form and begins executing a new Web Form. This method only works when
the user is navigating to a new Web Form page (.aspx).
Server.Execute()
Begins executing a new Web Form while displaying the current Web Form. The contents
of both forms are combined in the response sent to the browser. Again, this
method only works when the user is navigating to a Web Forms page (.aspx).
The easiest and quickest way to redirect your users from the viewcatalog.aspx page
to the viewcart.aspx page would be using Reponse.Redirect():
Sub linkClk(s As Object, e As EventArgs)
Response.Redirect("viewcart.aspx")
End Sub
You could then use the LinkButton control to
call this subroutine as follows:
<asp:LinkButton id="lbAddToCart" Text="Add To Cart"
OnClick="linkClk" runat="server"/>
This time, when you click the LinkButton control,
the Click event is raised, the subroutine is called,
and Response.Redirect() is called with the name of
the page we want to link to as a parameter. In this way, we’re redirecting
to the new page directly from the code, rather than by using a particular
tag. This enables us to pass information to the new page in the query string.
The query string is a list of variables and their respective values
that we can append to a page’s URL, allowing us to retrieve those variables
and values from that page’s code.
As an illustration, imagine you have a drop-down list that contains
the following product information:
The code you use to handle link clicks will need to find the item selected
in the drop-down list and append it to the query string of the URL to which
the user is to be redirected, as follows:
Sub linkClk(s As Object, e As EventArgs)
Dim strQueryStr As String = "?Product=" & _
Server.UrlEncode(ddlProducts.SelectedItem.Text)
Response.Redirect("viewcart.aspx" & strQueryStr)
End Sub
Note the use of the Server.UrlEncode() method, which converts
characters not allowed in query string values (e.g. &)
to URL-safe character codes (e.g. %26) that the browser
will understand. You should always use this method when adding arbitrary values
to query strings.
When a user selects an item from the drop-down list and clicks the LinkButton control,
the viewcart.aspx page is opened with the selected product
appended as a parameter of the query string. This is illustrated in Figure 4.4.
Figure 4.4. Append the selected item to the query string.
Now that you’ve passed the product to the viewcart.aspx page,
you have to grab it from the query string in the new page. We get hold of
variables from the query string by accessing the Request.QueryString collection,
like so:
Sub Page_Load()
lblResult.Text = Request.QueryString("Product")
End Sub
Here, we simply display the value of the Product query
string parameter, as we see in Figure 4.5.
Figure 4.5. Set the text property of the label control within a Page_Load event
handler to accept the new parameter value.
Now, when you select a product and add it to the cart, the result is
displayed in the redirected page on a label with an id of lblResult.
Now sure, a real product catalog and shopping cart has a lot more to it, but
in this section we’ve uncovered an important building block.
Postback
Postback can be confusing
to newcomers because, while most ASP.NET developers know what it is, they
can’t seem to explain it clearly. The topics we’ve covered so
far, like subroutines, functions, and events, are not new to most Web developers.
HTML, in combination with client-side JavaScript, has been doing all that
for years. ASP.NET is different to this model, though, because it is a server-side,
not client-side, technology—events that occur on a page are handled
by code running on the server. For this to work, ASP.NET uses the mechanism
of postback.
When an event is triggered, for instance, a button is clicked, or an
item in a grid is selected, the page is submitted back to the server for processing,
along with information about the event and any preexisting data on the page
(via view state). We say the page “posts back” to the server.
This is a powerful concept to grasp because it is postback that lets us run
code on the server rather than on the client’s browser, and it is postback
that lets our server code know which items within a drop-down list were selected,
or what information a user typed into a text box.
But what would happen if you had multiple DropDownList controls
that were populated with database data? Users could interact with those DropDownList controls
and, in turn, we could set certain options within the page based on what they
selected from the drop-down menus. Although this seems like a common task,
with traditional ASP it incurred considerable overhead. The problem is that
while the data that’s bound to the drop-down menu from the database
never changes, every time the user selects an item from the
drop-down menu and a postback has to be done, the database must be accessed
again to rebuild the contents of each drop-down list on the page. However,
this is not a problem in ASP.NET.
In ASP.NET we can check for postback with the IsPostBack property, and thus avoid performing any time consuming
tasks unnecessarily. IsPostBack is a page-level property—meaning
that it’s a property of the page itself—and we’d most commonly
use it in the Page_Load()event handler
to execute code only when the page is first loaded. Consider the following
example:
Example 4.4. PostBack.aspx
<html>
<head>
<script runat="server" language="VB">
Sub Page_Load(s As Object, e As EventArgs)
lblMessage1.Text = Now()
If Not IsPostBack Then
lblMessage2.Text = Now()
End If
End Sub
</script>
</head>
<body>
<form runat="server">
<p>Not Checking for postback:<br />
<asp:Label id="lblMessage1" runat="server" /></p>
<p>Checking for postback:<br />
<asp:Label id="lblMessage2" runat="server" /></p>
<p><asp:Button id="btnClick" Text="Click Me" runat="server" />
</p>
</form>
</body>
</html>
Figure 4.6. The IsPostBack property checks to make sure the
user isn’t resubmitting the page.
In this example, the IsPostBack check means that
the second label doesn’t refresh when the Button control
is clicked. Similarly, we could use IsPostBack within
the Page_Load() subroutine to set up database-driven drop-down
menus just once within each user’s session, making the online experience
smoother, and making our application more scalable. Don’t worry if postback
seems a bit confusing now—we’ll use it more in upcoming chapters,
so if it doesn’t yet, it should make sense after a few more practical
examples.
Formatting Controls with CSS
HTML was deliberately designed
to pay little attention to the specifics of how particular items on a page
were rendered. It is left up to the individual browser to work out these intricacies,
and tailor the output to the limitations and strengths of the user’s
machine. While we can change font styles, sizes, colors, and so on using HTML
tags, this is a practice that can lead to verbose code and pages that are
very hard to restyle at a later date.
The Cascading Style Sheets (CSS) language aims
to provide the degree of control, flexibility, and pizzazz that modern Web
designers seek. It’s a standard that’s widely supported by all
the popular browsers, in its oldest version (CSS1) at the very least.
CSS is a powerful tool for Web developers because it gives us the power
to create one set of styles in a single sheet, and apply those styles to all
the pages in our Website. All the pages then use the same fonts, colors, and
sizes for the same sections, giving the site a consistent feel throughout.
Regardless of whether our site contains three pages or three hundred, when
we alter the styles in the style sheet, those changes are immediately applied
to all pages based on that style sheet.
Types of Styles and Style Sheets
There are
three different ways of associating styles to elements of a particular Web
page. I’ve already mentioned the first, and usually the best, which
is an external file:
External File
By placing your style
rules in an external style sheet, you can link this one file to
any Web pages where you want those styles to be used. This makes updating
a Website’s overall look a cakewalk.
Document Wide
Ratherthan having
an external sheet, you can place style rules for a page within a <style> tag
inside that page’s head element. The problem is that we can’t
then use those styles in another page without typing them in again, which
makes global changes to the entire site difficult to manage.
Inline
Inline styles allow us to set styles for a single
tag using the style attribute. For instance, we might create
a text box in regular HTML with a style attribute that
draws a border around the text box like so:
<input type="text"
style="border-style:groove" />
CSS style rules create styles that are applied to elements of a page
in one of two ways[4]:
Classes
Arguably the most popular way to use styles
within your pages, classes allow you to set up a custom style that will be
applied to any tag or control that has a class attribute that matches the
name of your custom style.
Tag Redefinition
Redefining a
tag affects the appearance of certain standard HTML tags. For instance, the <hr> tag
is generally given a width of 100% by default, but you could redefine the
tag in CSS to have a width of 50%.
Whether you’re building external, document-wide, or inline style
sheets, properties for classes and tag redefinitions use the same syntax.
To create a class within an external style sheet file, you’d use the
following syntax:
This would then be saved in a file with a .css extension,
such as styles.css, and linked into the Web Form with
the following line in the <head> tag of your document:
<link href="styles.css" rel="stylesheet" />
Similarly, to define a class within a document-wide style sheet, you
would use the following syntax:
For inline styles, simply add all properties to the tag in question
with the style attribute. Above, we’ve used the <span> tag,
but the principle remains the same for the other tags.
Now that you have a basic understanding of some of the fundamental concepts
behind CSS, let’s look at the different types of styles that can be
used within our ASP.NET applications.
Style Properties
There are
many different types of properties that you can modify using style sheets.
Below is a list of the common types:
Font
This category
provides you with the ability to format text level elements, including their
font face, size, decoration, weight, color, etc.
Background
This category allows you to customize backgrounds for objects and text. Modifying
these values gives you control over the color, image, and whether or not you
want to repeat an image.
Block
This category allows you to modify the spacing between paragraphs, lines of
text, and spaces between text and words.
Box
The box category
provides changes and customizations for tables. If you need to modify borders,
padding, spacing, and colors on a table, row, or cell, you can modify elements
within this category.
Border
This category lets you draw boxes of different colors, styles and thicknesses
around page elements.
List
This category allows
you to customize the way ordered and unordered lists are created.
Positioning
Modifying positioning allows you to move and position tags and controls freely.
These categories provide a list of what can generally be modified using
CSS. As we progress through the book, the many types of properties will become
evident.
The CssClass Property
Once you have defined a class in a style sheet (be it external or internal),
you’ll want to begin associating that class with elements in your Web
Forms. You
can associate classes with ASP.NET Web controls using the CssClass property.
The following example uses classes defined within a document-wide style sheet:
A Navigation Menu and Web Form for the Intranet Application
Now that you have a solid foundation in HTML controls, Web Forms, Web
controls, Page Interaction, Navigation, and Style Sheets, you’re ready
to begin working on the project that we’ll build on throughout the remainder of this
book. With the Dorknozzle Intranet Application, I hope
to introduce you to real world development in simple stages, as we work through
the following chapters together.
Introducing the Dorknozzle Intranet Application
While most books give you a series of simple, isolated examples to illustrate
particular techniques, this book is a little different. Many of the examples
provided in these pages will involve work on a single project—an intranet
application for the fictional Dorknozzle company. We’ll build on this
application as we go along, illustrating the many different concepts that
are important to developers of any type of Web application. The intranet application
we’ll develop will offer the following functionality:
Welcome
Displays company event information to the user of the Web application.
Helpdesk
Allows any Dorknozzle employees to submit a problem as a helpdesk ticket
to an IT administrator regarding issues they experience with software, hardware,
or their computer.
Employee Store
Employee stores boost company morale. By building an online store, we’ll
allow Dorknozzle employees to buy life-enriching items such as mugs, shirts,
and mouse pads. All will proudly bear the Dorknozzle logo, of course!
Newsletter Archive
Another way to improve morale is to keep employees informed of company
events and news. Each month, the Dorknozzle HR Manager will send out a company
newsletter to all employees.
Employee Directory
Employees will likely want to call each other to discuss important,
company-related affairs… such as last night’s television viewing!
The employee directory should let employees find other staff members’
details.
Address Book
While the employee directory houses handy information for use by staff,
the purpose of the address book is to provide more detailed information about
all of the employees within the company
Admin Tools
Administrators will need a way to modify closed helpdesk tickets, delete
the records of fired employees, create newly hired employees’ profiles,
modify information on current employees, and more. The admin tools section
will provide the interface for this.
Before we can begin creating all these smaller applications, we must
build the framework that will act as a template across the site. In this section,
we’ll accomplish the following introductory tasks for the development
of our intranet application:
Build the navigation menu.
Create the style sheet.
Design the template and Web Form for the helpdesk application.
Building the Navigation Menu
Once it’s
complete, our fictitious intranet application will have modules for an IT
helpdesk, employee store, newsletter archive, employee directory, address
book, and admin console. Obviously, we’re going to need some kind of
navigation menu to make those sub-applications simple to find. Throughout
this chapter, we’ve studied numerous ways of navigating from page to
page, and we could use any of these methods here. We’ve discussed controls
such as the Button control, HyperLink control,
and LinkButton control, and we’ve explored various
objects and methods for navigating from code. Although all these would work
to a certain degree, in this case, only one makes the most sense in terms
of performance and practicality.
Before we begin, you’ll want to obtain the necessary files from
the code archive for this book. The files for this chapter include a starting
template that you can use for this project, as well as the complete version
in case you run into problems.
Because we’re not submitting any data for processing, we can eliminate
the Button and LinkButton controls;
each involves extra work from the server in order to process the Click event
it raises. As we only want to link from one page to the next, and don’t
care about performing any tasks programmatically, we can use the simpler HyperLink control instead. Remember, we add a HyperLink control
to the page by inserting the following code inside the form:
This would add a link that showed the text “Home.”
Open up your text editor and create a new file with the standard HTML
tags required by ASP.NET pages, including an empty form with a runat="server" attribute.
Inside this form, add the HyperLink controls for helpdesk,
employee store, newsletter archive, employee directory, address book, and
admin tools, like so:
Once the links have been added to the page and you’ve placed the book_closed.gif file
in a subdirectory called Images, you could save your
work (as index.aspx) and
view the results in your browser. At this stage, however, it would look fairly
bland. What we need is a few pretty graphics to provide visual appeal!
Although modern Web design practices would have us use CSS for our page layout
and visual design, we’ll resort to HTML tables here in order to stay
focused on the server-side aspects of our application.
Open index.aspx and create the following two regular
(i.e. not server-side) HTML tables at the very start of the page body:
We’ll want to place our links in a table too. While we’re
there, we’ll add some news items to the main index page. Open up index.aspx once
more, and place the following HTML table around the links we’ve already
added:
Figure 4.7. Add HyperLink controls for the Intranet navigation
menu.
Isn’t it amazing the difference some well-chosen graphics can
make? Don’t forget to place the pictures from the download in the Images subdirectory.
You can, of course, find the completed source in the code archive, although
I do recommend you type the code in yourself as we progress, for practice
value.
Create the Corporate Style Sheet
If you don’t mind
the ordinary look of standard Web pages, then you can skip this section. If,
however, you don’t like standard blue hyperlinks, black, Times New Roman
text, and beveled form controls, this section is for you.
As you’ve already read, style sheets provide developers with flexibility
and control over the "look" of Web applications. In this section, we’ll
explore the addition of a customizable style sheet to our fictitious intranet
application. We will define styles for the following elements within our application:
Hyperlinks
Text (including body text and headings)
Boxed controls (including text boxes and drop-down menus)
You can start by creating the CSS file that the styles will reside in.
I’ve opened Notepad and immediately saved the file as styles.css within
the root directory of the application, as shown in Figure 4.8.
Figure 4.8. Open Notepad and save the file as styles.css within
the root directory of the application folder.
Now, let’s apply some style properties to the following tags:
body
p
h1
a:link
a:hover
You’ll notice the a:link and a:hover items in this list, which are not strictly-speaking
tags. In the world of CSS, these are known as a pseudo-elements. a:link narrows
the selection to <a> tags that are links (as opposed to <a
name="…"> tags, which are targets). Assigning properties
to a:hover will apply those properties only to links over
which the user is hovering the mouse.
We’ll also define a few classes for certain Web controls that
don’t map directly to a particular HTML tag:
.textbox
For <asp:TextBox> controls,
which become <input type="text"> and <textarea> tags
when sent to the browser.
.button
For <asp:Button> controls,
which become <input type="button">, <input
type="submit">, and <input type="reset"> tags.
.dropdownmenu
For <asp:DropDownList> controls,
which become <select> tags.
Below is the code for the CSS rules that will apply the desired basic
formatting to our site. Type the following just as it appears into your styles.css file:
Now that the style sheet file has been created, we can link the style
sheet file to index.aspx by inserting the following line
into the <head> tag of the document:
<link href="styles.css" rel="stylesheet" />
We’ll need to assign the CSS classes we have defined (textbox, button,
and dropdownmenu) to relevant controls as we create them,
but for now our simple HTML template will automatically benefit from the tags
we have redefined.
Remember, we’re not limited to these styles. If, throughout the
development of our application, we decide to add more styles, we’ll
simply need to open the styles.css file and add them
as necessary.
You can save your work at this point, and view it in the browser.
Design the Web Form for the Helpdesk Application
The last part of the project is to add the employee
Helpdesk request Web Form. This will be a Web page that allows our fictitious
employees to report hardware, software, and workstation problems. The Web
Form will be arranged as a series of simple steps that users can follow to
report their problems:
Pick from a predefined category of potential problem areas.
(DropDownList control)
Pick from predefined subjects within the categories. (DropDownList control)
Type a description of the problem. (Multiline TextBox control)
Submit the request. (Button control)
Rather than creating a new, blank page and retyping all the code, you
can simply copy index.aspx and rename it helpdesk.aspx (or save a copy with the new name if it’s already open
in your editor). The only portion of the code that will change to accommodate
the HelpDesk interface is the last table in the body—the one that contains
the news items on index.aspx. Everything else stays the
same, because we want to have a single look for all our pages[5]. Change the final column in the table to create two drop-down
lists, a multiline text box, and a button, as shown:
Notice how we’ve applied our CSS classes to the appropriate controls
here.
Don’t worry that the DropDownList controls
don’t have items associated with them—the categories and subjects
will be predefined within database tables. Later, we’ll bind these database
tables to their respective controls.
When you’re finished, save your work and view it in a browser.
Summary
In this chapter, we discussed HTML controls, Web Forms, and Web controls.
We also explored how to link between pages, and how to add style to controls.
You even built your first project, putting together the information you’ve
learned in this and previous chapters.
Your Web application efforts will focus predominantly on Web controls.
In the next chapter, we’ll learn how to check user input on those Web
controls through the use of the ASP.NET validation controls.
[4] This is, to some extent, a simplified view
of how CSS works. For the complete story, refer to HTML Utopia:
Designing Without Tables Using CSS (SitePoint, ISBN 0-9579218-2-9).
[5] We’ll
see better ways to do this in later chapters…