Home > Articles > Programming > ASP .NET

Programming an ASP.NET Application: Changes from ASP.old

Programming an ASP.NET application is significantly different than programming in ASP.old. Jeffrey McManus and Chris Kinsman discuss the three categories of changes in ASP.NET: the control model, the event model, and the separation of code from presentation.
This chapter is from the book

In This Chapter

  • ASP.NET's Control Model

  • Separating Presentation from Code Using Code Behind

  • Programming HTML Controls

  • Attributes of the Page Object

  • Creating User Interfaces with Web Controls

  • Server Controls and Page Object Reference

Programming an ASP.NET application is significantly different than programming in ASP.old. The difference can be likened to the change that occurred when moving from QuickBasic programming to Visual Basic programming.

The changes in ASP.NET can be broken down into three categories: the control model, the event model, and the separation of code from presentation.

ASP.NET's Control Model

In QuickBasic, your code dealt with the screen as a long piece of paper to which you sent output. You may have used screen libraries that encapsulated a lot of this functionality and made it a much higher-level operation with better positioning.

With the advent of Visual Basic, you moved into a world of reusable controls. You designed your UI by dragging and dropping controls onto a design surface instead of outputting text to the screen or drawing polygons.

These controls were objects that had methods and properties that were used to customize their display and functionality. ASP.old was in many ways similar to QuickBasic. The entire page was essentially treated as a long piece of paper onto which your code placed content. No object model gives you access to the HTML that surrounds your code—just a way for you to output additional HTML based on the location of your code.

ASP.NET changes this by introducing the concept of server controls. If you used Visual Interdev to create ASP.old Web applications, you may be thinking, "Great! They just renamed those onerous design-time controls!" This is not the case. Server controls are not design-time controls in another guise. Nor do server controls require any particular type of client—in other words, server controls aren't ActiveX Controls or client-side behaviors. Server controls are a high-level abstraction of functionality utilized during page execution to place user-interface elements onto the page.

Let's take a look at this. Listing 3.1 shows the HTML for a traditional ASP.old form.

Listing 3.1 A Simple ASP.old Page, SimplePage.asp

<html>
<head>
  <title>SimplePage.asp</title>
</head>


<body>
  <form name="WebForm1" method="post">
<p>
<table border=0>
  <tr>
   <td>Name:</td>   <td><input type=text name=txtName></td>
   <td>
    <input type=submit name=Button1 Value="Send">
   </td>
  </tr>
  <tr>
   <td valign=top>Hobby:</td>
   <td>
    <select name=lbHobbies Multiple>
    <option Value="Ski">Ski</option>
    <option Value="Bike">Bike</option>
    <option Value="Swim">Swim</option>
   </select>
   </td>
   <td>&nbsp;</td>
  </tr>
</table>
</p>
  </form>
</body>
</html>

What happens when a user fills in a name, chooses a hobby, and presses the Send button? The page is first posted back to the server. No code is in the form at this point, so all the selections that the user made in the Select tag (information that we'll refer to as form state) is lost. The page is then returned back to the browser. In ASP.old, if you want to preserve the form state, you are forced to write code to do that.

Listing 3.2 contains SimplePage2.asp showing the typical code you would write with ASP.old to make this work.

Listing 3.2 SimplePage2.asp Showing Code to Preserve Form State in ASP.old

<html>
<head>
    <title>SimplePage.asp</title>
</head>

<SCRIPT LANGUAGE="VBScript" RUNAT=SERVER>
    function IsOptionSelected(strControlName, strOption)
        for iCount = 1 to Request(strControlName).Count
          if request(strControlName)(iCount) = strOption then
        response.write " SELECTED "
      end if
    next
  end function

</SCRIPT>

<body>
  <form name="WebForm1" method="post">
    <p>
    <table border=0>
      <tr>
        <td>Name:</td>
        <td><input type=text name=txtName 
          value="<% = Request("txtName") %>"></td>
        <td><input type=submit name=Button1 Value="Send"></td>
      </tr>
      <tr>
        <td valign=top>Hobby:</td>
        <td>
          <select name=lbHobbies Multiple>
            <option <% IsOptionSelected "lbHobbies", "Ski" %> 
               Value="Ski">Ski</option>
            <option <% IsOptionSelected "lbHobbies", "Bike" %> 
               Value="Bike">Bike</option>
            <option <% IsOptionSelected "lbHobbies", "Swim" %> 
               Value="Swim">Swim</option>
          </select>
        </td>
        <td>&nbsp;</td>
      </tr>
    </table>
    </p>
  </form>
</body>
</html>

With the advent of server controls, ASP.NET adds functionality to HTML's own user-interface controls, making them do what you would expect them to do; that is, save the data that the user just spent time typing in.

You need to do three things to make ASP.NET server controls work.

  1. ASP.NET server controls are identified using the ID attribute instead of (or in addition to) the Name attribute. You are allowed to use both. You may want to use the Name attribute if you have client-side script that needs to refer to the control.

  2. ASP.NET server controls require you to add the runat=server attribute. This attribute indicates to ASP.NET that the tag is something more than a built-in HTML tag.

  3. ASP.NET server controls require a closing tag. Server controls are implemented using XML namespaces and, like XML, require every element to have a matching closing element. You can use XML style syntax as a shortcut creating a tag such as <input type=text runat=server />.

So let's do this to the code that was in Listing 3.1. Listing 3.3 shows simplepage.aspx, an ASP.NET implementation of simplepage.asp.

Listing 3.3 SimplePage.aspx—A Reworking of Listing 3.1 in ASP.NET

<html>
<head>
  <title>SimplePage.aspx</title>
</head>

<body>
  <form id="WebForm1" method="post" runat="server">
<p>
<table border=0>
  <tr>
   <td>Name:</td>
   <td><input type=text id=txtName runat=server /></td>
   <td><input type=submit id=Button1 Value="Send" runat=server />
   </td>
  </tr> 
  <tr>
   <td valign=top>Hobby:</td>
   <td>
    <select id=lbHobbies Multiple runat=server>
    <option Value="Ski">Ski</option>
    <option Value="Bike">Bike</option>
    <option Value="Swim">Swim</option>
   </select>
  </td>
  <td>&nbsp;</td>
  </tr>
</table>
</p>
  </form>
</body>
</html>

All that's changed is the addition of the runat=server attribute to the form tag, the input tag, and the select tag. We've also changed each of the name attributes to ID attributes. That's it. If you run this page, fill in a name, select a hobby, and then click the Send button. The data that you entered stays there after the page is destroyed and re-created on its round trip to the server. The server controls realize that the desired default behavior is to maintain input; that is, they maintain their state, and they do so automatically.

If you don't want a given server control to maintain its state, you can use a new attribute with any server control called EnableViewState. By setting this to false, you can override the default behavior of maintaining form state across posts.

Two categories of server controls are HTML controls and Web controls. The HTML controls mirror their HTML counterparts. HTML controls include the following:

HTML Control Class

HTML Tag

HtmlAnchor

<a href="...">Anchor</a>

HtmlButton

<button />

HtmlContainerControl

Any control that requires a closing tag

HtmlControl

Any Html server control

HtmlForm

<form></form>

HtmlGenericControl

-Represents any HTML tag without a specific server control class. For example, <p>.

HtmlImage

<image href="..." />

HtmlInputButton

<input type=Button />

HtmlInputCheckBox

<input type=Checkbox />

HtmlInputControl

Any <input type=* /> control

HtmlInputFile

<input type=file />

HtmlInputHidden

<input type=hidden />

HtmlInputImage

<input type=image />

HtmlInputRadioButton

<input type=Radio />

HtmlInputText

<input type=Text />

HtmlSelect

<select>...</select>

HtmlTable

<table>...</table>

HtmlTableCell

<td>...</td>

HtmlTableCellCollection

All <TD> or <TH> tags within <table>...</table>

HtmlTableRow

<tr>...</tr>

HtmlTableRowCollection

All <TR> tags within <table>...</table>

HtmlTextArea

<textarea>...</textarea>


Note

All these tags require the runat=server attribute to make them HTML controls. If you forget to add this attribute, these controls will be treated as normal HTML tags. They will be programmable only via client-side code, which may not be what you want.

These controls wrap the related HTML tag with a complete object model that allows access to all the attributes of the tag via properties or methods. You'll see examples of this later in this chapter.

Web controls don't always map directly to a single HTML tag. In many cases they are composite controls that represent a large number of HTML tags. Let's take a look at an example. Listing 3.4 shows the Calendar Web control.

Listing 3.4 Calendar.aspx Showing a Single Web Control

<html>
<head>
  <title>Calendar.aspx</title>
</head>

<body>
  <form id="WebForm1" method="post" runat="server">
    <asp:calendar id=Calendar1 runat=server />
  </form>
</body>
</html>

Save this file as Calendar.aspx, and that's it. But that one HTML tag generates something that looks like Figure 3.1.

Figure 3.1 The output of Calendar.aspx from Listing 3.4.

That looks like more than just a single HTML tag. In fact, it is. When the page is "rendered," or sent to the client, the control replaces the <asp:calendar runat="server" /> with the HTML that represents a monthly calendar. If you think about it, this makes sense. A browser has no idea what to do with the <asp:calendar> tag. HTML dictates that browsers ignore tags they don't understand. But you don't want the browser to ignore the tag; you want the browser to display a calendar rendered in HTML. So before the page is sent back to the browser, ASP.NET renders the calendar in HTML for you.

If you view the source of the page after it is rendered in the browser, you should get something that looks like Listing 3.5.

Listing 3.5 The Rendered HTML Source for the Calendar Control Shown in Figure 3.1

<html>
<head>
  <title>Calendar.aspx</title>
</head> 

<body>
  <form name="WebForm1" method="post" action="calendar.aspx" id="WebForm1">
<input type="hidden" name="__VIEWSTATE" value="dDw1MzYzNjkxODU7Oz4=" />

    <table id="Calendar1" cellspacing="0" cellpadding="2" border="0" 
style="border-width:1px;border-style:solid;border-collapse:collapse;">
  <tr><td colspan="7" style="background-color:Silver;">
    <table cellspacing="0" border="0" style="width:100%;border-collapse:collapse;">
      <tr><td style="width:15%;">
        <a href="javascript:__doPostBack('Calendar1','prevMonth')" style="color:Black">&lt;</a>
      </td><td align="Center" style="width:70%;">
        August 2001
      </td><td align="Right" style="width:15%;">
        <a href="javascript:__doPostBack('Calendar1','nextMonth')" style="color:Black">&gt;</a>
      </td></tr>
    </table>
  </td></tr><tr><td align="Center">
  Sun
</td><td align="Center">
  Mon
</td><td align="Center">
  Tue
</td><td align="Center">
  Wed
</td><td align="Center">
  Thu
</td><td align="Center">
  Fri
</td><td align="Center">
  Sat
</td></tr><tr><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay0')" style="color:Black">29</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay1')" style="color:Black">30</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay2')" style="color:Black">31</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay3')" style="color:Black">1</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay4')" style="color:Black">2</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay5')" style="color:Black">3</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay6')" style="color:Black">4</a>
</td></tr><tr><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay7')" style="color:Black">5</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay8')" style="color:Black">6</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay9')" style="color:Black">7</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay10')" style="color:Black">8</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay11')" style="color:Black">9</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay12')" style="color:Black">10</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay13')" style="color:Black">11</a>
</td></tr><tr><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay14')" style="color:Black">12</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay15')" style="color:Black">13</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay16')" style="color:Black">14</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay17')" style="color:Black">15</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay18')" style="color:Black">16</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay19')" style="color:Black">17</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay20')" style="color:Black">18</a>
</td></tr><tr><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay21')" style="color:Black">19</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay22')" style="color:Black">20</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay23')" style="color:Black">21</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay24')" style="color:Black">22</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay25')" style="color:Black">23</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay26')" style="color:Black">24</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay27')" style="color:Black">25</a>
</td></tr><tr><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay28')" style="color:Black">26</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay29')" style="color:Black">27</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay30')" style="color:Black">28</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay31')" style="color:Black">29</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay32')" style="color:Black">30</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay33')" style="color:Black">31</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay34')" style="color:Black">1</a>
</td></tr><tr><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay35')" style="color:Black">2</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay36')" style="color:Black">3</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay37')" style="color:Black">4</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay38')" style="color:Black">5</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay39')" style="color:Black">6</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay40')" style="color:Black">7</a>
</td><td align="Center" style="width:14%;">
  <a href="javascript:__doPostBack('Calendar1','selectDay41')" style="color:Black">8</a>
</td></tr>
</table>
  
<input type="hidden" name="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" value="" />
<script language="javascript">
<!--
  function __doPostBack(eventTarget, eventArgument) {
    var theform = document.WebForm1;
    theform.__EVENTTARGET.value = eventTarget;
    theform.__EVENTARGUMENT.value = eventArgument;
    theform.submit();
  }
// -->
</script>
</form>
</body>
</html>

Wow! That is quite a change. Notice that in Listing 3.5, you won't find <asp:calendar> anywhere. In fact you won't even find a runat=server! This stuff is of interest only to the server, so it is all stripped out of the page during the rendering process. What is rendered in this case is a combination of HTML and JavaScript.

However, the code on the server is concerned only with the Calendar control. You can programmatically access the code using its name (Calendar1). You can also get the date selected by the user by retrieving the SelectedDate property of the control. The developer doesn't care about all the HTML and JavaScript gibberish the control creates; the control is always accessed as an object, with high-level properties and methods. This layer of abstraction is one of the things that makes Web controls so powerful.

ASP.NET ships with a large number of Web controls.

Web Control Class

HTML Tag

AdRotator

<asp:AdRotator .../>

BoundColumn

<asp:BoundColumn .../>

Button

<asp:Button .../>

ButtonColumn

<asp:ButtonColumn .../>

Calendar

<asp:Calendar .../>

CheckBox

<asp:CheckBox .../>

CheckBoxList

<asp:CheckBoxList .../>

CompareValidator

<asp:CompareValidator .../>

CustomValidator

<asp:CustomValidator .../>

DataGrid

<asp:DataGrid .../>

DataList

<asp:DataList .../>

DropDownList

<asp:DropDown .../>

HyperLink

<asp:Hyperlink .../>

Image

<asp:Image .../>

ImageButton

<asp:ImageButton .../>

Label

<asp:Label .../>

LinkButton

<asp:LinkButton .../>

ListBox

<asp:ListBox .../>

ListControl

Any list control

ListItem

<asp:ListItem .../>

Panel

<asp:Panel .../>

PlaceHolder

<asp:PlaceHolder .../>

RadioButton

<asp:RadioButton .../>

RadioButtonList

<asp:RadioButtonList .../>

RangeValidator

<asp:RangeValidator .../>

RegularExpressionValidator

<asp:RegularExpressionValidator .../>

Repeater

<asp:Repeater .../>

RequiredFieldValidator

<asp:RequiredFieldValidator .../>

Table

<asp:Table .../>

TableCell

<asp:TableCell .../>

TableRow

<asp:TableRow .../>

TextBox

<asp:TextBox .../>

Xml

<asp:Xml .../>


For more information about each of these individual controls, see the control reference later in the chapter.

ASP.NET Is Event Driven

Prior to Visual Basic, programs were written in a top-down fashion. That is, a program started executing at the top and continued down through the bottom with the potential exception of subroutine or function calls. All that changed with the advent of Visual Basic and the concept of event-driven programming. No longer were programs written in a top–to-bottom fashion. Instead, code was broken up into small blocks that reacted to events. These event handlers would then do the work in response to how the user interacted with the UI. Event-driven programming made things much easier for the programmer because it became possible to worry less about the order in which things occurred and more about how they actually worked.

ASP.NET again parallels this change. In ASP.old, programs were written to start execution at the top of the page and continue down to the bottom of the page. Again, a few exceptions existed—for example, calls to subroutines or functions. ASP.NET, however, moves the ASP programmer into the world of event-driven programming. Event handlers are written that correspond to the user's interaction with the UI. These event handlers perform all the work.

Let's use the SimplePage example from the previous section to illustrate this. After the Send button is pressed, we want to output some information about the selected items. Listing 3.6 shows the typical way this would have been done in ASP.old.

Listing 3.6 SimplePage3.asp—A Typical Way to React to User Interaction in ASP.old

<html>
<head>
  <title>SimplePage3.asp</title>
</head>

<SCRIPT LANGUAGE="VBScript" RUNAT=SERVER>
  function IsOptionSelected(strControlName, strOption)
    for iCount = 1 to Request(strControlName).Count
      if request(strControlName)(iCount) = strOption then
        response.write " SELECTED "
      end if
    next
  end function

</SCRIPT>

<body>
  <form name="WebForm1" method="post">
    <p>
    <table border=0>
      <tr>
        <td>Name:</td>
        <td><input type=text name=txtName 
          value="<% = Request("txtName") %>"></td>
        <td><input type=submit name=Button1 Value="Send"></td>
      </tr>
      <tr>
        <td valign=top>Hobby:</td>
        <td>
          <select name=lbHobbies Multiple>
            <option <% IsOptionSelected "lbHobbies", "Ski" %> 
              Value="Ski">Ski</option>
            <option <% IsOptionSelected "lbHobbies", "Bike" %> 
              Value="Bike">Bike</option>
            <option <% IsOptionSelected "lbHobbies", "Swim" %> 
              Value="Swim">Swim</option>
          </select>
        </td>
        <td>&nbsp;</td>
      </tr>
    </table>
    <% If Request("Button1") ="Send" Then %>
      Name: <% = Request("txtName") %><BR>
      Hobby:
      <%
      For iCount = 1 to Request("lbHobbies").Count
        Response.Write Request("lbHobbies")(iCount) + ", "
      Next
      %>
    <% End If %>
    </p>
  </form>
</body>
</html>

At the bottom of the form, the code checks to see if the Send button contributed its value to the form value collection. If the value is there, work needs to be done, so it displays the data that was entered into the form. This code gets quite complex as the number of buttons and other items that the user interacts with increases.

Let's take a look at this same code in ASP.NET. Instead of executing top to bottom, we set up an event handler. Listing 3.7 shows the same page in ASP.NET. The controls have been replaced with Web controls, and an event handler named Button1_Click has been created. The event handler is connected to the code it runs by adding the onclick="..." attribute to the button control. This connects the button to the event handler.

Listing 3.7 SamplePage2.aspx Showing an Event Handler for Button1

<html>
<head>
  <title>SimplePage2.aspx</title>
</head>

<script language="VB" runat=server>
  public sub Button1_Click(ByVal sender as Object, ByVal e as EventArgs)
    Dim strTemp as String
    Dim iCount as Integer
  
    ' Build up the output
    strTemp = "Name:" + txtName.Text + "<BR>Hobbies: " 
    for iCount = 0 to lbHobbies.Items.Count - 1
      if lbHobbies.Items(iCount).Selected Then
        strTemp = strTemp + lbHobbies.Items(iCount).Text + ", "
      end if
    Next
    
    ' Place it into the label that was waiting for it
    lblOutput.Text = strTemp
  end sub
</script>

<body>
  <form id="WebForm1" method="post" runat="server">
    <p>
    <table border=0>
      <tr>
        <td>Name:</td>
        <td><asp:textbox type=text id=txtName runat=server /></td>
        <td><asp:button id=Button1 Text="Send" runat=server 
             onclick="Button1_Click" /></td>
      </tr> 
      <tr>
        <td valign=top>Hobby:</td>
        <td>
          <asp:listbox id=lbHobbies SelectionMode="Multiple" 
           runat=server>
            <asp:listitem Value="Ski">Ski</asp:listitem>
            <asp:listitem Value="Bike">Bike</asp:listitem>
            <asp:listitem Value="Swim">Swim</asp:listitem>
          </asp:listbox>
        </td>
        <td>&nbsp;</td>
      </tr>
    </table>
    </p>
    <asp:label id=lblOutput runat=server />
  </form>
</body>
</html>

The Button control in this example fires only a single event. Some more complex controls such as the Calendar control have the capability to fire several events.

InformIT Promotional Mailings & Special Offers

I would like to receive exclusive offers and hear about products from InformIT and its family of brands. I can unsubscribe at any time.

Overview


Pearson Education, Inc., 221 River Street, Hoboken, New Jersey 07030, (Pearson) presents this site to provide information about products and services that can be purchased through this site.

This privacy notice provides an overview of our commitment to privacy and describes how we collect, protect, use and share personal information collected through this site. Please note that other Pearson websites and online products and services have their own separate privacy policies.

Collection and Use of Information


To conduct business and deliver products and services, Pearson collects and uses personal information in several ways in connection with this site, including:

Questions and Inquiries

For inquiries and questions, we collect the inquiry or question, together with name, contact details (email address, phone number and mailing address) and any other additional information voluntarily submitted to us through a Contact Us form or an email. We use this information to address the inquiry and respond to the question.

Online Store

For orders and purchases placed through our online store on this site, we collect order details, name, institution name and address (if applicable), email address, phone number, shipping and billing addresses, credit/debit card information, shipping options and any instructions. We use this information to complete transactions, fulfill orders, communicate with individuals placing orders or visiting the online store, and for related purposes.

Surveys

Pearson may offer opportunities to provide feedback or participate in surveys, including surveys evaluating Pearson products, services or sites. Participation is voluntary. Pearson collects information requested in the survey questions and uses the information to evaluate, support, maintain and improve products, services or sites, develop new products and services, conduct educational research and for other purposes specified in the survey.

Contests and Drawings

Occasionally, we may sponsor a contest or drawing. Participation is optional. Pearson collects name, contact information and other information specified on the entry form for the contest or drawing to conduct the contest or drawing. Pearson may collect additional personal information from the winners of a contest or drawing in order to award the prize and for tax reporting purposes, as required by law.

Newsletters

If you have elected to receive email newsletters or promotional mailings and special offers but want to unsubscribe, simply email information@informit.com.

Service Announcements

On rare occasions it is necessary to send out a strictly service related announcement. For instance, if our service is temporarily suspended for maintenance we might send users an email. Generally, users may not opt-out of these communications, though they can deactivate their account information. However, these communications are not promotional in nature.

Customer Service

We communicate with users on a regular basis to provide requested services and in regard to issues relating to their account we reply via email or phone in accordance with the users' wishes when a user submits their information through our Contact Us form.

Other Collection and Use of Information


Application and System Logs

Pearson automatically collects log data to help ensure the delivery, availability and security of this site. Log data may include technical information about how a user or visitor connected to this site, such as browser type, type of computer/device, operating system, internet service provider and IP address. We use this information for support purposes and to monitor the health of the site, identify problems, improve service, detect unauthorized access and fraudulent activity, prevent and respond to security incidents and appropriately scale computing resources.

Web Analytics

Pearson may use third party web trend analytical services, including Google Analytics, to collect visitor information, such as IP addresses, browser types, referring pages, pages visited and time spent on a particular site. While these analytical services collect and report information on an anonymous basis, they may use cookies to gather web trend information. The information gathered may enable Pearson (but not the third party web trend services) to link information with application and system log data. Pearson uses this information for system administration and to identify problems, improve service, detect unauthorized access and fraudulent activity, prevent and respond to security incidents, appropriately scale computing resources and otherwise support and deliver this site and its services.

Cookies and Related Technologies

This site uses cookies and similar technologies to personalize content, measure traffic patterns, control security, track use and access of information on this site, and provide interest-based messages and advertising. Users can manage and block the use of cookies through their browser. Disabling or blocking certain cookies may limit the functionality of this site.

Do Not Track

This site currently does not respond to Do Not Track signals.

Security


Pearson uses appropriate physical, administrative and technical security measures to protect personal information from unauthorized access, use and disclosure.

Children


This site is not directed to children under the age of 13.

Marketing


Pearson may send or direct marketing communications to users, provided that

  • Pearson will not use personal information collected or processed as a K-12 school service provider for the purpose of directed or targeted advertising.
  • Such marketing is consistent with applicable law and Pearson's legal obligations.
  • Pearson will not knowingly direct or send marketing communications to an individual who has expressed a preference not to receive marketing.
  • Where required by applicable law, express or implied consent to marketing exists and has not been withdrawn.

Pearson may provide personal information to a third party service provider on a restricted basis to provide marketing solely on behalf of Pearson or an affiliate or customer for whom Pearson is a service provider. Marketing preferences may be changed at any time.

Correcting/Updating Personal Information


If a user's personally identifiable information changes (such as your postal address or email address), we provide a way to correct or update that user's personal data provided to us. This can be done on the Account page. If a user no longer desires our service and desires to delete his or her account, please contact us at customer-service@informit.com and we will process the deletion of a user's account.

Choice/Opt-out


Users can always make an informed choice as to whether they should proceed with certain services offered by InformIT. If you choose to remove yourself from our mailing list(s) simply visit the following page and uncheck any communication you no longer want to receive: www.informit.com/u.aspx.

Sale of Personal Information


Pearson does not rent or sell personal information in exchange for any payment of money.

While Pearson does not sell personal information, as defined in Nevada law, Nevada residents may email a request for no sale of their personal information to NevadaDesignatedRequest@pearson.com.

Supplemental Privacy Statement for California Residents


California residents should read our Supplemental privacy statement for California residents in conjunction with this Privacy Notice. The Supplemental privacy statement for California residents explains Pearson's commitment to comply with California law and applies to personal information of California residents collected in connection with this site and the Services.

Sharing and Disclosure


Pearson may disclose personal information, as follows:

  • As required by law.
  • With the consent of the individual (or their parent, if the individual is a minor)
  • In response to a subpoena, court order or legal process, to the extent permitted or required by law
  • To protect the security and safety of individuals, data, assets and systems, consistent with applicable law
  • In connection the sale, joint venture or other transfer of some or all of its company or assets, subject to the provisions of this Privacy Notice
  • To investigate or address actual or suspected fraud or other illegal activities
  • To exercise its legal rights, including enforcement of the Terms of Use for this site or another contract
  • To affiliated Pearson companies and other companies and organizations who perform work for Pearson and are obligated to protect the privacy of personal information consistent with this Privacy Notice
  • To a school, organization, company or government agency, where Pearson collects or processes the personal information in a school setting or on behalf of such organization, company or government agency.

Links


This web site contains links to other sites. Please be aware that we are not responsible for the privacy practices of such other sites. We encourage our users to be aware when they leave our site and to read the privacy statements of each and every web site that collects Personal Information. This privacy statement applies solely to information collected by this web site.

Requests and Contact


Please contact us about this Privacy Notice or if you have any requests or questions relating to the privacy of your personal information.

Changes to this Privacy Notice


We may revise this Privacy Notice through an updated posting. We will identify the effective date of the revision in the posting. Often, updates are made to provide greater clarity or to comply with changes in regulatory requirements. If the updates involve material changes to the collection, protection, use or disclosure of Personal Information, Pearson will provide notice of the change through a conspicuous notice on this site or other appropriate way. Continued use of the site after the effective date of a posted revision evidences acceptance. Please contact us if you have questions or concerns about the Privacy Notice or any objection to any revisions.

Last Update: November 17, 2020