Introduction to Microsoft ASP.NET ® Workbook Course Number: 2063B Part Number: X08-50211 Released: 09/2001 Information in this document, including URL and other Internet Web site references, is subject to change without notice. Unless otherwise noted, the example companies, organizations, products, domain names, e-mail addresses, logos, people, places, and events depicted herein are fictitious, and no association with any real company, organization, product, domain name, e-mail address, logo, person, places or events is intended or should be inferred. Complying with all applicable copyright laws is the responsibility of the user. Without limiting the rights under copyright, no part of this document may be reproduced, stored in or introduc ed into a retrieval system, or transmitted in any form or by any means (electronic, mechanical, photocopying, recording, or otherwise), or for any purpose, without the express written permission of Microsoft Corporation. Microsoft may have patents, patent applications, trademarks, copyrights, or other intellectual property rights covering subject matter in this document. Except as expressly provided in any written license agreement from Microsoft, the furnishing of this document does not give you any license to these patents, trademarks, copyrights, or other intellectual property. 2001 Microsoft Corporation. All rights reserved. Microsoft, MS-DOS, Windows, Windows NT, ActiveX, FrontPage, IntelliSense, Jscript, Outlook, PowerPoint, Visual Basic, Visual InterDev, Visual C++, Visual C#, Visual Studio, and Windows Media are either registered trademarks or trademarks of Microsoft Corporation in the U.S.A. and/or other countries. The names of actual companies and products mentioned herein may be the trademarks of their respective owners. Course Number: 2063B Part Number: X08-50211 Released: 09/2001 Introduction to Microsoft® ASP.NET Contents iii Introduction Course Materials ......................................................................................... 2 Prerequisites ............................................................................................... 3 Course Objectives........................................................................................ 4 Course Outline ................................ ................................ ............................ 5 Setup ......................................................................................................... 7 Lab Overview ............................................................................................. 8 Lab Demonstration .................................................................................... 11 Microsoft Certified Professional Program ..................................................... 13 Facilities................................................................................................... 15 Module 1: Working with Microsoft ASP.NET Overview................................ ................................ ................................ .... 1 Introducing ASP.NET .................................................................................. 2 Creating Web Forms................................ ................................ .................. 11 Adding ASP.NET Code to a Page ................................................................ 23 Handling Page Events ................................................................................ 30 Discussion: ASP vs. ASP.NET.................................................................... 35 Lab 1: Using ASP.NET to Output Text......................................................... 36 Review..................................................................................................... 42 Module 2: Using Web Controls Overview................................ ................................ ................................ .... 1 What Are Web Controls?.............................................................................. 2 Using Intrinsic Controls................................................................................ 4 Using Input Validation Controls ................................ ................................ .. 16 Selecting Controls for Applications .............................................................. 28 Lab 2: Using Web Controls ......................................................................... 29 Review..................................................................................................... 40 Module 3: Using Microsoft ADO.NET to Access Data Overview................................ ................................ ................................ .... 1 Overview of ADO.NET................................................................................ 2 Connecting to a Data Source....................................................................... 11 Accessing Data with DataSets..................................................................... 13 Using Stored Procedures............................................................................. 28 Lab 3: Using ADO.NET to Access Data....................................................... 37 Accessing Data with DataReaders................................................................ 46 Binding to XML Data ................................................................................ 53 Review..................................................................................................... 59 Module 4: Separating Code from Content Overview................................ ................................ ................................ .... 1 Advantages of Partitioning an ASP.NET Page................................................. 2 Creating and Using Code-Behind Pages.......................................................... 3 Creating and Using User Controls................................................................ 12 Creating and Using Components................................ ................................ .. 19 Lab 4: Separating Code from Content........................................................... 27 Review..................................................................................................... 39 iv Introduction to Microsoft® ASP.NET Module 5: Using Trace in Microsoft ASP.NET Pages Overview................................ ................................ ................................ .... 1 Overview of Tracing................................ ................................ .................... 2 Trace Information........................................................................................ 3 Page-Level Trace......................................................................................... 4 Application-Level Trace............................................................................. 10 Lab 5: Adding Trace to an ASP.NET Page.................................................... 16 Review..................................................................................................... 21 Module 6: Using Web Services Overview................................ ................................ ................................ .... 1 What Is a Web Service?................................................................................ 2 Calling a Web Service from a Browser ......................................................... 12 Calling a Web Service by Using a Proxy ...................................................... 15 Creating a Simple Web Service by Using Visual Basic ................................... 22 Creating and Calling a Web Service by Using Visual Studio .NET................... 26 Lab 6: Using Web Services ......................................................................... 35 Review..................................................................................................... 47 Module 7: Creating a Microsoft ASP.NET Web Application Overview................................ ................................ ................................ .... 1 Requirements of a Web Application ............................................................... 2 What Is New in ASP.NET?........................................................................... 3 Sharing Information Between Pages............................................................. 13 Securing an ASP.NET Application .............................................................. 24 Lab 7: Creating an ASP.NET Web Application ............................................. 38 Review..................................................................................................... 53 Introduction to Microsoft® ASP.NET v About This Course This section provides you with a brief description of the course, audience, suggested prerequisites, and course objectives. Description This three-day, instructor-led course exposes students to the features of Microsoft ® ASP.NET and gives them hands-on experience (practices and labs) in using and applying these features in their own Web applications. Audience This course is intended for Active Server Pages (ASP) Web developers. The course assumes that students are familiar with Hypertext Markup Language (HTML), client-side and server-side scripting, and Microsoft ActiveX® Data Objects (ADO). Student Prerequisites This course requires that students be able to do the following: n Create forms and tables in HTML n Write Microsoft Visual Basic ® or Visual Basic Scrip ting Edition (VBScript code) n Create an ASP page n Retrieve data from a relational database by using ADO The completion of the following courses will prepare the student to attend this course: n 1912A, Introduction to Web Development Technologies n 1017A, Mastering Web Application Development Using Microsoft Visual InterDev ® 6 Course Objectives After completing this course, students will be able to: n Create a Web form with server controls. n Separate page code from content with code-behind pages, page controls, and components. n Display dynamic data from a data source by using ADO.NET and data binding. n Debug ASP.NET pages by using trace. n Use a Web service to enhance a Web application. n Add configuration, authentication, and state management to an ASP.NET Web application. vi Introduction to Microsoft® ASP.NET Student Materials Compact Disc Contents The Student Materials compact disc contains the following files and folders: n Autorun.exe. When the CD is inserted into the CD-ROM drive, or when you double -click the autorun.exe file, this file opens the CD and allows you to browse the Student Materials CD or install Internet Explorer. n Default.htm. This file opens the Student Materials Web page. It provides you with resources pertaining to this course, including additional reading, review and lab answers, lab files, multimedia presentations, and courserelated Web sites. n Readme.txt. This file contains a description of the compact disc contents and setup instructions in ASCII format (that is, in plain text; not as a Microsoft Word document). n 2063B_ms.doc. This file is the Classroom Setup Guide. It contains a description of classroom requirements, classroom setup instructions, and the classroom configuration. n AddRead. This folder contains additional reading pertaining to this course. If there are no additional reading files, this folder does not appear. n Appendix. This folder contains appendix files for this course. If there are no appendix files, this folder does not appear. n Democode. This folder contains demonstration code. If there is no demonstration code, the Democode folder does not appear. n Flash. This folder contains the installer for the Macromedia Flash 5.0 browser plug-in. If there are no Flash animations in the course, this folder does not appear. n Fonts. This folder contains fonts that are required to view the Microsoft PowerPoint presentation and Web-based materials. n Labs. This folder contains files that are used in the hands-on labs. These files may be used to prepare the student computers for the hands-on labs. n Media. This folder contains files that are used in multimedia presentations for this course. If this course does not include any multimedia presentations, this folder does not appear. n Menu. This folder contains elements for autorun.exe. n Mplayer. This folder contains files that are required to install Microsoft Windows Media Player. n Practices. This folder contains files that are used in the hands-on practices. If there are no practices, the Practices folder does not appear. n Sampapps. This folder contains the sample applications associated with this course. If there are no associated sample applications, the Sampapps folder does not appear. n Sampcode. This folder contains sample code that is accessible through the Web pages on the Student Materials CD. If there is no sample code, the Sampcode folder does not appear. n Sampsite. This folder contains files that create the sample site associated with this course. If there is no sample site, the Sampsite folder does not appear. Introduction to Microsoft® ASP.NET vii n Webfiles. This folder contains the files that are required to view the course Web page. To open the Web page, open Windows Explorer, and in the root directory of the compact disc, double-click Default.htm or Autorun.exe. n Wordview. This folder contains the Word Viewer that is used to view any Word document (.doc) files that are included on the compact disc. If no Word documents are included, this folder does not appear. viii Introduction to Microsoft® ASP.NET Document Conventions The following conventions are used in course materials to distinguish elements of the text. Convention Use u Indicates an introductory page. This symbol appears next to a topic heading when additional information on the topic is covered on the page or pages that follow it. bold Represents commands, command options, and syntax that must be typed exactly as shown. It also indicates commands on menus and buttons, dialog box titles and options, and icon and menu names. italic In syntax statements or descriptive text, indicates argument names or placeholders for variable information. Italic is also used for introducing new terms, for book titles, and for emphasis in the text. Title Capitals Indicate domain names, user names, computer names, directory names, and folder and file names, except when specifically referring to case-sensitive names. Unless otherwise indicated, you can use lowercase letters when you type a directory name or file name in a dialog box or at a command prompt. ALL CAPITALS Indicate the names of keys, key sequences, and key combinations — for example, ALT+SPACEBAR. monospace Represents code samples or examples of screen text. [] In syntax statements, enclose optional items. For example, [filename] in command syntax indicates that you can choose to type a file name with the command. Type only the information within the brackets, not the brackets themselves. {} In syntax statements , enclose required items. Type only the information within the braces, not the braces themselves. | In syntax statements, separates an either/or choice. å Indicates a procedure with sequential steps. ... In syntax statements, specifies that the preceding item may be repeated. . . . Represents an omitted portion of a code sample. Introduction Contents Introduction 1 Course Materials Prerequisites 2 3 Course Objectives 4 Course Outline 5 Setup 7 Lab Overview 8 Lab Demonstration 11 Microsoft Certified Professional Program 13 Facilities 15 Information in this document, including URL and other Internet Web site references, is subject to change without notice. Unless otherwise noted, the example companies, organizations, products, domain names, e-mail addresses, logos, people, places, and events depicted herein are fictitious, and no association with any real company, organization, product, domain name, e-mail address, logo, person, places or events is intended or should be inferred. Complying with all applicable copyright laws is the responsibility of the user. Without limiting the rights under copyright, no part of this document may be reproduced, stored in or introduced into a retrieval system, or transmitted in any form or by any means (electronic, mechanical, photocopying, recording, or otherwise), or for any purpose, without the express written permission of Microsoft Corporation. Microsoft may have patents, patent applications, trademarks, copyrights, or other intellectual property rights covering subject matter in this document. Except as expressly provided in any written license agreement from Microsoft, the furnishing of this document does not give you any license to these patents, trademarks, copyrights, or other intellectual property. 2001 Microsoft Corporation. All rights reserved. Microsoft, MS-DOS, Windows, Windows NT, ActiveX, FrontPage, IntelliSense, Jscript, Outlook, PowerPoint, Visual Basic, Visual InterDev, Visual C++, Visual C#, Visual Studio, and Windows Media are either registered trademarks or trademarks of Microsoft Corporation in the U.S.A. and/or other countries. The names of actual companies and products mentioned herein may be the trademarks of their respective owners. Introduction Introduction n Name n Company Affiliation n Title/Function n Job Responsibility n HTML, Visual Basic Programming, ASP, ADO, and Database Experience n Expectations for the Course *****************************illegal for non-trainer use****************************** 1 2 Introduction Course Materials n Name Card n Student Workbook n Student Materials Compact Disc n Visual Studio .NET Beta 2 Compact Disc n Course Evaluation ************** ***************illegal for non-trainer use****************************** The following materials are included with your kit: n Name card. Write your name on both sides of the name card. n Student workbook. The student workbook contains the material covered in class, in addition to the hands-on lab exercises. n Student Materials compact disc. The Student Materials compact disc contains the Web page that provides you with links to resources pertaining to this course, including additional readings, review and lab answers, lab files, multimedia presentations, and course-related Web sites. Note To open the Web page, insert the Student Materials compact disc into the CD-ROM drive. Then, in the root directory of the compact disc, double click Autorun.exe or Default.htm. n Visual Studio .NET Beta 2 compact disc. The course is being shipped with the Visual Studio .NET Beta 2 compact disc because the course’s executable elements are compatible only with the Beta 2 version. The labs and demonstrations in the course will not run with the final version of ASP.NET. n Course evaluation. At the conclusion of this course, please complete the course evaluation to provide feedback about the instructor, course, and software product. Your comments will help us improve future courses. To provide additional comments or inquire about the Microsoft Certified Professional program, send e-mail to [email protected]. Introduction Prerequisites n Create forms and tables in HTML n Write Visual Basic or VBScript code n Create an Active Server Page n Retrieve data from a relational database using ADO *****************************illegal for non-trainer use****************************** This course requires that you meet the following prerequisites: n Create forms and tables in Hypertext Markup Language (HTML) n Write Microsoft® Visual Basic ® or Visual Basic Scripting Edition (VBScript code) n Create an Active Server Page (ASP) n Retrieve data from a relational database by using Microsoft ActiveX® Data Objects (ADO) 3 4 Introduction Course Objectives n Create a Web form with server controls n Separate page code from content with code-behind pages, user controls, and components n Display dynamic data from a data source using Microsoft ADO.NET and data binding n Debug ASP.NET pages using trace n Use a Web service to enhance a Web application n Add configuration, authentication, and state management to an ASP.NET Web application *********************** ******illegal for non-trainer use****************************** After completing this course, students will be able to: n Create a Web form with server controls. n Separate page code from content with code-behind pages, user controls, and components. n Display dynamic data from a data source by using Microsoft ADO.NET and data binding. n Debug ASP.NET pages using trace. n Use a Web service to enhance a Web application. n Add configuration, authentication, and state management to an ASP.NET Web application. Introduction 5 Course Outline n Module 1: Working with Microsoft ASP.NET n Module 2: Using Web Controls n Module 3: Using Microsoft ADO.NET to Access Data n Module 4: Separating Code from Content n Module 5: Using Trace in Microsoft ASP.NET Pages n Module 6: Using Web Services n Module 7: Creating a Microsoft ASP.NET Web Application *****************************illegal for non-trainer use****************************** Module 1, “Working with Microsoft® ASP.NET,”introduces the ASP.NET language. It provides an overview of the features of ASP.NET and introduces the execution model of ASP.NET. The module also shows how to add serverside code to the controls on a page. After completing this module, you will be able to add server controls and code to an ASP.NET page. Module 2, “Using Web Controls,” introduces the Web controls that are new with ASP.NET. You will learn what a Web control is, how to add it to an ASP.NET page, and how to access its properties, methods, and events. You will learn how to use input validation controls and the DataGrid control. After completing this module, you will be able to use Web controls in an ASP.NET page. Module 3, “Using Microsoft® ADO.NET to Access Data,” describes how to access data in an ASP.NET page by using ADO.NET. This module starts with an overview and then moves into the specifics of how to use ADO.NET. After completing this module, you will be able to access dynamic data from a data source by using ADO.NET. Module 4, “Separating Code from Content,”describes how to partition an ASP.NET page to separate out the code. You learn about the various methods that can be used to separate code from content, such as code-behind pages, user controls, and components. After completing this module, you will be able to create a code-behind page to hold code in an ASP.NET page. Module 5, “Using Trace in Microsoft® ASP.NET Pages,”demonstrates how to use the trace feature of ASP.NET to debug ASP.NET pages. Both page-level and application- level tracing are covered in the module. After completing this module, you will be able to debug ASP.NET pages by using the trace feature. 6 Introduction Module 6, “Using Web Services,”describes Web services and explains how they expand a Web developer’s toolbox. You will learn how to use a Web service and the code to create a simple Web service. After completing this module, you will be able to use a Web service to enhance your Web application. Module 7, “Creating a Microsoft ® ASP.NET Web Application,” describes the technologies in ASP.NET that are necessary for creating real-world Web applications, such maintaining state, global files, configuration and deployment, and security. After completing this module, you will be able to create an ASP.NET Web application by integrating ASP.NET pages. Introduction 7 Setup n Microsoft Windows 2000 Server l Internet Information Services 5.0 n Microsoft SQL Server 2000, Standard Edition n Microsoft Internet Explorer 5.5 n Microsoft Visual Studio .NET, Beta 2 n Microsoft .NET Framework SDK, Beta 2 n Lab and Demonstration Course Files *****************************illegal for non-trainer use****************************** The following software and resource materials will be used in the classroom: n Microsoft Windows ® 2000 Server n Internet Information Services 5.0 n Microsoft SQL Server 2000, Standard Edition n Microsoft Internet Explorer 5.5 n Microsoft Visual Studio .NET, Beta 2 n Microsoft .NET Framework software development kit (SDK), Beta 2 n Macromedia Flash player n Lab and Demonstration Course files Course Files There are starter and solution files associated with the labs in this course. The starter files are located in the folder <install folder>\Labs\Lab0x\Starter and the solution files for this lab are in the folder <install folder>\Labs\Lab0x\Solution, where Lab0x corresponds with the current lab. There are files associated with the demonstrations in this course. These files are located in the folder <install folder>\DemoCode\Mod0x, where Mod0x corresponds with the current module. Note If you performed a default installation of the course files, <install folder> will be c:\Program Files\Msdntrain\2063. 8 Introduction Lab Overview n Conference registration Web site l View pre-conference tutorials l View the conference tracks and sessions in each track l View the conference proceedings l Register for the conference l Reserve a hotel room *****************************illegal for non -trainer use****************************** The labs for this course build upon one another to create a complete application. The lab application is a Conference Web site. On the Web site, users can view the pre-conference tutorials and the sessions being offered in the different tracks of the conference. They can choose from these offerings and then register for the conference. They can also make a reservation at a hotel for the duration of the conference. The lab application uses a SQL Server database named Conf. For an illustration of the Conf database schema, see Appendix B in Course 2063B, Introduction to Microsoft ASP.NET. Lab Application Files The following is a list of all the files that are used by the lab application and their purpose. Lab file is used in File name Purpose _header.ascx User control that contains a heading for each page of the Web site. Multiple _menu.ascx User control that contains a menu for the Web site and is placed on each page of the Web site. Labs 3 and 4 AddToCart.aspx Adds a product to the shopping cart, then redirects to the shopping cart page. Multiple CheckOut.aspx Allows users to view the information in the shopping cart and then select the hotel they want to stay in. Lab 7 Conference.css Style sheet for the user interface. Multiple Conflogo.swf Flash animation embedded in Default.aspx page. Multiple Introduction 9 (continued ) File name Purpose Lab file is used in Web.config Configuration information. Lab 7 Default.aspx Home page for the Web application. Multiple Errorpage.aspx Redirection page in case of any error. Multiple Hotel_reservation.aspx Allows users to reserve a hotel room by specifying the type of room and the dates for which the room is needed. Labs 2 and 6 Login.aspx Allows users to sign in to the conference system by supplying their e-mail names and passwords. Labs 1 and 7 ProductDetails.aspx Outputs detailed information about preconference tutorial, track, or proceedings. Multiple ProductsList.aspx Displays the different products (tutorials, tracks, and proceedings) available in the conference. Labs 3, 4, and 5 Register.aspx Allows new users to register for the conference. Labs 2 and 7 SearchResults.aspx Outputs products based on search criteria. Multiple ShoppingCart.aspx All code to manage the user interface (UI) of the shopping cart. Multiple Component Files The following is a list of all the files in the conference.dll component. Lab file is used in File name Purpose ConferenceDB.vb Programmatic access to the database connection string. Multiple CustomersDB.vb Programmatic access to the Customer table in the database. Multiple GetProducts.vb Programmatic access to the GetProductsByCategory stored procedure. Lab 4 mk.bat Makefile to create the component. Multiple OrdersDB.vb Programmatic access to the Orders table in the database. Multiple ProductsDB.vb Programmatic access to the Products table in the database. Multiple 10 Introduction Web Services The following is a list of all the Web Service files used by the lab application. File name Purpose Lab file is used in Hotel_empty.asmx Web service for a hotel named Empty. Multiple Hotel_full.asmx Web service for a hotel named Full. Lab 6 mkServices.bat Makefile to create a proxy for the Web Services. Lab 6 Introduction 11 Lab Demonstration *****************************illegal for non-trainer use****************************** In this demonstration, you will see how a user would use the Conference Web application to register for a conference and reserve a room in a hotel. å To run the demonstration 1. Start Internet Explorer and enter the Uniform Resource Locator (URL) for the lab solution Web site, http://localhost/labsolution. This displays the home page default.aspx, which contains the two user controls: _header.ascx and _menu.ascx. 2. On the home page, click Pre-Conference Tutorials to view the details of all the tutorials that are offered on the ProductsList.aspx page. 3. Click on one of the subjects to obtain further details, such as the venue and time for the tutorials, on the ProductDetails.aspx page. 4. Click Add to Cart to purchase the tutorial that you are viewing. This goes to the ShoppingCart.aspx page. Note You can also add an item to the shopping cart from the ProductsList.aspx page. 5. On the ShoppingCart.aspx page, change the quantity of an item or delete it from the cart, then click Update your Shopping Cart to see the changes. 6. Repeat steps 2-5 for the Conference Tracks and Conference Proceedings links. 7. Enter a phrase in the Search text box and click Go! This calls the SearchResults.aspx page and displays all conference items related to the search string. You can also add items to the shopping cart from this page. 8. Click the Shopping Cart icon to jump to the ShoppingCart.aspx page. 12 Introduction 9. Click Final Checkout to buy the items in the shopping cart. 10. If you have not already logged in to the application, you will need to log in on the login.aspx page. Because you are new to the application, click Click here! to enter your information into the database on the Register.aspx page. Note A valid user name and password that you can use on the login.aspx page is: [email protected], password. 11. On the Register.aspx page, enter the requested information, and then click Submit. This returns you to the ShoppingCart.aspx page. 12. On the ShoppingCart.aspx page, click Final Checkout again. This calls the Checkout.aspx page. 13. Review the items in your order, and then click Submit for a final checkout. 14. Select a hotel to stay at. Click either Hotel Full or Hotel Empty. This calls the hotel_reservation.aspx page. 15. In the hotel_reservation.aspx page, select a type of room, and then select the dates for your stay. Next, click Submit. Note Hotel Full will never have a room available; Hotel Empty will always have a room available. 16. Click the Shopping Cart icon again to show that the shopping cart is now empty. Introduction 13 Microsoft Certified Professional Program http://www.microsoft.com/trainingandservices/ *****************************illegal for non-trainer use****************************** The Microsoft Certified Professional program includes the following certifications: n Microsoft Certified Systems Engineer + Internet (MCSE + Internet) n Microsoft Certified Systems Engineer (MCSE) n Microsoft Certified Database Administrator (MCDBA) n Microsoft Certified Solution Developer (MCSD) n Microsoft Certified Professional + Site Building (MCP + Site Building) n Microsoft Certified Professional + Internet (MCP + Internet) n Microsoft Certified Professional (MCP) n Microsoft Certified Trainer (MCT) For More Information See the “Certification”section of the Web page provided on the compact disc or the Microsoft Training and Certification Web site at http://www.microsoft.com/trainingandservices/ You can also send e-mail to [email protected] if you have specific certification questions. 14 Introduction Exam Preparation Guides To help prepare for the MCP exams, you can use the preparation guides that are available for each exam. Each Exam Preparation Guide contains exam-specific information, such as a list of the topics on which you will be tested. These guides are available on the Microsoft Certified Professional Web site at http://www.microsoft.com/trainingandservices/ Important MSDN® Training curriculum helps you to prepare for Microsoft Certified Professional (MCP) exams. However, no one-to-one correlation exists between MSDN Training courses and MCP exams. Passing MCP exams requires real-world experience with the products— MSDN Training courses help get you started. Introduction Facilities Class Hours *****************************illegal for non-trainer use****************************** Building Hours Phones Parking Messages Rest Rooms Smoking Meals Recycling 15 THIS PAGE INTENTIONALLY LEFT BLANK Module 1: Working with Microsoft ASP.NET Contents Overview Introducing ASP.NET 1 2 Creating Web Forms 11 Adding ASP.NET Code to a Page Handling Page Events 23 30 Discussion: ASP vs. ASP.NET 35 Lab 1: Using ASP.NET to Output Text Review 36 42 Information in this document, including URL and other Internet Web site references, is subject to change without notice. Unless otherwise noted, the example companies, organizations, products, domain names, e-mail addresses, logos, people, places, and events depicted herein are fictitious, and no association with any real company, organization, product, domain name, e-mail address, logo, person, places or events is intended or should be inferred. Complying with all applicable copyright laws is the responsibility of the user. Without limiting the rights under copyright, no part of this document may be reproduced, stored in or introduced into a retrieval system, or transmitted in any form or by any means (electronic, mechanical, photocopying, recording, or otherwise), or for any purpose, without the express written permission of Microsoft Corporation. Microsoft may have patents, patent applications, trademarks, copyrights, or other intellectual property rights covering subject matter in this document. Except as expressly provided in any written license agreement from Microsoft, the furnishing of this document does not give you any license to these patents, trademarks, copyrights, or other intellectual property. 2001 Microsoft Corporation. All rights reserved. Microsoft, MS-DOS, Windows, Windows NT, ActiveX, FrontPage, IntelliSense, Jscript, Outlook, PowerPoint, Visual Basic, Visual InterDev, Visual C++, Visual C#, Visual Studio, and Windows Media are either registered trademarks or trademarks of Microsoft Corporation in the U.S.A. and/or other countries. The names of actual companies and products mentioned herein may be the trademarks of their respective owners. Module 1: Working with Microsoft ASP.NET Overview n Introducing ASP.NET n Creating Web Forms n Adding ASP.NET Code to a Page n Handling Page Events n Discussion: ASP vs. ASP.NET *****************************illegal for non-trainer use****************************** Microsoft ® Active Server Pages (ASP) technology is widely used to create dynamic Web sites and applications. However, ASP has several limitations, such as the need for redundant and lengthy coding to accomplish simple goals. To overcome these limitations of ASP, Microsoft has developed a new technology called Microsoft ASP.NET, which is a part of the Microsoft .NET strategy for Web development. ASP.NET is a unified Web development platform that provides the services necessary for developers to build enterpriseclass Web applications. In this module, you will learn about the main features of ASP.NET and discover the differences between ASP and ASP.NET. You will also learn about server controls and see how to add server -side script to an ASP.NET page. After completing this module, you will be able to: n Identify the main features of ASP.NET. n Identify the differences between ASP and ASP.NET. n Describe the working model of ASP.NET. n Describe the architecture of server controls. n Add a Hypertext Markup Language (HTML) server control to a page. n Access the properties and methods of server controls in code. n Add event handlers for page events. n Use the IsPostback property to handle postback forms. 1 2 Module 1: Working with Microsoft ASP.NET u Introducing ASP.NET n The Microsoft .NET Framework n ASP.NET Features n Animation: ASP.NET Execution Model *****************************illegal for non-trainer use**************************** * * In this section, you will read an overview of the Microsoft .NET Framework and see how ASP.NET fits in. Next, you will learn about the various features of ASP.NET and see a working model. You will also learn about the main differences between ASP and AS P.NET. Module 1: Working with Microsoft ASP.NET The Microsoft .NET Framework Web Services Services User Interface ADO.NET: Data & XML Base Class Library Visual Studio.NET Orchestration Orchestration .NET .NET Framework Internet Internet COM+ Common Language Runtime .NET Enterprise Servers Building Block Block Services Windows *****************************illegal for non-trainer use****************************** The Microsoft .NET Platform provides all of the tools and technologies that are needed to build distributed Web applications. It exposes a consistent, languageindependent programming model across all tiers of an application, while providing seamless interoperability with and easy migration from existing technologies. The Microsoft .NET Platform is composed of several core technologies: n The Microsoft .NET Framework n The Microsoft .NET Building Block Services n The Microsoft .NET Enterprise Servers n Microsoft Visual Studio ® .NET n Microsoft Windows. NET The Microsoft .NET Framework is a set of technologies that is integral to the Microsoft .NET Platform. It provides the basic building blocks for developing Web applications and services. The Microsoft .NET Framework includes the following components: n Common Language Runtime n Base class library n Data n Web forms and Web services n WinForms 3 4 Module 1: Working with Microsoft ASP.NET Common Language Runtime The Common Language Runtime provides the programming interface between the Microsoft .NET Framework and the programming languages available for the Microsoft .NET Platform. It simplifies application development, provides a robust and secure execution environment, supports multiple languages, and simplifies application deployment and management. The run time loads and runs code written in any run time-aware programming language. Code that targets the run time is called managed code. Managed code simply means that there is a defined contract of cooperation between natively executing code and the run time itself. Responsibility for tasks like creating objects, making method calls, and so on is delegated to the run time, which enables the run time to provide additional services to the executing code. Base Classes and Libraries The Microsoft .NET Framework includes classes that encapsulate data structures, perform Input/Output (I/O), provide access to information about a loaded class, and provide a way to invoke security checks. It also includes classes that encapsulate exceptions and other helpful functionality such as data access, server-side user interface (UI) projections, and rich graphical user interface (GUI) generation. The Microsoft .NET Framework provides both abstract base classes and class implementations derived from those base classes. You can use these derived classes “as is”or derive your own classes from them. The Microsoft .NET Framework classes are named using a dot-syntax naming scheme that connotes a naming hierarchy. This technique is used to group related classes logically together so that they can be searched and referenced more easily. A grouping of classes is called a namespace. For example, a program can use classes in the System.Data.SqlClient namespace to read data from a SQL Server database. The root namespace for the Microsoft .NET Framework is the System namespace. Data Microsoft ADO.NET is the next generation of ActiveX® Data Object (ADO) technology. ADO.NET provides improved support for the disconnected programming model and also provides rich Extensible Markup Language (XML) support. ADO was created to provide data services to traditional client applications that were tightly coupled to the database; consequently it was not effective for Web applications. ADO.NET was created with the characteristics of Web applications in mind. Web Forms and Web Services ASP.NET is a programming framework built on the Common Language Runtime that can be used on a server to build powerful Web applications. ASP.NET Web forms provide an easy and powerful way to build dynamic user interfaces. ASP.NET Web services provide the building blocks for constructing distributed Web-based applications. Web services are based on the Simple Object Access Protocol (SOAP) specification. Module 1: Working with Microsoft ASP.NET 5 Win Forms For applications that are based on Microsoft Windows®, the Microsoft .NET Framework provides the System.Windows.Forms namespace to create the user interface. You can use System.Windows.Forms to do rapid application design (RAD). It provides inheritance in the same client user interface library. You can build components by using inheritance and then aggregate them by using a form designer such as Microsoft Visual Basic ®. 6 Module 1: Working with Microsoft ASP.NET ASP.NET Features n Multiple Language Support n Increased Performance l Compiled code l Cache n Classes and Namespaces n Server Controls n Web Services *****************************illegal for non-trainer use****************************** ASP.NET is more than just the next version of ASP. It is a totally re-architected technology for creating dynamic, Web-based applications. ASP pages use the .asp extension and ASP.NET pages use the extension .aspx. Note Both ASP and ASP.NET pages can be used on the same Web site. Existing ASP pages will still work along with new ASP.NET pages; they do not need to be converted into ASP.NET pages. ASP.NET, with a host of new features, allows developers to write cleaner code that is easy to reuse and share. ASP.NET boosts performance and scalability by offering access to compiled languages. Some of the main features of ASP.NET are described below. Multiple Language Support ASP.NET provides a true language-neutral execution framework for Web applications. You can currently use over 20 languages to build .NET applications. Microsoft has compilers for Visual Basic, Microsoft Visual C#™ , Microsoft Visual C++®, and Microsoft JScript ®. Third-party vendors are writing .NET compilers for Cobol, Pascal, Perl, and Smalltalk, among others. The labs and the sample code in this course will use Visual Basic. Increased Performance In ASP.NET, code is compiled. When you request a page for the first time, the run time compiles the code and the page itself, and keeps a cached copy of the compiled result. When you request the page the second time, the cached copy is used. This results in greatly increased performance because, after this first request, the code can run from the much faster compiled version and the content on the page does not need to be parsed again. Module 1: Working with Microsoft ASP.NET Classes and Namespaces ASP.NET includes a range of useful classes and namespaces. Namespaces are used as an organizational system— a way to present program components that are exposed to other programs and applications. Namespaces contains classes. Namespaces are like class libraries and can make writing Web applications easier. Some of the classes included with ASP.NET are HtmlAnchor, HtmlControl, and HtmlForm, which are included within the System.Web.UI.HtmlControls namespace. Note Namespaces may change between the Beta 2 and the final release versions of ASP.NET. Server Controls ASP.NET provides several server controls that simplify the task of creating pages. These server controls encapsulate common tasks that range from displaying calendars and tables to validating user input. They automatically maintain their selection states and expose properties, methods, and events for server-side code, thereby providing a clean programming model. For more information about using server controls, see Module 2, “Using Web Controls,” in Course 2063B, Introduction to Microsoft ASP.NET. Web Services A Web service is an application delivered as a service that can be integrated with other Web services by using Internet standards. ASP.NET allows you to use and create Web services. For example, a company can assemble an online store by using the Microsoft Passport service to authenticate users, a third-party personalization service to adapt Web pages to each user’s preferences, a credit-card processing service, a sales tax service, package-tracking services from each shipping company, and an in-house catalog service that connects to the company’ s internal inventory management applications. Web services provide the building blocks for constructing distributed Webbased applications. ASP.NET files have an .aspx extension and Web services have an .asmx extension. The technologies are similar; however, instead of outputting HTML, a Web service outputs a computer-readable answer to the input it receives. For more information about Web services, see Module 6, “Using Web Services,” in Course 2063B, Introduction to Microsoft ASP.NET. 7 8 Module 1: Working with Microsoft ASP.NET ASP.NET Features (continued) n Improved Security n Greater Scalability n Cookie-less Sessions n Easy Configuration and Deployment *****************************illegal for non-trainer use****************************** Improved Security In ASP, the only type of authentication that you can use is the Windows authentication, whereas ASP.NET allows different types of logon and user authentication: Windows, Passport, and Cookies. ASP.NET also enables you to get real account impersonation and have the server execute code as if the user were present. You can also programmatically check to see if the user is in a given role and conditionally let him or her perform certain tasks when given permission. In addition, creating forms-based authentication, in whic h you can create your own custom logon screen and credential checking, is much easier if you are using ASP.NET. For more information about authentication and creating login forms, see Module 7, “Creating a Microsoft ASP.NET Web Application,” in Course 2063B, Introduction to Microsoft ASP.NET. Greater Scalability In ASP.NET, session state can now be maintained in a separate process on a separate machine or database, allowing for cross-server sessions. This allows you to add more Web servers as your traffic grows. Module 1: Working with Microsoft ASP.NET 9 Cookie-less Sessions ASP.NET enables you to use session state even with browsers that have cookie support disabled. Cookie-less sessions use Uniform Resource Locators (URLs), as opposed to cookies, to pass the SessionID to an ASP.NET page. A cookieless session involves encoding data into a URL, which is done automatically by the browser. For more information about maintaining state, see Module 7, “Creating a Microsoft ASP.NET Web Application,” in Course 2063B, Introduction to Microsoft ASP.NET. Easy Configuration and Deployment Configuration and deployment are now easier with the use of human-readable configuration files and DLLs that do not need to be registered. In ASP.NET, all the configuration details for all Web applications are kept in human-readable files named web.config. The standard format for the configuration files is XML, and each application inherits the settings in the default web.config file. With .NET, all files that a Web site needs are located under the site’s root folder. DLLs are in the /bin folder, and the web.config file is in the root folder. To deploy a Web site, all you need to do is copy the site’s root folder by using file copy commands, the Microsoft FrontPage® server extensions, or File Transfer Protocol (FTP). For more information about configuration options, see Module 7, “Creating a Microsoft ASP.NET Web Application,” in Course 2063B, Introduction to Microsoft ASP.NET. 10 Module 1: Working with Microsoft ASP.NET Animation: ASP.NET Execution Model *****************************illegal for non-trainer use****************************** In this animation, you will see how ASP.NET pages are processed on the server. To view the animation, open the 2063B_01A001.swf file from the Media folder. The following table describes the elements that are depicted in the animation. Element Description Parser The parser checks and interprets the contents of the aspx page and passes the page to a compiler. Compiler The run-time compiler is responsible for compiling the contents of the page into an intermediate language. Assembly Cache Each machine on which the Microsoft .NET Framework is installed has a machine-wide code cache called the assembly cache. One of the functions of the assembly cache is to hold the native code versions of pages that have been pre-compiled. Memory Some items that are expensive to construct can be built once and used for a period of time before they are considered invalid. These items are stored in memory where they can be efficiently retrieved without incurring the cost of being reconstructed. Output Cache The output cache is a cache for entire pages, including their objects and data. After a page is built, it can be placed in the output cache. If a user makes another request for the page, the request is returned from the output cache. Module 1: Working with Microsoft ASP.NET u Creating Web Forms n What Are Web Forms? n What Are Server Controls? n Types of Server Controls n How Do Server Controls Work? n Demonstration: Adding Server Controls to an ASP.NET Page *****************************illegal for non-trainer use* ***************************** ASP.NET introduces the concept of server controls that encapsulate common tasks and provide a clean programming model. In this section, you will learn about types of server controls and see how they work. You will also learn how to use server controls on ASP.NET pages. 11 12 Module 1: Working with Microsoft ASP.NET What Are Web Forms? n .aspx extension n @Page Directive <%@ <%@ Page Page Language="vb" Language="vb" %> %> n Framework Is an Object Model n Denoted by the runat="server" Attribute <Form <Form runat="server"> runat="server"> </Form> </Form> n Contain Client-side and Server-side Code n Contain HTML and Server Controls *****************************illegal for non-trainer use****************************** Web Forms divide Web applications into two pieces: the visual component and the user interface logic. n Web Forms have an .aspx extension Web forms are commonly referred to as ASP.NET pages or ASPX pages. They have an .aspx extension and work as the containers for the text and controls that you want to display. n @Page directive The @Page directive defines page-specific attributes that are used by the ASP.NET page parser and compiler. You can set the language attribute to the language that will be used throughout all code on the page. You can include only one @ Page directive per .aspx file. n The Web Forms framework is an object model Although you create Web forms from separate components, they form a unit. When the Web form is compiled, ASP.NET parses the page and its code, generates a new class dynamically, and then compiles the new class. The dynamically generated class is derived from the ASP.NET Page class, but is extended with controls, your code, and the static HTML text in the .aspx file. This is different from AS P. In ASP, the page consists of static HTML interspersed with executable code. The ASP processor reads the page, extracts and runs the code, and then inserts the results back into the static HTML before sending the results to the browser. Unlike controls in an ASP form, all intrinsic controls in an ASP.NET form are objects. Therefore, all the controls on a form have properties, methods, and events. Module 1: Working with Microsoft ASP.NET n 13 A Web form is denoted by the runat="server" attribute The runat="server" attribute ensures that the form is executed at the server. <Form runat="server"> </Form> n Contain client-side and server-side code In the previous versions of ASP, controls on forms could invoke only clientside functions. This has been changed in ASP.NET by the introduction of server controls and server-side events. Like ASP pages, Web forms can contain client-side and server-side code. n Contain HTML and server controls Server controls are new in ASP.NET. Web forms can contain HTML and server controls. Note ASP.NET and ASP pages can coexist on the same machine. The file extension determines only whether ASP or ASP.NET processes it. 14 Module 1: Working with Microsoft ASP.NET What Are Server Controls? n Server-programmable Objects n Denoted by Tag with the runat = "server" Attribute n Encapsulate Both Behavior and Rendering n Fully Declarative n Render Different HTML to Support Multiple Browsers or Other Web Clients *****************************illegal for non -trainer use****************************** ASP allowed developers to execute components on the server. ASP.NET extends this concept with the introduction of server controls. Server controls are controls that have built-in behavior. They have properties, methods, and events that can be accessed at run time from code running on the server. They provide client-specific HTML that is displayed on the client. This means that you do not need to create separate pages for each browser type, nor query what type of browser is being used, because the control does that for you. For example, server controls can determine whether a presentation task, such as making a Web page text dynamically appear or disappear, should be performed by the browser or server code. If Microsoft Internet Explorer, version 4.0 or above, was the destination, the code is on the client side because Internet Explorer 4.0 can handle dynamic text operations. If an older version of Internet Explorer (for example, Internet Explorer 3.0) is the destination, the code is on the server side, resulting in an extra transaction with the server to change the text. From the user point of view, the text would change, but depending on the browser type, changes would occur either on the client or server. All this can be accomplished by a server control, which determines the browser type and generates the appropriate code. Server controls also provide a consistent object model for the controls, providing standard properties, methods, and events. Module 1: Working with Microsoft ASP.NET 15 Users can easily create server controls from existing HTML controls. To create a server control, simply add the runat attribute to the control’s tag. For example, the following is an HTML input box, turned into a server control: <INPUT TYPE="TEXT" runat="server"> Note Without the runat="server" attribute, this line of HTML would be parsed into a standard HTML text box. After you create a server control, you can access its properties, methods, and events through server-side code, making it easy to obtain user input and provide user feedback. 16 Module 1: Working with Microsoft ASP.NET Types of Server Controls n HTML Controls l Exist within the System.Web.UI.HtmlControls namespace <input <input type="text" type="text" id="txtName" id="txtName" runat="server"> runat="server"> <span <span id="spnStarter" id="spnStarter" runat="server"> runat="server"> starter</span> starter</span> n Web Controls l Exist within the System.Web.UI.WebControls namespace <asp:TextBox <asp:TextBox id="txtName" id="txtName" runat="server" runat="server" Text="[Entry Keywords]"/> Text="[Entry Keywords]"/> *****************************illegal for non-trainer use****************************** Server controls are us ed to create the user interface for your Web application. They can generate any output that is suitable for the device or browser they are targeting and can maintain state between trips to the server. There are two sets of server controls in the ASP.NET Framework: HTML controls and Web controls. Both render HTML that is displayed by Web browsers. HTML Controls HTML controls offer Web developers the power of the Web Forms page framework while retaining the familiarity and ease of use of HTML elements. These controls look exactly like HTML, except that they have a runat="server" attribute/value pair in the opening tag of the HTML element. For example, the following HTML not only creates a text box on a Web page, but also creates an instance of the text box server control: <input type="text" runat="server" id="txtName" value="some text"> To enable programmatic referencing of the control, include a unique id attribute. In the preceding example, the id="txtName" defines this programmatic id, allowing developers to manipulate the contents of this text box with server-side events and other code. ASP.NET offers direct object model support for the most commonly used HTML elements. For object models that are not directly supported, there is the HtmlGenericControl object, which supports the <span>, <div>, <body>, and <font> elements, among others. Module 1: Working with Microsoft ASP.NET 17 For example, you can use the following code to create a SPAN server element. <span id="spnStarter" runat="server">starter text</span> The HTML controls exist in the System.Web.UI.HtmlControls namespace. Note All HTML controls must be well-formed and must not overlap. Unless otherwise noted, elements must be closed, either with an ending slash within the tag or with a closing tag, like the XML syntax. Web Controls Web controls include traditional form controls such as the TextBox and Button controls, as well as other higher-level abstractions such as the Calendar and DataGrid controls. Web controls can be further classified into Intrinsic, Rich, Validation, and List controls. Web controls appear in the HTML markup as namespaced tags— that is, tags with a prefix. The prefix is used to map the tag to the namespace of the runtime component. The remainder of the tag is the name of the run-time class itself. Like HTML controls, these tags must also contain a runat="server" attribute. An example declaration is as follows: <asp:TextBox id="txtName" runat="server" Text="[Entry Keywords]"></asp:TextBox> In the preceding example, "asp" is the namespace tag prefix and it maps to the System.Web.UI.WebControls namespace. This namespace is automatically included in an ASP.NET page; you do not need to import it. 18 Module 1: Working with Microsoft ASP.NET How Do Server Controls Work? n Declared with runat="server" Attribute <input <input type="text" type="text" id="text2" id="text2" runat="server"> runat="server"> n When the ASP.NET Page Is Executed: l Creates action and method attributes of form l Adds unique id and name attributes to controls l Adds value attribute to controls l Adds a hidden control to the form to save view state information *****************************illegal for non -trainer use****************************** The key to the working of server controls is the runat="server" attribute. When you set the runat attribute, you enable the server -side events and view state maintenance for controls. If you do not set the runat attribute, the control works as a plain HTML control. The state for the controls is not maintained and no server-side events are available. You can have both server and plain HTML controls on a form. Web controls usually reside on a form. Forms also have the runat="server" attribute. The runat attribute enables forms to maintain the view state of their controls in an ASP.NET page. When an ASP.NET page is submitted to the server, ASP.NET automatically adds a hidden control named _VIEWSTATE to the form. If the state of a control has been modified, the _VIEWSTATE control is used to remember the values. This way, changes made to a page can be saved across multiple requests. Module 1: Working with Microsoft ASP.NET 19 To understand how server controls work, consider an example. Example The following example is a simple form that allows you to type your name and select your job title from a list box. <FORM runat="server"> Name: <INPUT type="text" runat="server"> <p>Profession: <SELECT runat="server"> <OPTION> Software Engineer </OPTION> <OPTION> Software Tester </OPTION> <OPTION> Program Manager </OPTION> </SELECT> <p><INPUT type="Submit" Value="Save" runat="server"> </FORM> Assume that a software engineer named Jane fills in and submits this form. When your ASP.NET code is executed, it does the following: 1. Creates the action and method attributes of the form so that the values of the controls in the form are posted back to the same page. 2. Adds a unique id and name attribute to the form. However, if you specify these on the form tag, the values that you specify will be used. 3. For each control, adds the value attribute with the text value that was in the control when the form was submitted. This maintains the state of the server controls. 4. Adds a hidden control named __VIEWSTATE to the form that stores state changes of a page. 20 Module 1: Working with Microsoft ASP.NET This is the HTML that is returned to the browser: <FORM name="ctrl1" method="post" action="server_controls.aspx" id="ctrl1"> <INPUT type="hidden" name="__VIEWSTATE" value="a0z-1466413384__x"> Name: <INPUT value="Jane" name="ctrl3" type="text"> <p> Profession: <SELECT name="ctrl5"> <OPTION value="Software Engineer"> Software Engineer</OPTION> <OPTION value="Software Tester"> Software Tester</OPTION> <OPTION selected value="Program Manager"> Program Manager</OPTION> </SELECT> <p> <input type="submit" value="Save"> </FORM> Module 1: Working with Microsoft ASP.NET 21 Demonstration: Adding Server Controls to an ASP.NET Page * * ***************************illegal for non -trainer use****************************** In this demonstration, you will see how to add HTML server controls to an ASP.NET page. å To run this demonstration 1. Open the file <install folder>\Democode\Mod01\server_controls.aspx with Microsoft Notepad. This file has a form with an input box, a list box, and a Submit button. 2. View the page in Internet Explorer. 3. Enter information in the controls and click Save. When the page is re-displayed, the information in the controls is lost. 4. Edit the page and add a runat="server" attribute to the three controls. 5. View the page in the browser again. View the source of the page to show the changes that were made. Among other changes made, a name attribute was added to each control. 6. Enter information in the controls and click Save. The controls still lose their values. 7. Edit the page and add a runat="server" attribute to the form. 8. View the page in the browser again. View the source of the page to show the changes that were made. Among other changes made, action and method attributes were added to the form and a hidden control was created. 9. Enter information in the controls and click Save. The controls now save their values. 22 Module 1: Working with Microsoft ASP.NET 10. Edit the page and add an intrinsic label Web control to the page: <asp:label id="label1" runat="server"/> 11. View the page in the browser and show the source of the page. The intrinsic control generates a <span> element. å To demonstrate how to use Microsoft Visual Studio® .NET 1. Open Visual Studio .NET and create a new Visual Basic ASP.NET Web Application project. A number of files are added to the project by default. For most of the course, we will be working only with ASPX files. An ASPX file, WebForm1.aspx, is created by default and opened in Design view. 2. In the Solution Explorer window, click the Show All Files button. 3. By default, a number of windows are opened in Visual Studio .NET. Windows can be “pinned”to the work area, or open only when you want to see them. Click the Auto Hide button in the upper right corner of the Solution Explorer window. Now the window will open only when you hover over or click its tab on the side of the workspace. 4. Click the Toolbox tab to display the toolbox window. 5. Add a text box and a button to the default Web form by dragging and dropping the controls from the toolbox onto the page. The Properties window is a great way to learn about the properties of the Web controls. 6. A code-behind page is created by default for the ASPX page named WebForm1.aspx.vb. Double-click the button to create an OnClick event procedure in the code-behind page. Note You will not be using this feature of Visual Studio .NET in this course. You will create event procedures manually. 7. Go back to the WebForm1.aspx page and click the HTML tab to go into HTML view. By default, ASPX pages are created with code-behind pages. To remove this feature, delete all the attributes in the @Page directive except the Language attribute. 8. Add an HTML text box to the default form. Microsoft IntelliSense® is built into Visual Studio .NET and supplies many of the attributes of the control. <input type="text" runat="server"> 9. Add a <script> section to the page by right-clicking on the page, clicking Insert Script Block, and then clicking Server. 10. To view the page, right-click and click View in Brows er. Module 1: Working with Microsoft ASP.NET u Adding ASP.NET Code to a Page n Creating an ASP.NET <SCRIPT> Section n Visual Basic 6.0 vs. Visual Basic. NET Version 7.0 n Creating Event Procedures n Demonstration: Adding Code to Controls *****************************illegal for non-trainer use****************************** ASP.NET introduces a new way of coding that is very similar to coding in event-driven languages, such as Visual Basic and dynamic HTML (DHTML) scripting. In this section, you will learn how to create a basic ASP.NET page. You will learn about the major differences between Visual Basic version 6.0 and Visual Basic .NET version 7.0. Finally, you will also learn how to add functionality to the controls on an ASP.NET page. 23 24 Module 1: Working with Microsoft ASP.NET Creating an ASP.NET <SCRIPT> Section n Declaring the Language <script <script language="VB" language="VB" runat="server"> runat="server"> <script <script language="C#" language="C#" runat="server"> runat="server"> n Declaring Functions and Subroutines <SCRIPT <SCRIPT LANGUAGE="VB" LANGUAGE="VB" runat="server"> runat="server"> Sub Sub login login () () 'contents 'contents of of routine routine End Sub End Sub </SCRIPT> </SCRIPT> *****************************illegal for non-trainer use****************************** Most code in an ASP.NET page is placed in <SCRIPT> sections. You can use the ASP <% and %> syntax, but it is not the preferred method. Although <% %> code blocks provide a powerful way to custom-manipulate the text output returned from an ASP.NET page, they do not provide much help in providing a clean HTML programming model. Developers using only <% %> code blocks must custom-manage page state between round trips and custom interpret posted values. When you create a <SCRIPT> section for server-side code, you need to declare the language being used for the code and set the runat attribute to "server". The default language is Visual Basic, which is a superset of Microsoft Visual Basic Scripting Edition (VBScript). For example, the following code example declares Visual Basic as the language. <SCRIPT LANGUAGE="VB" runat="server"> In ASP.NET, you declare functions and sub-procedures within the <SCRIPT> tags. <SCRIPT LANGUAGE="VB" runat="server"> Sub login() 'contents of routine End Sub </SCRIPT> Module 1: Working with Microsoft ASP.NET 25 Visual Basic 6.0 vs. Visual Basic .NET Version 7.0 n No More Set and Let n Need to Use Parentheses When Calling Functions and Sub-Procedures n Parameters Are Passed by Value n You Can Specify the Data Type of a Variable; Variants Are Not Supported n Variables Can Be Initialized When They Are Declared n Improved Type Safety n Structured Error Handling with Try/Catch/Finally n New Conversion Methods ******************** *********illegal for non-trainer use****************************** Visual Basic .NET version 7.0 is very different from earlier versions. Following are some of the major differences between Visual Basic .NET version 7.0 and earlier versions of Visual Basic . n No more Set and Let You assign values to object variables; you no longer use the Set syntax. This is because the concept of default properties and methods does not exist any more. Furthermore, when comparing objects, you must use the is operator, not the = operator: objThis is objThat n Use parentheses when calling functions and sub-procedures All methods, functions, and sub-procedures must now use parentheses to enclose the parameter list. Response.Write (“Hello”) n Parameters are passed by value Previously, parameters were passed by reference in Visual Basic. Now they are passed by value. You can add the ByRef keyword to the parameter list if you want to pass a parameter by reference. 26 Module 1: Working with Microsoft ASP.NET n Declaring variables As in Visual Basic 6.0, you can specify the data type of a variable when you declare it. However, the Variant data type is no longer supported in Visual Basic .NET. Dim strName as String Dim strTitle, strAddress as String You can turn on Option Explicit by setting the Explicit attribute of the @Page direc tive to true. <%@Page Language="vb" Explicit="true" %> n Initializers Visual Basic .NET version 7.0 supports initialization of variables on the line in which they are declared. Initializers can be used anywhere, including inside a control structure. The semantics of a procedure-level declaration, which include an initalizer, are the same as those for a declaration statement immediately followed by an assignment statement. In other words, the following statement: Dim X As Integer = 1 is equivalent to these statements: Dim X As Integer X = 1 n Type Safety Visual Basic .NET version 7.0 offers improved type safety by generating errors when a conversion that could fail at run time or is unexpected by the user is required. n Structured Error Handling In the past, developers needed to provide error-handling code in every function and subroutine. Developers have found that a consistent errorhandling scheme means writing a great deal of duplicated code. With Try...Catch...Finally, these problems are eliminated. Developers can nest their exception handling, and there is a control structure for writing cleanup code that executes in both normal and exception conditions. Sub SEH() Try Open "TESTFILE" For Output As #1 Write #1, CustomerInformation Catch Kill "TESTFILE" Finally Close #1 End try End Sub n New Conversion Methods Visual Basic .NET supports new conversion methods such as ToString for converting data types. You can still use conversion functions such as CStr, but ToString is the recommended method. Module 1: Working with Microsoft ASP.NET 27 Creating Event Procedures n Assign a Method Name to the Event Attribute <input <input type="submit" type="submit" value="Submit!" value="Submit!" onServerClick="GreetMe" onServerClick="GreetMe" runat="server"> runat="server"> n Create an Event Procedure in Your Page Code Sub Sub GreetMe(s GreetMe(s As As Object, Object, ee As As EventArgs) EventArgs) n Access Properties of Controls in the Event Procedure Sub Sub GreetMe(s GreetMe(s As As Object, Object, ee As As EventArgs) EventArgs) spnGreeting.InnerHTML = "Hello spnGreeting.InnerHTML = "Hello "" && __ txtName.Value txtName.Value End End Sub Sub *****************************illegal for non-trainer use****************************** You can create event handlers for server controls by using the ASP.NET syntax. In the event handlers, you can access the properties of a control. å To create event handlers by using the ASP.NET syntax 1. In the tag for the control, assign a method name to the name of the event. For example: <input type="submit" value="Submit!" onServerClick="GreetMe" runat="server"> Note OnClick is a client-side event, whereas OnServerClick is a serverside event for an HTML button. 2. Create an event-handling sub-procedure in your page code and access the properties of a control. The event handler takes two parameters as shown in the following sample code: Sub GreetMe(s As Object, e As EventArgs) spnGreeting.InnerHTML = "Hello " & txtName.Value End Sub 28 Module 1: Working with Microsoft ASP.NET Event arguments All events pass two arguments to the event procedure: the sender of the event, and an instance of the class that holds data for the event, if any. The second argument is usually of type EventArgs and often does not contain any additional information but, for some controls, it is of a type specific to that control. For example, for an ImageButton Web control, the second argument is of the type ImageClickEventArgs, which includes information about the coordinates where the user clicked. The following event procedure outputs the coordinates of the click in a label control: Sub img_OnClick(s As Object, e As ImageClickEventArgs) label1.Text = e.x & ", " & e.y End Sub Module 1: Working with Microsoft ASP.NET 29 Demonstration: Adding Code to Controls *****************************illegal for non -trainer use****************************** In this demonstration, you will see how to add event procedures to an ASP.NET page. The file <install folder>\Democode\Mod01\eventproc.aspx has the completed code for this demonstration. å To run this demonstration 1. Open the file <install folder>\democode\Mod01\server_controls.aspx. 2. Add id attributes to the text box and the list box: txtName and lstTitle. 3. Add an onServerClick attribute to the button that will call the GreetMe procedure. <input type="submit" onserverclick="GreetMe" value="Save" runat="server"> 4. Create a SCRIPT section for server -side code. <SCRIPT language="VB" runat="server"> 5. Create the GreetMe sub-procedure. Sub GreetMe(s As Object, e As EventArgs) label1.Text = "Hello " & txtName.Value & _ ". I see your occupation is " & lstTitle.Value End Sub 6. View the page in Internet Explorer. When you click the button, the values of the controls are displayed in the <span> element. 7. View the source of the page. The code is server-side code so it is not included in the page. 30 Module 1: Working with Microsoft ASP.NET u Handling Page Events n Page Event Life Cycle n Handling Postback Forms n Demonstration: Using Postback Forms *****************************illegal for non-trainer use****************************** In this section, you will learn about the event life cycle of an ASP.NET page. You will learn about using the Load and Unload events of the Page object. Finally, you will learn how to use the IsPostBack property to handle postback forms. Module 1: Working with Microsoft ASP.NET 31 Page Event Life Cycle Page_Init Page_Init Page_Load Page_Load Textbox1_Changed Textbox1_Changed Button1_Click Button1_Click Page_Unload Page_Unload Page is disposed *****************************illegal for non-trainer use****************************** In ASP.NET, a structured set of events occurs every time a page is viewed. The event order is: 1. Page_Init After this event, a page is initialized. This event is responsible for all the initialization activities. If you want to initialize certain variables and so on, before a page loads, you declare it in the Page_Init event. 2. Page_Load The Page_Load event automatically fires every time a page is loaded. It fires at the beginning of a request after controls are initialized. Because server controls can be accessed on the server, you can load their data in the Page_Load event. Sub Page_Load(s As Object, e As EventArgs) txtName.Text = 'value from database End Sub 3. Change events After the Page_Load event, control-specific events are fired. An example of a control-specific event is a Change event or a Click event. By default, only Click events submit a form to the server. Change events are stored in a queue and handled in a random order on the server after the form is posted. For example, if a user enters text into a number of controls on a form and then clicks a submit button, the Change events for the text controls will not be processed until the form is sent to the server by the Click event. 32 Module 1: Working with Microsoft ASP.NET 4. Click event Whatever event caused the posting of the form fires after all Change events have completed. 5. Page_Unload The Page_Unload event is the last event fired before the page is discarded. This event is fired when the user goes to another page. You cannot read the values of controls in the Page_Unload event because by the time the event fires, the controls no longer exist. Page_Unload events are useful for cleanup activities such as logging, closing files, closing databases, and discarding objects. Sub Page_Unload(s As Object,e As EventArgs) MyApp.LogPageComplete() End Sub Module 1: Working with Microsoft ASP.NET 33 Handling Postback Forms n ViewState Control Maintains the State of a Page During Postback n Page_Load Fires on Every Request l Use Page.IsPostBack to execute conditional logic Sub Sub Page_Load(s Page_Load(s As As Object, Object, ee As As EventArgs) EventArgs) If Not Page.IsPostBack Then If Not Page.IsPostBack Then 'executes 'executes only only on on initial initial page page load load End End If If 'Rest 'Rest of of procedure procedure executes executes on on every every request request End End Sub Sub *****************************illegal for non-trainer use****************************** If you do not specify an action attribute on a form, ASP.NET pages post back to themselves. The __VIEWSTATE hidden control on a form maintains the state on the form so that the values previously entered do not disappear. This is very useful for form validation and building dynamic pages. However, code in the Page_Load event runs each time the page is loaded. This code could re-execute data lookup to fill a list box, which is unnecessary, or override previous selections made by the user and maintained by the __VIEWSTATE control. The IsPostBack property of the Page object is a Boolean value that is set to True whenever the page is posted back. This property can be used in the Page_Load event to specify which code in the Page_Load event run should run on every page load, and which should run only the first time the page is loaded. For example, in the following code sample, the IsPostBack property is used to ensure that the text box is filled in only the first time. Sub Page_Load(s As Object,e As EventArgs) If Not Page.IsPostBack Then 'executes only on initial page load txtComment.Value = "initial value" End If 'Rest of procedure executes on every request End Sub 34 Module 1: Working with Microsoft ASP.NET Demonstration: Using Postback Forms *****************************illegal for non-trainer use****************************** In this demonstration, you will see how to use the IsPostBack property of an ASP.NET page. The file <install folder>\Democode\Mod01\postback.aspx has the completed code for this demonstration. å To run this demonstration 1. Open the file <install folder>\Democode\Mod01\server_controls.aspx. 2. Add a Page_Load event procedure that initializes the text box. Sub Page_Load(s As Object, e As EventArgs) txtName.Value = "Enter your name" End Sub 3. View the page in Internet Explorer. Enter text in the text box and click Save. The text box is loaded with default text. 4. In the Page_Load event procedure, check for IsPostBack and initialize the text box only the first time the page is loaded. If Not Page.IsPostBack Then txtName.Value = "Enter your name" End If 5. View the page again. Enter text in the text box and click Save. Now the initial text is displayed only the first time the page is displayed. Module 1: Working with Microsoft ASP.NET Discussion: ASP vs. ASP.NET *****************************illegal for non-trainer use****************************** 35 36 Module 1: Working with Microsoft ASP.NET Lab 1: Using ASP.NET to Output Text *****************************illegal for non -trainer use****************************** Objectives After completing this lab, you will be able to: n Integrate HTML server controls in an ASP.NET page n Write page event procedures and event procedure for server controls in an ASP.NET page Prerequisite Before working on this lab, you must know how to create an HTML page. Lab Setup There are starter and solution files associated with this lab. The starter files are in the folder <install folder>\Labs\Lab01\Starter and the solution files for this lab are in the folder <install folder>\Labs\Lab01\Solution. Scenario A user must type an e-mail name and password in order to sign into the conference system. This is done on the login.aspx page. In this lab, you will first create an ASP.NET page with HTML server controls and then create event procedures for the button. Estimated time to complete this lab: 60 minutes Module 1: Working with Microsoft ASP.NET 37 Exercise 1 Creating an ASP.NET Page In this exercise, you will create a simple ASP.NET page with a form, two HTML text boxes, an HTML button, and an HTML <span> element. You will then create an event procedure for the button. å To create the Web application 1. Using Microsoft Visual Studio .NET, create a new Web project named ASPNET. a. On the File menu, click New, and then click Project. b. In the New Project dialog box, click ASP .NET Web Application, set the Name to ASPNET, and then click OK. Visual Studio .NET creates a virtual root named ASPNET, and the following files: • aspnet.vbproj • aspnet.vbproj.webinfo • aspnet.vsdisco • AssemblyInfo.vb • Global.asax • Global.asax.resx • Global.asax.vb • Styles.css • Web.config • WebForm1.aspx • WebForm1.aspx.resx • WebForm1.aspx.vb 2. Add the starter lab files to the project. a. On the Project menu, click Add Existing Item. b. In the Add Existing Item dialog box, navigate to the <install folder>\Labs\Lab01\Starter folder. c. Select All Files (*.*) in the Files of type list box. d. Select all 19 files, and then click Open. Note When copying the files, you will be asked if you want to replace the existing Web.config file. Click Yes. You will also be asked multiple times if you want to create a new class file. Click No for each new class file that you are asked to create. 38 Module 1: Working with Microsoft ASP.NET e. Start Windows Explorer and navigate to the <install folder>\Labs\Lab01\Starter folder. f. Select the bin, Components, and images folders and drag them to the root of the ASPNET Web site in the Visual Studio .NET Solution Explorer window. Note When copying the folders, you will be asked if you want to replace the bin directory. Click Yes. å To create a blank .aspx page 1. Open the WebForm1.aspx file. 2. Click the HTML tab (at the bottom of the page) to view the contents of the page. 3. Delete all attributes except the Language attribute from the @Page directive at the top of the page. The @Page directive should look like the following: <@ Page Language="vb" %> 4. Save the page as login.aspx. å To add a SCRIPT section 1. Add a SCRIPT section to the beginning of the login.aspx page (just before the <HTML> tag). 2. Set the Language attribute to Visual Basic. Your script section should look the follow ing: <script language="VB" runat="server"> </script> å To create the logon form 1. Add text and HTML server controls to the default form section of the file to make it look like the following illustration. Be sure to add a <span> tag after the Sign In Now button. Module 1: Working with Microsoft ASP.NET Use the following table to create the controls: Control Attributes E-mail type = "text " id = "txtEmail" Listbox (select) id = "selMailClient" Password type = "password" id = "txtPassword" Button type = "submit" value = "Sign In Now" Span id = "spnInfo" Your form should look like the following: <form id="WebForm1" method="post" runat="server"> Email:<br> <input type="text" id="txtEmail" runat="server"> <br><br> What kind of mail client do you use:<br> <select id="selMailClient" runat="server"> </select> <br><br> Password:<br><input type="password" id="txtPassword" runat="server"><br><br> <input type="submit" value="Sign In Now" runat="server"> <span id="spnInfo" runat="server"> </span> </form> 2. Fill the listbox server-control with the following options: • Microsoft Outlook® • Microsoft Outlook Express • Web-based 3. Make the first option the default selection. Your HTML for the list box should look the following: <select id="selMailClient" runat="server"> <option selected>Microsoft Outlook</option> <option>Microsoft Outlook Express</option> <option>Web-based</option> </select> 39 40 Module 1: Working with Microsoft ASP.NET å To add an event procedure for the button 1. Set the onServerClick attribute of the button to cmdLogin_Click. 2. In the <script> section, create the cmdLogin_Click event procedure. 3. Display the contents of the controls in the spnInfo SPAN element. To see all the comments written to the spnInfo SPAN element, concatenate the spnInfo.innerHTML content with the values from the other controls. Your event procedure should look like the following: Sub cmdLogin_Click(s As Object, e As EventArgs) spnInfo.innerHTML = spnInfo.innerHTML & _ "Your email: " & _ txtEmail.Value & _ "<br>Your mail client is: " & _ selMailClient.Value & _ "<br><br>" End Sub å To save and test your work 1. Save your changes. 2. Using Microsoft Internet Explorer, go to the login page of the ASPNET Web site by viewing http://localhost/ASPNET/login.aspx. 3. Fill the Email field with your e-mail address and click Sign In Now. You should see your e-mail address at the bottom of the page. Module 1: Working with Microsoft ASP.NET Exercise 2 Creating Page Event Procedures In this exercise, you will add page event procedures to the page. å To add a Page Load event procedure 1. In the script section, add a Page_Load event procedure that displays the value of Page.IsPostBack . Concatenate the value of the IsPostBack property with the current text in the spnInfo element. Your event procedure should look like the following: Sub Page_Load(s As Object, e As EventArgs) spnInfo.innerHTML = spnInfo.innerHTML & _ "One more Page_Load event!<br>" & _ "Page.IsPostBack=" & _ Page.IsPostBack.ToString() & _ "<br><br>" End Sub 2. Save your changes. 3. Using Internet Explorer, go to the logon page of the ASPNET Web site by viewing http://localhost/ASPNET/login.aspx. Notice the message on the page. 4. Click Sign In Now. Notice the postback message. 41 42 Module 1: Working with Microsoft ASP.NET Review n Introducing ASP.NET n Creating Web Forms n Adding ASP.NET Code to a Page n Handling Page Events n Discussion: ASP vs. ASP.NET *****************************illegal for non-trainer use****************************** 1. List some of the differences between ASP and ASP.NET. 2. What are the main features of ASP.NET? 3. What attribute is used to denote server controls? 4. How is the view state of controls maintained? Module 1: Working with Microsoft ASP.NET 5. How do you create an event procedure for the click event of an HTML button control? 6. What is the order of events that occur when a page is displayed? 43 THIS PAGE INTENTIONALLY LEFT BLANK Module 2: Using Web Controls Contents Overview 1 What Are Web Controls? 2 Using Intrinsic Controls 4 Using Input Validation Controls Selecting Controls for Applications 16 28 Lab 2: Using Web Controls 29 Review 40 Information in this document, including URL and other Internet Web site references, is subject to change without notice. Unless otherwise noted, the example companies, organizations, products, domain names, e-mail addresses, logos, people, places, and events depicted herein are fictitious, and no association with any real company, organization, product, domain name, e-mail address, logo, person, places or events is intended or should be inferred. Complying with all applicable copyright laws is the responsibility of the user. Without limiting the rights under copyright, no part of this document may be reproduced, stored in or introduced into a retrieval system, or transmitted in any form or by any means (electronic, mechanical, photocopying, recording, or otherwise), or for any purpose, without the express written permission of Microsoft Corporation. Microsoft may have patents, patent applications, trademarks, copyrights, or other intellectual property rights covering subject matter in this document. Except as expressly provided in any written license agreement from Microsoft, the furnishing of this document does not give you any license to these patents, trademarks, copyrights, or other intellectual property. 2001 Microsoft Corporation. All rights reserved. Microsoft, MS-DOS, Windows, Windows NT, ActiveX, FrontPage, IntelliSense, Jscript, Outlook, PowerPoint, Visual Basic, Visual InterDev, Visual C++, Visual C#, Visual Studio, and Windows Media are either registered trademarks or trademarks of Microsoft Corporation in the U.S.A. and/or other countries. The names of actual companies and products mentioned herein may be the trademarks of their respective owners. Module 2: Using Web Controls 1 Overview n What Are Web Controls? n Using Intrinsic Controls n Using Input Validation Controls n Selecting Controls for Applications *****************************illegal for non-trainer use****************************** Web controls are designed to provide a simple way to add functionality, such as displaying data or selecting dates, to a Web page. Web controls include traditional form controls, such as buttons and text boxes, and complex controls, such as tables and the calendar control. After completing this module, you will be able to: n Add Web controls to a Microsoft® ASP.NET page. n Use properties, methods, and events of Web controls. n Validate user input on an ASP.NET page by using input validation controls. n Bind two controls together. 2 Module 2: Using Web Controls What Are Web Controls? n HTML Controls n Web Controls l Intrinsic controls asp:list, asp:button, asp:checkbox, asp:table l Input Validation controls asp:RangeValidator, asp:RegularExpressionValidator l Rich controls asp:calendar, asp:adrotator l List-bound controls asp: datagrid, asp:repeater, asp:datalist *****************************illegal for non-trainer use****************************** ASP.NET uses server controls extensively to simplify the task of programming Web pages. You can change many Hypertext Markup Language (HTML) elements into server controls by adding the runat=server attribute to the element tag. However, ASP.NET includes new controls, called Web controls, which have built-in functionality and are the preferred controls to use in an ASP.NET page. Web controls include traditional form controls, such as buttons and text boxes, and complex controls, such as tables. They also include controls that provide commonly used form functionality such as displaying data in a grid, choosing dates, and so on. There are four sets of Web controls in ASP.NET: n Intrinsic controls map to simple HTML elements. n Validation controls provide a variety of data validation. n Rich controls provide rich user interface and functionality. Currently ASP.NET ships with two rich controls, the Calendar and the AdRotator controls. n List-bound controls provide data flow across a page. The DataGrid, DataList, and Repeater controls constitute an interrelated set of Web controls. These controls render HTML to display the contents of a list or data source to which they are bound. Hence, they are collectively referred to as list-bound controls. Note For more information about displaying data from databases, see Module 3, “Using Microsoft ADO.NET to Access Data,” in Course 2063B, Introduction to Microsoft ASP.NET. Module 2: Using Web Controls 3 Web controls exist within the System.Web.UI.WebControls namespace. You create them by using the asp: namespace. You do not need to import this namespace into your .aspx page to use these controls. For example, the following sample code creates a button Web control: <asp:Button runat="server" /> Note All controls must be well-formed and must not overlap. Unless otherwise noted, elements must be closed, either with an ending slash within the tag or with a closing tag. For example, <asp:Button runat="server" /> or < asp:Button runat="server" > </asp:Button>. For more information about the Web controls available with ASP.NET, see “ASP.NET Syntax for Web Controls”in the .NET Framework SDK documentation. 4 Module 2: Using Web Controls u Using Intrinsic Controls n What Are Intrinsic Controls? n List of Intrinsic Controls n Handling Intrinsic Control Events n Demonstration: Adding Intrinsic Controls to a Page n Linking Two Controls Together n Demonstration: Linking Two Controls Together *****************************illegal for non-trainer use****************************** Intrinsic controls are designed to replace the standard set of HTML controls. This section describes intrinsic controls and explains how to use them in an ASP.NET page. Module 2: Using Web Controls What Are Intrinsic Controls? n Provide Standard Naming Convention, with Standard Properties for Controls <asp:RadioButton <asp:RadioButton BackColor="red" BackColor="red" Text=" Text=" "... "... /> /> <asp:CheckBox <asp:CheckBox BackColor="red" BackColor="red" Text=" Text=" "... "... /> /> n Include Properties Specific to the Control <asp:CheckBox <asp:CheckBox Checked="True" Checked="True" ... ... /> /> n Create Browser-Specific HTML <span> <span> <input <input type="checkbox" type="checkbox" id="ctrl1" id="ctrl1" checked="true" checked="true" name="ctrl1"> name="ctrl1"> <label <label for="ctrl1">Standard</label> for="ctrl1">Standard</label> </span> </span> *****************************illegal for non-trainer use****************************** Intrinsic controls are used as an alternative to HTML controls. You use Web controls in the same way that you use HTML controls. The most important difference is the prefix tag asp: that is added before every Web control. For example, you can add a Label control to a form by using the following line of code: <asp:Label runat="server" Text="Label1"></asp:Label> Intrinsic Web controls provide the following benefits: n Provide a standard naming convention for similar controls n Provide common properties for all controls n Include strongly typed properties that are specific to the control n Create browser-specific HTML Standard Naming Convention One of the problems with HTML controls has been the lack of a consistent naming convention for similar controls. Intrinsic controls eliminate this problem, as shown in the following examples. Example 1 The following lines of code declare a radio button, a check box, and a button. <input type ="radio"> <input type ="checkbox"> <input type ="submit"> All of these controls are input controls; however, they all behave in different ways. 5 6 Module 2: Using Web Controls Intrinsic controls provide an alternative way to declare different controls. The following lines of code use intrinsic Web controls to declare a radio button, a check box, and a button: <asp:RadioButton> <asp:CheckBox> <asp:Button> Include Common Properties for Controls In ASP.NET, common properties for intrinsic controls have the same name. For example, when you want to set the background color for a control, you always use the same attribute irrespective of the control. For example, all controls have a Text property that sets the text corresponding to the control. Controls also have BackColor and ForeColor properties. Setting the BackColor="red" property sets the background color to red for any control. <asp:textbox id="txtName" Text="Jane" BackColor="red" runat="server" /> <asp:Button id="btnSubmit" Text="Submit" BackColor="cyan" runat="server" /> Control-Specific Properties Intrinsic Web controls also have a set of properties that relate specifically to the control. Check Box For example, a check box has a Checked property that indicates whether the check box is checked or not. The following sample code creates a check box labeled Standard that is initially checked. <asp:CheckBox Checked="True" Text="Standard" runat="server" /> List Box Some properties of Web controls are available only at run time. For example, the list box and drop-down list boxes have the SelectedItem property that returns either the value or text of the item selected in the list box. Module 2: Using Web Controls 7 Create Browser-Specific HTML Although Web controls are easily added to a page, they are powerful controls. When a page is rendered for a browser, the Web controls determine which browser is requesting the page and then deliver the appropriate HTML. For example, if the requesting browser supports client-side scripting, such as Microsoft Internet Explorer version 4.0 or later, the controls create client-side script to implement their functionality. But, if the requesting browser does not support client-side script, the controls create server-side code and require more round trips to the server to obtain the same functionality. For example, the HTML generated for the above check box in Internet Explorer 5.5 is: <span> <input type="checkbox" id="ctrl1" checked="true" name="ctrl1"> <label for="ctrl1">Standard</label> </span> 8 Module 2: Using Web Controls List of Intrinsic Controls n List of Intrinsic Controls <asp:textbox> <asp:hyperlink> <asp:image> <asp:panel> <asp:button> <asp:checkbox> <asp:linkbutton> <asp:imagebutton> <asp:label> <asp:radiobutton> <asp:table> <asp:dropdownlist <asp:dropdownlist id="favColor" id="favColor" runat="server"> runat="server"> <asp:listitem>Blue</asp:listitem> <asp:listitem>Blue</asp:listitem> <asp:listitem>Red</asp:listitem> <asp:listitem>Red</asp:listitem> <asp:listitem>Green</asp:listitem> <asp:listitem>Green</asp:listitem> </asp:dropdownlist> </asp:dropdownlist> *****************************illegal for non-trainer use**************************** * * ASP.NET intrinsic controls include traditional form controls, such as buttons and text boxes, and complex controls, such as tables. Examples of Intrinsic Controls The following table lists some of the intrinsic Web controls and their corresponding HTML controls. Web control HTML control <asp:textbox> <asp:button> <asp:imagebutton> <asp:checkbox> <asp:radiobutton> <asp:listbox> <asp:dropdownlist> <asp:hyperlink> <asp:image> <asp:label> <asp:panel> <asp:table> <input type=text> <input type=submit> <input type=image> <input type=checkbox> <input type=radiobutton> <select size="5"> </select> <select> </select> <a href="…"> </a> <img src="…"> <span> </span> <div> </div> <table> </table> Module 2: Using Web Controls Adding Intrinsic Controls Drop-Down List Box The DropDownList control is used to allow a single selection from a number of choices displayed as a drop-down list: You can add a list box to a form by using the following code: <asp:dropdownlist id="favColor" runat="server"> <asp:listitem>Blue</asp:listitem> <asp:listitem>Red</asp:listitem> <asp:listitem>Green</asp:listitem> </asp:dropdownlist> Label You can add a label control to a form as follows: <asp:Label runat="server" Text="Label1" FontItalic="true"></asp:Label> Check box The CheckBox control is used to generate a check box that can be toggled between selected and cleared states: <asp:CheckBox runat="server" Text="CheckBox1" Checked="True"></asp:CheckBox> For more information about the properties and events associated with the intrinsic controls, see the .NET Framework SDK documentation. 9 10 Module 2: Using Web Controls Handling Intrinsic Control Events <asp:button <asp:button id="btn" id="btn" runat="server" runat="server" onclick="btn_Click" onclick="btn_Click" /> /> Sub Sub btn_Click(s btn_Click(s As As Object, Object, ee As As EventArgs) EventArgs) n Web Controls Support Only Server-Side Events n Web Controls Have a Limited Number of Events n Only Click Events Cause the Form to Be Posted Back to the Server n Set the AutoPostBack Property to TRUE to Force Postbacks *****************************illegal for non-trainer use****************************** Events in Web forms work differently than events in traditional client forms or in client-based Web applications. In client-based applications, events are raised and handled on the client. In Web forms, all events are raised on the client but handled on the Web server. Web controls support server-side events only. Web controls have a limited number of events because all events are server-side events and cause a round trip to the server. They support click-type events. Some server controls also support a special version of an onChange event, such as SelectionChanged, which is raised when the control's value changes. However, mouse-key events are not supported. Using Event Procedures As with HTML control events, writing event handlers for Web controls is a two-step procedure. You need to set up the event handler in the control’s tag, and then write the event procedure itself. For example, you set up a click event for a button control as follows: <asp:button id="btn" runat="server" onclick="btn_Click" /> Note The button Web control has only an OnClick event, not an OnServerClick event. You then write the event procedure as follows: Sub btn_Click(s As Object, e As EventArgs) End Sub Module 2: Using Web Controls 11 For more information on the events available for intrinsic controls, see the Microsoft .NET Framework SDK documentation. Note Web controls do not support client-side events. HTML controls have both server-side and client-side events. Using AutoPostBack In Web controls, by default, only click events cause the form to be posted to the server. Change events are captured, but do not immediately cause a postback. Instead, they are cached by the control until the next time a post occurs. Once the form is posted to the server, the associated event procedures will run. During server page processing, all change events are processed first, in no particular order. When all change events have been processed, the click event that caused the form to be posted is processed. You can specify a change event to cause a form postback, and thus run the event procedure immediately, by setting the AutoPostBack property to True. For example, you can set up a change event for a list box with the following tag: <asp:dropdownlist id="lstTitle" runat="server" onSelectedIndexChanged="lst_change" > However, until you set the autoPostBack property to True, the lst_change event procedure will run only when the form is posted to the server in response to a click event of a button. 12 Module 2: Using Web Controls Demonstration: Adding Intrinsic Controls to a Page *****************************illegal for non-trainer use****************************** In this demonstration, you will learn how to add intrinsic Web controls to an ASP.NET page. You will see the HTML generated by this page for Internet Explorer and understand what happens when you add intrinsic controls to a form. Next, you will learn how to add event procedures for the controls. The file <install folder>\Democode\Mod02\demo1.aspx has the completed code for this demonstration. å To run the demonstration 1. Open intrinsic.aspx from the <install folder>\Democode\Mod02 folder. There are three intrinsic controls in this file: a text box, a list box, and a button, plus two <span> elements. There are also event procedures created for the button and the list box. 2. View the page in Internet Explorer. Enter text in the text box and click Save. Nothing happens when you click the button or select an item in the list box. Events are fired only for controls on forms. 3. Edit the page and add a form with the runat="server" attribute to the page to hold the controls. 4. View the page in Internet Explorer again. Enter text in the text box and click Save. View state is now preserved for the text box and the list box. The button procedure runs when you click the button, but the list box event procedure does not fire until the button is clicked. 5. Edit the page and set the AutoPostBack attribute of the list box to True. 6. View the page in Internet Explorer again. Enter text in the text box and click Save. The list box event procedure fires immediately when you select an item. Module 2: Using Web Controls 13 Linking Two Controls Together n Binding One Control to Another Is Useful for Taking Values from List Boxes or Drop-Down Lists <asp:DropDownList <asp:DropDownList id="lstLocation" id="lstLocation" autoPostBack="True" autoPostBack="True" runat="server" runat="server" >> You You selected: selected: <asp:Label <asp:Label id="SelectedValue" id="SelectedValue" Text="<%# Text="<%# lstLocation.SelectedItem.Text lstLocation.SelectedItem.Text %>" %>" runat="server" runat="server" /> /> n Data Binding Sub Sub Page_Load Page_Load (s (s As As Object, Object, ee As As EventArgs) EventArgs) SelectedValue.DataBind() SelectedValue.DataBind() End End Sub Sub *****************************illegal for non-trainer use****************************** You can bind one control to the contents of another. This is particularly useful for taking values from list boxes or drop-down lists. The following example demonstrates how to bind a Label control to the contents of a drop-down list. You set the Text attribute of the Label control to the Selected Item of the lstLocation list by using the binding tags <%# and %>: <asp:Label id="SelectedValue" runat="server" Text="<%# lstLocation.SelectedItem.Text %>" /> 14 Module 2: Using Web Controls In the following code, notice that the autoPostBack property of the drop-down list is set to True, which causes automatic post back whenever the value of the list box changes. <script language="VB" runat="server"> Sub Page_Load (Sender As Object, E As EventArgs) SelectedValue.DataBind() End Sub </script> <form runat="server"> <asp:DropDownList id="lstLocation" autoPostBack="true" runat="server" > <asp:listitem>Boston</asp:listitem> <asp:listitem>New York</asp:listitem> <asp:listitem>London</asp:listitem> <asp:listitem>Amsterdam</asp:listitem> </asp:dropdownlist> <p>You selected: <asp:Label id="SelectedValue" Text="<%# lstLocation.SelectedItem.Text %>" runat="server" /> </p> </form> You can use Page.DataBind() if you want the page to data bind all elements on the page. The preceding example binds only the label control to data, and therefore uses the SelectedValue.DataBind() syntax, where SelectedValue is the id attribute of the label control. While this lesson describes using the binding tags <%# and %>, it is often a better practice to assign values from one control directly to another, rather than using data binding. The following line of code demonstrates assigning values from one control to another: SelectedValue.Text=lstLocation.SelectedItem.Text For more information about data binding, see Module 3, “Using Microsoft ADO.NET to Access Data,” in Course 2063B, Introduction to Microsoft ASP.NET. Module 2: Using Web Controls Demonstration: Linking Two Controls Together *****************************illegal for non-trainer use****************************** In this demonstration, you will see how to bind a label control to a list box. The completed code for this demonstration is in the <install folder>\Democode\Mod02\binding.aspx page. å To run the demonstration 1. Edit the page you created in the last demo, <install folder>\Democode\Mod02\intrinsic.aspx 2. Add a label control to the page. <asp:label id="lblListbox" runat="server"/> 3. Bind the label control to the list box by setting its Text attribute. <asp:label id="lblListbox" Text="<%# lstTitle.SelectedItem.Text %> " runat="server"/> 4. Create a Page_Load event and call lblListbox.DataBind() Sub Page_Load(s As Object, e As EventArgs) lblListbox.DataBind() End Sub 5. View the page in Internet Explorer. When you select an item in the list box, the value is reflected in the label control. 15 16 Module 2: Using Web Controls u Using Input Validation Controls n Input Validation Controls n Adding Input Validation Controls to a Form n Validating an Entire Page n Demonstration: Adding Input Validation Controls n Advantages of Using Input Validation Controls *****************************illegal for non -trainer use****************************** In HTML 3.2, validating data is a difficult process. You can run validation code on the client, on the server, or both. Each time you receive a request, you not only need to write code that checks the input, you need to write error messages to help the user to correctly fill in the form. This is a taxing process for users, developers, and servers. The introduction of input validation controls in ASP.NET makes the task of validating input easier than it has been in the past. In this section, you will learn about the advantages of using input validation controls. You will also learn how to add these controls to an ASP.NET page. Module 2: Using Web Controls 17 Input Validation Controls n RequiredFieldValidator n CompareValidator n RangeValidator n RegularExpressionValidator n CustomValidator n ValidationSummary *****************************illegal for non-trainer use****************************** Validation controls are added to an ASP.NET page like other server controls. There are controls for specific types of validation, such as range checking or pattern matching, plus a RequiredFieldValidator control that ensures that a user does not skip an entry field. Validation controls work with all server controls. The validation controls have both uplevel and downlevel client support. Uplevel browsers perform validation on the client (using JavaScript and dynamic HTML [DHTML]). Client-side validation enhances the validation scheme by checking user input as the user enters data. This allows errors to be detected on the client before the form is submitted, preventing the round trip necessary for server-side validation. In uplevel checking, if there is an error in user input, a trip is not made to the server; instead, the associated error messages are shown on the client. Downlevel browsers perform validation on the server. Both scenarios use the same programming model. Note More than one input validation control can be associated with a Web control. For example, there can be required and compare validators for the same text box Web control. 18 Module 2: Using Web Controls The following table lists the validation controls included in the ASP.NET Framework. Validation control Function RequiredFieldValidator Checks whether value has been entered into a control. CompareValidator Compares an input control to a fixed value or another input control. It can be used for password verification fields, for example. It is also possible to do typed date and number comparisons. RangeValidator Much like CompareValidator, but can check that the input is between two values or the values of other input controls. RegularExpressionValidator Checks that the entry matches a pattern defined by a regular expression. This type of validation allows you to check for predictable sequences of characters, such as those in social security numbers, e-mail addresses, telephone numbers, postal codes, and so on. CustomValidator Allows you to write your own code to take part in the validation framework. ValidationSummary Displays a summary of all of the validation errors for all of the validation controls on the page. For more information about using the input validation controls, see “Validation Server Controls Overview” in the .NET Framework SDK documentation. Module 2: Using Web Controls 19 Adding Input Validation Controls to a Form n Properties: l ControlToValidate l ErrorMessage l Display <asp:textbox <asp:textbox id="txtName" id="txtName" runat="server" runat="server" /> /> <asp:RequiredFieldValidator <asp:RequiredFieldValidator id="txtNameValidator" id="txtNameValidator" runat="server" runat="server" controlToValidate="txtName" controlToValidate="txtName" errorMessage="You errorMessage="You must must enter enter your your name" name" display="dynamic"> display="dynamic"> </asp:RequiredFieldValidator> </asp:RequiredFieldValidator> *****************************illegal for non-trainer use****************************** The standard code used to add input validation controls to a form is as follows: <asp:type_of_validator id="validator_id" runat="server" controlToValidate="control_id" errorMessage="error_message_for_summary" display="static|dynamic|none"> </asp:type_of_validator> In the preceding code, controlToValidate is the ID of the control whose input is being validated (a text box, in most cases). The errorMessage property is the error message that is displayed if the input is not valid, and the display property indicates how the validation control will be rendered in the page. Setting the display property to static implies that each validation control occupies space even when no error message text is visible, thereby allowing you to define a fixed layout for the page. Setting the display property to dynamic means that the layout of the page changes, sometimes causing controls to move as error messages are displayed. Validation controls cannot occupy the same space on the page, so you must give each control a separate location on the page. In addition to the above-mentioned required properties, each validation control has more spec ific properties that define how the control should behave. The following examples show how to add validation controls. 20 Module 2: Using Web Controls RequiredFieldValidator Control Use the RequiredFieldValidator control to require input in a field. The following code shows how to use the RequiredFieldValidator control. <asp:textbox id="txtName" value="Enter your name" runat="server" /> <asp:RequiredFieldValidator id="txtNameValidator" runat="server" controlToValidate="txtName" errorMessage="You must enter your name" display="dynamic"> </asp:RequiredFieldValidator> RangeValidator Control To test whether an input value falls within a given range, use the RangeValidator control. The RangeValidator control uses three additional properties to perform its validation— MinimumValue, MaximumValue , and type. MinimumValue and MaximumValue properties define the minimum and maximum values of the valid range. The type property specifies the data type that that is used in comparing values. In the following example, the txtAge field must have a value between 18 and 50. If the value does not fall within the range, an error message is displayed and no trip to the server occurs. <asp:textbox id="txtAge" value="Enter your age" runat="server" /> <asp:RangeValidator id="txtAgeValidator" runat="server" controlToValidate="txtAge" type="Integer" minimumValue="18" maximumValue="50" errorMessage="Applicants must be between 18 and 50" display="dynamic"> </asp:RangeValidator> Module 2: Using Web Controls 21 CompareValidator Control To use one control to test the validity of a second control, or to test input against a specific value, use the CompareValidator control. The CompareValidator control uses the following additional properties to perform its validation: n ValueToCompare or ControlToCompare n Set ValueToCompare to compare to a constant value. Set ControlToCompare to the ID of another control to compare against. If you set both ValueToCompare and ControlToCompare, ControlToCompare takes precedence. Type The data type of the two values to be compared. n Operator The comparison operator to use. Operators are specified with the name of the comparison operators, such as Equal, NotEqual, GreaterThan, GreaterThanEqual, and so on. The following code shows an example in the .aspx file of a Web form Textbox control with required field validation. A table is used to control layout. In the following example, the txtAge field must have a value greater than or equal to zero. <asp:textbox id="txtAge" runat="server" /> <asp:CompareValidator id="txtAgeCompareValidator" runat="server" ControlToValidate="txtAge" ValueToCompare="0" Type="Integer" Operator="GreaterThanEqual" ErrorMessage="Please enter a whole number zero or greater."> </asp: CompareValidator > 22 Module 2: Using Web Controls RegularExpressionValidator Control You can check whether a user ’s entry matches a pre-defined pattern, such as a phone number, postal code, e-mail address, and so on, with the RegularExpressionValidator control. Set the ValidationExpression property of the RegularExpressionValidator control to a regular expression. The following example shows how you can use a RegularExpressionValidator control to check whether users enter valid social security numbers. The control checks for the pattern: three digits, a hyphen, two digits, a hyphen, and four more digits. <asp:textbox id="txtSSN" runat="SERVER" /> <asp:RegularExpressionValidator id="txtZIP_validation" runat="server" ControlToValidate="txtSSN" ErrorMessage="Use the format 123-12-1234." ValidationExpression="[0-9]{3}-[0-9]{2}-[0-9]{4}"> </asp:RegularExpressionValidator> Module 2: Using Web Controls Validating an Entire Page n Page.IsValid Property Sub Sub Submit_click Submit_click (s (s AA Object, Object, ee As As EventArgs) EventArgs) If Page.IsValid Then If Page.IsValid Then Message.Text Message.Text == "Page "Page is is valid!" valid!" End If End If End End Sub Sub n ValidationSummary Control <asp:ValidationSummary <asp:ValidationSummary id="valSummary" id="valSummary" runat="server" runat="server" headerText= headerText= "These "These errors errors were were found:" found:" showSummary="True" showSummary="True" displayMode="List" displayMode="List" /> /> *****************************illegal for non-trainer use****************************** Sometimes you need to know if all the controls on a page are valid before performing some other action. In fact, in client-side validation, values are sent across to the server only when all controls are valid. Page.IsValid Property ASP.NET developers can check the Page.IsValid property at run time to determine whether all validation server controls on a page are currently valid. This provides a short and simple way to determine whether to proceed with business logic. Sub Submit_click (s A Object, e As EventArgs) If Page.IsValid Then Message.Text = "Page is valid!" End If End Sub Note The validation can be either client-side or server-side, depending on the browser. 23 24 Module 2: Using Web Controls Validation Summary Control If a validation control is in error, an error message may be displayed in the page by the validation control or in the ValidationSummary control elsewhere on the page. The ValidationSummary control is displayed when the IsValid property of the page is false. Each of the validation controls on the page is polled and the text messages exposed are aggregated by the ValidationSummary control. n The ValidationSummary updates itself without posting back if it detects errors. n The ValidationSummary can optionally display a message box to the user if there are errors. <asp:ValidationSummary id="valSummary" runat="server" headerText="These errors were found:" showSummary="True" displayMode="List" /> There are two places where you can display error messages to the user: in the input validation control or in the ValidationSummary control. If there is a ValidationSummary control on the form, it gathers and displays all ErrorMessage properties of input validation controls on the form, and the validation controls themselves display any error text that is contained between their start and end tags. If there is no ValidationSummary control, the input validation controls display the text in the ErrorMessage property. Module 2: Using Web Controls 25 Demonstration: Adding Input Validation Controls *****************************illegal for non-trainer use******* *********************** In this demonstration, you will see how to add input validation controls to text controls on a form. The completed code for this demonstration is in the <install folder>\Democode\Mod02\validation.aspx and <install folder>\Democode\Mod02\validate_all.aspx pages. å To run the demonstration 1. Edit the page you created in the last demonstration <install folder>\Democode\Mod02\intrinsic.aspx. 2. Add a RequiredField validator to the txtName text box. <asp:RequiredFieldValidator id="txtNameValidator" runat="server" controlToValidate="txtName" errorMessage="You must enter your name" display="dynamic"> </asp:RequiredFieldValidator> 3. View the page in Internet Explorer. Leave the text box blank and click Save . The error message from the errorMessage attribute appears. 4. View the source of the page. The input validation control generated clientside script to do the validation. 26 Module 2: Using Web Controls 5. Add a RangeValidator control to limit the entries to names that start with "A". <asp:RangeValidator id="txtNameRngValidator" runat="server" controlToValidate="txtName" errorMessage="Please enter a name that begins with 'A'" type="String" minimumValue="A" maximumValue="B" display="dynamic"> </asp:RangeValidator> 6. Set the display attribute of the RequiredFieldValidator to static. 7. View the page in Internet Explorer. Enter invalid text in the text box and click Save. The error message from the errorMessage attribute of the RangeValidator control appears, but it is offset by the area required by the RequiredFieldValidator. 8. Open the page validate_all.aspx. There are a number of input validation controls used on this page, and a validation summary control. 9. View the page validate_all.aspx in Internet Explorer. When you click the Validate button, the ValidationSummary control displays all the errorMessage attributes of controls that are not valid. Module 2: Using Web Controls Advantages of Using Input Validation Controls n Provide Immediate Feedback to the User n Create Client-Side and Server-Side Validation n Uses DHTML and JScript Library to Write Client Logic n Allow Enhancement of Client-Side Validation and Behavior *****************************illegal for non-trainer use****************************** Most Web sites perform their validation checks on the server. However, most applications also need client-side validation checks. Writing two versions of validation code for these validation checks can be time-consuming for developers. Validation controls eliminate this problem because almost all the duplicated logic is encapsulated in the controls. Validation controls check controls for a specific type of error condition and display a description of that problem. In addition, the controls create browser-specific code, so that, if a client with Internet Explorer 4.0 or later uses the page, it can perform the same input validation that takes place on the server without client script. Using validation controls has the following advantages: n Provides immediate feedback to the user. The user gets immediate feedback on whether the data entered is valid or not. The error messages appear and disappear immediately after the bad input is entered or corrected. n Creates client-side and server-side validation. n If the browser supports client-side script, the controls do error checking before posting the data to the server. This saves the user time and reduces hits on the server. Uses DHTML and a Microsoft JScript® library to write client logic . The client logic is contained in a JScript library, so no Microsoft ActiveX® components or Java applets are used. n Allows enhancement of client-side validation and behavior. An object model is exposed on the client to allow enhancement of clientside validation and behavior. 27 28 Module 2: Using Web Controls Selecting Controls for Applications Use Web Controls When: Use HTML Controls When: l You prefer a Visual Basic-like programming model l You prefer an HTMLlike object model l You are writing a page that might be used by a variety of browsers l You are working with existing HTML pages and want to quickly add Web Forms functionality l You need specific functionality such as a calendar or ad rotator l The control will interact with client and server script *****************************illegal for non-trainer use****************************** When creating ASP.NET pages, you can use different classes of controls. You can mix control types on the same page. For example, your ASP.NET page might include a form made up of Web controls plus an HTML control converted from an HTML <span> element. The following table summarizes some of the situations in which you might decide to use a particular control. Type of control Use it when Web control You prefer a Microsoft Visual Basic ®-like programming model. You are writing a Web Forms page that might be viewed by a variety of browsers. You need specific functionality, such as a calendar or ad rotator, that is available only as a Web Forms control. You are creating applications with nested controls and want to be able to catch events at the container level. HTML control You prefer an HTML-like object model. You are working with existing HTML pages and want to quickly add Web Forms functionality. Because HTML controls map exactly to HTML elements, any HTML design environment can support them. The control will also interact with client and server script. As a general rule, Web controls are more capable and have a richer object model than HTML controls. If you want all the processing of an ASP.NET page to occur on the server, Web controls are a good choice. Module 2: Using Web Controls Lab 2: Using Web Controls *****************************illegal for non-trainer use****************************** Objectives After completing this lab, you will be able to: n Use Web controls in an ASP.NET page. n Use input validation controls in an ASP.NET page. n Display the summary of validation controls in a form. n Test if a page is valid or not. n Add a Calendar control to an ASP.NET page. Prerequisite Before working on this lab, you must know how to create ASP.NET event procedures. Lab Setup There are starter and solution files associated with this lab. The starter files are in the folder <install folder>\Labs\Lab02\Starter and the solution files for this lab are in the folder <install folder>\Labs\Lab02\Solution. 29 30 Module 2: Using Web Controls Scenario When users want to reserve a room in a hotel for a conference, they need to select the type of room and specify the check-in and check-out dates. This is done on the hotel_reservation.aspx page. In exercises 1 and 2 of this lab, you will add Web controls to this page. Before registering for a conference on the Conference Web site, a user needs to register as an individual. This is done on the register.aspx page. In exercises 3 and 4 of this lab, you will add input validation controls to the register.aspx page to validate the input for the controls on this page. Estimated time to complete this lab: 60 minutes Module 2: Using Web Controls 31 Exercise 1 Adding Web Controls to a Page In this exercise, you will add three different controls to the ASP.NET page hotel_reservation.aspx: a button control, a label control, and a drop-down list control. å To add a button 1. Open the file hotel_reservation.aspx in the folder InetPub\wwwRoot\ASPNET. 2. Locate the following comment: <!-- TO DO: add a reservation button --> 3. Create a button Web control. a. Set the ID, Text and Runat attributes. b. Set the OnClick event to call the cmdSubmit_Click procedure. Your code should look like the following: <asp:button id="cmdOK" Text="Reserve" OnClick="cmdSubmit_Click" runat="server" /> å To add a label 1. Locate the following comment: <!-- TO DO: add a confirmation label --> 2. Create a label Web control. • Set the ID and Runat attributes. Your code should look like the following: <asp:Label id="lblReservationConfirmation" runat="server" /> 32 Module 2: Using Web Controls å To add a drop down list 1. Locate the following comment: <!-- TO DO: add a second DropDownList --> 2. Create a second drop-down list control to contain the available room types. a. Set the ID attribute to lstRoomType2. b. Create two drop-down list items: NoSmoking and Smoking. Set the No Smoking item to be the default selection. Your code should look like the following: <asp:DropDownList id="lstRoomType2" runat="server"> <asp:ListItem selected="true">No Smoking</asp:ListItem> <asp:ListItem>Smoking</asp:ListItem> </asp:DropDownList> 3. Save your work. Module 2: Using Web Controls 33 Exercise 2 Adding a Calendar Control to a Page In this exercise, you will add a calendar control to the ASP.NET page hotel_reservation.aspx. å To add a calendar control 1. In the file hotel_reservation.aspx, locate the following comment: <!-- TO DO: add a calendar control for the ending date --> 2. Create a second calendar control, named calEndingDate, with the same attributes as the calStartingDate calendar control. Your code should look like the following: <asp:Calendar id="calEndingDate" runat="server" BackColor="#9FC89F" ForeColor="#313179" BorderWidth="3" BorderStyle="Solid" BorderColor="#313179" CellSpacing="2" CellPadding="2" ShowGridLines="true" TitleStyle-BackColor="white" TitleStyle-ForeColor="black" /> å To validate start and end date selections 1. Locate the following comment: 'TO DO: validate start and end date selections 2. Write an event procedure named cmdSubmit_Click for the Reserve button that validates the selections in the two calendar controls. a. If the end date is greater than the start date, display a confirmation message in the lblReservationConfirmation label. b. If the end date is less than the start date, display an error message in the lblReservationConfirmation label. Note You use the SelectedDate method to obtain the selected date of a calendar control and you use the SelectedItem.Text method to obtain the selected item of a drop-down list. 34 Module 2: Using Web Controls Your code should look like the following: ' Test if the date range is valid If calEndingDate.SelectedDate <= _ calStartingDate.SelectedDate Then lblReservationConfirmation.Text = _ "The end date cannot be before the start date." Else lblReservationConfirmation.Text = _ "Congratulations. There is an available room " & _ "for you.<br>" & _ "Room type: " & _ lstRoomType1.SelectedItem.Text & ", " & _ lstRoomType2.SelectedItem.Text & "<br>" & _ "from: " & _ calStartingDate.SelectedDate.ToShortDateString() & _ " to " & _ calEndingDate.SelectedDate.ToShortDateString() End If å To save and test your work 1. Save your changes to the file hotel_reservation.aspx. 2. Using Internet Explorer, go to the hotel reservation page of the Conference Web site by viewing http://localhost/ASPNET/hotel_reservation.aspx. 3. Select a room type, a start date and an end date, and then click Reserve. You should see a confirmation message. 4. Select a start date that is later than the end date, and then click Reserve . You should see the following message: “The end date cannot be before the start date.” Module 2: Using Web Controls 35 Exercise 3 Validating User Input In this exercise, you will add four different input validation controls to the ASP.NET page register.aspx: a RequiredValidator control, a RangeValidator control, a RegularExpressionValidator control, and a CompareValidator control. å To validate the Full Name text box 1. Open the file register.aspx in the folder InetPub\wwwRoot\ASPNET. 2. Locate the following comment: <!-- TO DO: validate txtFullName control--> 3. Create a RequiredFieldValidator input validation control to validate the txtFullName control. a. Set the ID and Runat attributes. b. Set the remaining attributes as shown in the following table. Property Value ErrorMessage “Full Name is a required field.” InitialValue “” Display Static c. Set the default text of the control to “*”. Your code should look like the following : <asp:RequiredFieldValidator id="valFullName" runat="server" controlToValidate="txtFullName" errorMessage="Full Name is a required field." initialValue="" display="static"> * </asp:RequiredFieldValidator> 36 Module 2: Using Web Controls å To validate the e-mail text box 1. Locate the following comment: <!-- TO DO: validate txtEmail control --> 2. Create a RegularExpressionValidator input validation control to validate the txtEmail control. Set the ID, ControlToValidate, Runat, ErrorMessage, and Display attributes. 3. Set the validationExpression attribute of the RegularExpressionValidator control to a regular expression for the syntax of an e-mail address. Use the characters in the following table to create the regular expression. Character Meaning . Any character + One or more occurrences of the preceding expression @ Character “@” \. Character “.” An e-mail address must meet the following requirements: • One or more characters representing the account name preceding the “at” (@) separator between the account name and the domain name address. • The “at”(@) separator. • One or more characters representing the domain name following the “at” (@) separator. • One period following the conclusion of the domain name. • One or more characters following the period, representing the top-level domain. Your code should look like the following: <asp:RegularExpressionValidator id="valEmailExpr" runat="server" validationExpression=".+@.+\..+" controlToValidate="txtEmail" errorMessage="E-mail syntax is incorrect." display="dynamic"> * </asp:RegularExpressionValidator> Module 2: Using Web Controls 37 å To compare the values in the txtPassword and txtConfirmPassword text boxes 1. Locate the following comment <!-- TO DO: password comparison --> 2. Create a CompareValidator input validation control to compare the txtConfirmPassword control with the txtPassword control. 3. Set the ID, Runat, ControlToValidate, ControlToCompare, ErrorMessage, and Display properties. Your code should look like the following: <asp:CompareValidator id="valComparePassword" runat="server" controlToValidate="txtConfirmPassword" controlToCompare="txtPassword" errorMessage="Password fields do not match." Display="dynamic"> * </asp:CompareValidator> å To save and test your work 1. Save your changes to the file register.aspx. 2. Using Internet Explorer, go to the registration page of the Conference Web site by viewing http://localhost/ASPNET/register.aspx. 3. Enter invalid information in the Name, E-mail, Password, and Confirm Password text boxes, and then click Submit. The following table gives examples of invalid information. Field Value Full Name “” E-mail “Email” Password “abc” Confirm Password “def” The page should display an asterisk next to each invalid field. 4. Enter valid information in the Name, E-mail, Password, and Confirm Password text boxes, and then click Submit. 38 Module 2: Using Web Controls Exercise 4 Summarizing Validation Errors In this exercise, you will add a ValidationSummary control to the register.aspx page. You will also programmatically test the validity of the controls on the form in the OnClick event procedure of the Submit button. å To add a validation summary control 1. In the register.aspx file, locate the following comment: <!-- TO DO: validation summary --> 2. Create a ValidationSummary control to summarize the validity of all validation controls on the form. Your code should look like the following: <asp:validationsummary id="valSummary" runat="server" /> å To save and test your work 1. Save your changes to the register.aspx file. 2. Open the page in Internet Explorer and enter invalid values in some of the fields, and then click Submit. You will see an error message for each incorrect field in a summarization at the bottom of the page. å To display another page if all the fields are valid 1. In the cmdValidation_Click event procedure, go to the comment: 'TO DO: test if the page is valid 2. Add code to test if the page is valid. a. If the page is valid, redirect to the validOK.aspx page using the Redirect method of the Response object. b. If the page is invalid, do nothing. Your code should look like the following: If Page.IsValid Then Response.Redirect("validOK.aspx") End If Module 2: Using Web Controls å To save and test your work 1. Save your changes to the file register.aspx. 2. Open the page in Internet Explorer. 3. Enter invalid values in the fields, and then click Submit. You should see error messages. 4. Enter valid values in the fields, and then click Submit. You should receive the confirmation page. 39 40 Module 2: Using Web Controls Review n What Are Web Controls? n Using Intrinsic Controls n Using Input Validation Controls n Selecting Controls for Applications *****************************illegal for non-trainer use**************************** * * 1. What is the prefix tag that you must use to create Web controls? 2. How do you create an event procedure for a button? 3. List the input validation controls included with ASP.NET. 4. What property of the input validation controls determines the error text displayed to the user? Module 2: Using Web Controls 5. What validation control would you use to validate a phone number? 6. Why would you use the ValidationSummary control? 41 THIS PAGE INTENTIONALLY LEFT BLANK Module 3: Using Microsoft ADO.NET to Access Data Contents Overview Overview of ADO.NET 1 2 Connecting to a Data Source 11 Accessing Data with DataSets Using Stored Procedures 13 28 Lab 3: Using ADO.NET to Access Data 37 Accessing Data with DataReaders Binding to XML Data 46 53 Review 59 Information in this document, including URL and other Internet Web site references, is subject to change without notice. Unless otherwise noted, the example companies, organizatio ns, products, domain names, e-mail addresses, logos, people, places, and events depicted herein are fictitious, and no association with any real company, organization, product, domain name, e-mail address, logo, person, places or events is intended or should be inferred. Complying with all applicable copyright laws is the responsibility of the user. Without limiting the rights under copyright, no part of this document may be reproduced, stored in or introduced into a retrieval system, or transmitted in any form or by any means (electronic, mechanical, photocopying, recording, or otherwise), or for any purpose, without the express written permission of Microsoft Corporation. Microsoft may have patents, patent applications, trademarks, copyrights, or other intellectual property rights covering subject matter in this document. Except as expressly provided in any written license agreement from Microsoft, the furnishing of this document does not give you any license to these patents, trademarks, copyrights, or other intellectual property. 2001 Microsoft Corporation. All rights reserved. Microsoft, MS-DOS, Windows, Windows NT, ActiveX, FrontPage, IntelliSense, Jscript, Outlook, PowerPoint, Visual Basic, Visual InterDev, Visual C++, Visual C#, Visual Studio, and Windows Media are either registered trademarks or trademarks of Microsoft Corporation in the U.S.A. and/or other countries. The names of actual companies and products mentioned herein may be the trademarks of their respective owners. Module 3: Using Microsoft ADO.NET to Access Data Overview n Overview of ADO.NET n Connecting to a Data Source n Accessing Data with DataSets n Using Stored Procedures n Accessing Data with DataReaders n Binding to XML Data *****************************illegal for non-trainer use****************************** One of the reasons for the widespread use of Microsoft® Active Server Pages (ASP) is that it facilitates access to data stores. ASP.NET expands on this capability with the introduction of ADO.NET, which offers a rich suite of data handling and data binding functions for manipulating all types of data. After completing this module, you will be able to: n Describe the Microsoft ADO.NET object model. n Connect to a data source by using ADO.NET. n Retrieve data from a database by using DataReaders and DataSets. n Display the data from a database on the client by using list-bound controls. n Customize the look of Repeater controls with templates. n Use stored procedures to return Recordsets. n Read data from an Extensible Markup Language (XML) file into DataSets . Note There were many changes between the Beta 1 and Beta 2 versions of ASP.NET with respect to data binding. For a detailed list of changes, see Appendix A, in Course 2063B, Introduction to Microsoft® ASP.NET. 1 2 Module 3: Using Microsoft ADO.NET to Access Data u Overview of ADO.NET n The ADO.NET Object Model n Animation: Using ADO.NET to Access Data n RecordSets vs. DataSets n Using Namespaces *****************************illegal for non -trainer use****************************** ADO.NET is not a revision of Microsoft ActiveX® Data Objects (ADO), but a new way to manipulate data that is based on disconnected data and XML. Although ADO is an important data access tool within ASP, it does not provide all of the necessary features for developing robust and scalable Web applications. In spite of ADO’s rich object model and relative ease of use, it is connected by default, relies on an OLE DB provider to access data, and it is entirely Component Object Model (COM)-based. ADO.NET has been designed to work with disconnected datasets. Disconnected datasets reduce network traffic. ADO.NET uses XML as the universal transmission format. This guarantees interoperability as long as the receiving component runs on a platform where an XML parser is available. When the transmission occurs through XML, it is no longer necessary that the receiver be a COM object. The receiving component has no architectural restrictions whatsoever. Any software component can share ADO.NET data, as long as it uses the same XML schema for the format of the transmitted data. In this section, you will learn about ADO.NET. You will learn about the new and modified objects in ADO.NET. You will also learn about some of the new namespaces that are included in ASP.NET. Module 3: Using Microsoft ADO.NET to Access Data 3 The ADO.NET Object Model .ASPX Page DataReader Command Company: Company: Northwind Northwind Traders Traders Database Database Connection DataAdapter DataView DataView DataSet .ASPX Page List-Bound List-Bound Control Control *****************************illegal for non-trainer use****************************** ADO.NET evolved from the ADO data access model. By using ADO.NET, you can develop applications that are robust and scalable, and that can use XML. ADO.NET has some of the same objects as ADO (like the Connection and Command objects), and introduces new objects, such as the Dataset, DataReader, and DataAdapter. Connection Objects Connection objects are used to talk to databases. They have properties, such as DataSource, UserID, and Password, which are needed to access a particular DataSource. Commands travel over connections, and result sets are returned in the form of streams that can be read by DataReaders or pushed into DataSet objects. There are two kinds of connection objects in ADO.NET: SqlConnection and OleDbConnection. Command Objects Command objects contain the information that is submitted to a database. A command can be a stored procedure call, an update statement, or a statement that returns results. You can also use input and output parameters and return values. In ADO.NET, you can use two kinds of command objects: SqlCommand and OleDbCommand. 4 Module 3: Using Microsoft ADO.NET to Access Data DataReader Objects A DataReader is a read-only/forward-only view on the data. It provides a simple and lightweight way of traversing through recordsets. For example, if you wanted to simply show the results of a search list in a Web page, using a DataReader is an ideal way to accomplish this. A DataReader is returned after executing a command. It works similarly to a recordset in ADO, allowing you to simply loop through the records. ADO.NET includes two types of DataReader objects: the SqlDataReader for Microsoft SQL Server™ version 7.0 (or later) data, and the OleDbDataReader for ADO data. The DataReader object is database-specific. The behavior for the SqlDataReader may differ from the behavior for the OleDbDataReader and additional DataReader objects that are introduced in the future. You use the OleDbCommand and SqlCommand objects and the ExecuteReader method to transfer data into a DataReader. DataSet Objects The DataSet is designed to handle the actual data from a data store. The DataSet provides a rich object model to work with when passing data between various components of an enterprise solution. The DataSet object is generic. The behavior of a DataSet is completely consistent regardless of the underlying database, SQL or OLE DB. The DataSet object represents a cache of data, with database-like behavior. It contains tables, columns, relationships, constraints, and data. Data coming from a database, an XML file, code, or user input can be entered into DataSet objects and converted into files, forms, or databases. As changes are made to the DataSet, they are tracked in a way similar to the way changes are tracked in a word processing document. The DataSet object has a collection of DataTable objects. A DataTable represents one table of in-memory data. It contains a collection of columns that represents the table's schema. A DataTable also contains a collection of rows, representing the data contained in the table. You use the OleDbDataAdapter and SqlDataAdapter objects and the Fill method to get data into a DataSet. DataView Objects A DataView provides a custom view of a data table. You can think of the DataView as the equivalent of the ADO disconnected recordset, because it contains a single view on top of the table data. You can use a DataView to specify criteria for filtering and sorting a DataSet. Note A DataSet is not a recordset. A DataView is more analogous to a recordset. Module 3: Using Microsoft ADO.NET to Access Data 5 DataAdapter Object While the DataSet object provides a tool for in-memory data storage, you need another tool to create and initialize the various tables. This tool is the DataAdapter object. It represents a centralized console that hides the details of working with connections and commands. The DataAdapter object allows for the retrieval and saving of data between a DataSet object and the source data store. It is responsible for pulling out data from the physical store and pushing it into data tables and relations. The DataAdapter object is also responsible for transmitting any update, insertion, or deletion to the physical database. You can use four command objects to make any updates: UpdateCommand, InsertCommand, DeleteCommand, and SelectCommand. The DataAdapter object exists in two forms: SqlDataAdapter objects and OleDbDataAdapter objects. The data source is SQL Server for SqlDataAdapter objects and any other OLE DB provider for OleDbDataAdapter objects. 6 Module 3: Using Microsoft ADO.NET to Access Data Animation: Using ADO.NET to Access Data ******************** *********illegal for non-trainer use****************************** In this animation, you will learn how to access data by using ADO.NET and how you can display that data in an ASP.NET page. To view the animation, open the file 2063B_03A001.swf from the folder Media. Module 3: Using Microsoft ADO.NET to Access Data 7 Recordsets vs. DataSets Feature Recordset DataSet Number of tables One table Multiple tables Relationships Based on join Includes relationships Moving through data Move row-by-row Navigate via relationships Data connections Connected or disconnected Disconnected Transmitting data COM marshalling Transmit XML file *****************************illegal for non-trainer use****************************** In ADO, the in-memory representation of database data is the recordset. In ADO.NET, it is the DataSet. The DataSet contains a collection of tables and knowledge of relationships between those tables. Each table contains a collection of columns. These objects represent the schema of the DataSet. Each table can then have multiple rows, representing the data held by the DataSet. These rows track their original state along with their current state, so that the DataSet tracks what kinds of changes have occurred. Additionally, the DataSet provides persistence and de-persistence through XML. There are important differences between recordsets and DataSets, which are highlighted in the following table and detailed in the text that follows. Feature Recordset DataSet Number of tables One table Multiple tables Relationships Based on join Includes relationships Moving through data Move row-by-row Navigate via relationships Data connections Connected or disconnected Disconnected Transmitting data COM marshalling Transmit XML file Number of Tables An ADO recordset looks like a single table. If a recordset is to contain data from multiple database tables, it must use a JOIN query, which assembles the data from the various database tables into a single result table. In contrast, an ADO.NET DataSet is a collection of one or more tables. The tables within a data set are called data tables; specifically, they are DataTable objects. 8 Module 3: Using Microsoft ADO.NET to Access Data Relationships Typically, a DataSet also contains relationships. A relationship within a DataSet is analogous to a foreign-key relationship in a database. In ADO.NET, a DataRelation represents the relationship. Moving Through Data In ADO.NET, the methods you use to read or modify data differ from the programming methods you use in ADO in the following ways: n In ADO, you scan sequentially through the rows of the recordset. n In ADO.NET, you employ a navigation paradigm, moving from a row of one data table to the corresponding row or rows of another data table by following the relationship. Data Connections In ADO.NET, the DataSet provides disconnected access to database data. In ADO, the recordset can provide disconnected access, but is typically used to provide connected access. Transmitting Data To transmit an ADO disconnected recordset from one component to another, you use COM marshalling. To transmit an ADO.NET data set, you simply transmit an XML file. Module 3: Using Microsoft ADO.NET to Access Data Using Namespaces n Use the Import Construct to Declare Namespaces <%@ <%@ <%@ <%@ n Import Import Namespace="System.Data" Namespace="System.Data" %> %> Import Namespace="System.Data.SqlClient" Import Namespace="System.Data.SqlClient" %> %> Namespaces Used with ADO.NET Include: l System.Data l System.Data.OleDb l System.Data.SqlClient l System.Data.XML l System.Data.SqlTypes *****************************illegal for non-trainer use****************************** The Microsoft .NET Framework is an object-oriented system. When using specific parts of the framework, you need to include references to the appropriate namespace in your ASP.NET page. When using ADO.NET from either Microsoft Visual Basic ® 7.0 or Microsoft VisualC#™ , you must reference the System.Data namespace, plus either the System.Data.OleDb or System.Data.SqlClient namespace, depending on the data source you choose to use. System.Data provides the code facilities, while System.Data.OleDb and System.Data.SqlClient are the namespaces for the two managed providers. In the C# programming language, you use the keyword Using to import a namespace. In Visual Basic, you declare namespaces at the top of an ASP.NET page, using the Import construct. <%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.SqlClient" %> 9 10 Module 3: Using Microsoft ADO.NET to Access Data The following table summarizes the list of available namespaces with ADO.NET. Namespace Contains System.Data Base objects and types for ADO.NET System.Data.OleDb Managed OLE DB data store objects System.Data.SqlClient SQL Server specific implementations of ADO.NET objects System.Data.XML XML objects System.Data.SqlTypes SQL data types Module 3: Using Microsoft ADO.NET to Access Data 11 Connecting to a Data Source n Using SqlConnection Dim Dim strConn strConn As As String String == __ "server=localhost; "server=localhost; uid=sa;pwd=; uid=sa;pwd=; database=northwind" database=northwind" Dim Dim conn conn As As SqlConnection SqlConnection == New New SqlConnection(strConn) SqlConnection(strConn) n Using OleDbConnection Dim Dim strConn strConn As As String String == "Provider= "Provider= SQLOLEDB.1; SQLOLEDB.1; "" && __ "Data "Data Source=localhost; Source=localhost; uid=sa; uid=sa; pwd=; pwd=; "" && __ "InitialCatalog=northwind;" "InitialCatalog=northwind;" Dim Dim conn conn As As OleDbConnection OleDbConnection == __ New OleDbConnection(strConn) New OleDbConnection(strConn) *****************************illegal for non-trainer use****************************** When you connect to a database through an ASP.NET page, there are two routes that you can take: use OLE DB or use the native SQL provider. The native SQL provider is faster, but you must be using Microsoft SQL Server as your database. If you are using Microsoft Access, Microsoft Excel, a commadelimited file, or some other data source, you must use the OLE DB provider. You can use the OLE DB provider with a Microsoft SQL Server database; however, it is not as fast as using the native SQL provider. The Connection object defines how to connect to a specific data store. The .NET framework provides two Connection objects: SqlConnection and OleDbConnection. The SqlConnection object defines how to connect to SQL Server databases and the OleDbConnection object allows you to establish a connection to a database through an OLE DB provider. Using SqlConnection The following code illustrates how to create and open a connection to a Microsoft SQL Server database by using the SqlConnection object. Dim strConn As String = _ "server=localhost;uid=sa;pwd=;database=northwind" Dim conn As SqlConnection = New SqlConnection(strConn) 12 Module 3: Using Microsoft ADO.NET to Access Data Using OleDbConnection For the OLE DB Managed Provider, the connection string format is quite similar to the connection string format used in OLE DB. The following code illustrates how to create and open a connection to a Microsoft SQL Server database by using OleDbConnection. Dim strConn As String = "Provider=SQLOLEDB.1; " & _ "Data Source=localhost; uid=sa; pwd=; " & _ "Initial Catalog=northwind;" Dim conn As OleDbConnection = New OleDbConnection(strConn) We will be using SqlConnection objects for the examples in this module. Implementation is slightly different for using OleDbConnection objects. For more information about using OleDbConnection objects, search for OleDbConnection in the Microsoft .NET Framework SDK documentation. Module 3: Using Microsoft ADO.NET to Access Data u Accessing Data with DataSets n Using DataSets to Read Data n Storing Multiple Tables in a DataSet n Using DataViews n Displaying Data in the DataGrid Control n Demonstration: Displaying Data in a DataGrid n Using Templates n Using the Repeater Control n Demonstration: Displaying Data in a Repeater Control *****************************illegal for non-trainer use****************************** ADO.NET provides two ways to access data, DataSets and DataReaders. In this section, you will learn how to access data by using DataSets. You will also learn about DataViews and displaying data in list-bound controls. At the end of the section, you will learn how to customize a list-bound control by using templates. 13 14 Module 3: Using Microsoft ADO.NET to Access Data Using DataSets to Read Data n Create the Database Connection n Store the Query in a SqlDataAdapter Dim Dim cmdAuthors cmdAuthors As As SqlDataAdapter SqlDataAdapter cmdAuthors = New cmdAuthors = New SqlDataAdapter SqlDataAdapter __ ("select ("select ** from from Authors", Authors", conn) conn) n Create and Populate the DataSet with DataTables Dim Dim ds ds As As DataSet DataSet ds = New ds = New DataSet() DataSet() cmdAuthors.Fill(ds, cmdAuthors.Fill(ds, "Authors") "Authors") *****************************illegal for non-trainer use****************************** After you establish a connection to a database, you can access its data. ADO.NET provides multiple ways to access data. Using DataSets The DataSet object is the centerpiece of ADO.NET. It represents a complete set of data, including multiple, related tables, and constraints. Although a DataSet stores data, you need DataAdapter objects to create and initialize the various tables. You also need the Fill method to populate a DataSet with the results from a query. The Fill method takes two parameters: a DataSet instance and a string. The DataSet instance represents the DataSet to be filled, and the string identifies the DataTable that will be created inside the DataSet. A DataSet can contain many DataTables. You use the string supplied to the Fill method to reference the DataTable after it is created. Module 3: Using Microsoft ADO.NET to Access Data 15 The following code example illustrates how to create a SqlDataAdapter object that contains the query statement. The Fill method then populates the DataSet with the results from the query. 'Create a connection Dim conn As SqlConnection = New SqlConnection _ ("server=localhost;uid=sa;pwd=;database=pubs") 'Create the DataAdapter Dim cmdAuthors As SqlDataAdapter = New SqlDataAdapter _ ("select * from Authors", conn) 'Create and populate the DataSet Dim ds As DataSet ds= New DataSet() cmdAuthors.Fill(ds, "Authors") 16 Module 3: Using Microsoft ADO.NET to Access Data Storing Multiple Tables in a DataSet n Add the First Table command command == New New SqlDataAdapter SqlDataAdapter __ ("select * from ("select * from Authors", Authors", conn) conn) command.Fill(ds, command.Fill(ds, "Authors") "Authors") n Add the Subsequent Table(s) command.SelectCommand command.SelectCommand == New New SQLCommand SQLCommand __ ("select ("select ** from from Titles", Titles", conn) conn) command.Fill(ds, command.Fill(ds, "Titles") "Titles") Books DataSet Authors Data Tables *****************************illegal for non-trainer use****************************** A DataSet can contain multiple tables. You can retrieve multiple tables from a database and store them in a DataSet. Note You can store tables from different databases in the same DataSet. å To retrieve and store multiple tables in a DataSet 1. Create and populate the first DataSet. ds = New DataSet() SQL = "Select * from Authors" command = New SqlDataAdapter (SQL, conn) command.Fill(ds, "Authors") 2. Reset the SelectCommand, InsertCommand, or DeleteCommand property of the DataAdapter object to a new Command object with a new SQL statement. command.SelectCommand = New SqlCommand _ ("select * from Titles", conn) 3. Call Fill again. command.Fill(ds, "Titles") Module 3: Using Microsoft ADO.NET to Access Data The following code shows how you can add two tables from two different queries, one for authors and the other for titles, to the same DataSet. Dim Dim Dim Dim Dim strConn As String conn As SqlConnection SQL As String command As SqlDataAdapter ds As DataSet 'create connection to database strConn = "server=localhost;uid=sa;pwd=;database=pubs" conn = New SqlConnection(strConn) 'fill DataSet with first set of data SQL = "Select * from Authors" command = New SqlDataAdapter (SQL, conn) ds = New DataSet() command.Fill(ds, "Authors") 'fill DataSet with second set of data SQL = "select * from Titles" command.SelectCommand = New SqlCommand(SQL, conn) command.Fill(ds, "Titles") 17 18 Module 3: Using Microsoft ADO.NET to Access Data Using DataViews n DataViews Can be Customized to Present a Subset of Data from a DataTable n The DefaultView Property Returns the Default DataView for the Table Dim Dim dv dv as as DataView DataView dv dv == ds.Tables("Authors").DefaultView ds.Tables("Authors").DefaultView n Setting Up a Different View of a DataSet Dim Dim dv dv as as DataView DataView dv dv == New New DataView DataView (ds.Tables("Authors")) (ds.Tables("Authors")) dv.RowFilter dv.RowFilter == "state "state == 'CA'" 'CA'" *****************************illegal for non-trainer use****************************** To display the data held in a DataSet, you need to use a DataView. DataViews can be customized to present a subset of data from the DataTable. This capability allows you to have two controls bound to the same DataTable, but showing different versions of the data. For example, one control may be bound to a DataView that shows all the rows in the table, and a second may be configured to display only the rows that have been deleted from the DataTable. Each DataTable in a DataSet has a DefaultViewproperty, which returns the default view for the table. You can access the default DataView on a DataSet as follows: Dim dv As DataView dv = ds.Tables("Authors").DefaultView Note The DataSet object contains a Tables collection. You reference the DataTable you are interested in by name. You can also create a view of a subset of the data in a DataTable. For example, you can set the RowFilter property on a DataView to retrieve only authors from California. Dim dv as DataView dv = New DataView (ds.Tables("Authors")) dv.RowFilter = "state = 'CA'" For more information on the properties of the DataView object, see the Microsoft .NET Framework SDK documentation. Module 3: Using Microsoft ADO.NET to Access Data 19 Displaying Data in the DataGrid Control n Create the Control <asp:DataGrid <asp:DataGrid id="dgAuthors" id="dgAuthors" runat="server" runat="server" /> /> n Bind to a DataSet dgAuthors.DataSource=ds dgAuthors.DataSource=ds dgAuthors.DataMember="Authors" dgAuthors.DataMember="Authors" dgAuthors.DataBind() dgAuthors.DataBind() *****************************illegal for non-trainer use****************************** Displaying data from a data source is extremely simple and flexible in ASP.NET. ASP.NET includes a set of controls that perform the function of displaying data. The developers only need to bind these controls to a data source. To display data on the client, you can use any list-bound control, such as DataGrid, DataList, or DataRepeater. Using the DataGrid Control The DataGrid control is designed to produce Hypertext Markup Language (HTML) output that resembles a spreadsheet. <asp:DataGrid id="dgAuthors" runat="server" /> To bind a DataSet to a DataGrid control, you first need to set the DataSource property of the DataGrid to a DataSet, DataTable, or DataVieweither the DefaultView property of a DataSet or a custom DataView objectand then call the DataBind method. If you set the DataSource property of the DataGrid directly to a DataSet, the DataTable with index 0 is used by default. To specify a different DataTable, set the DataMember property of the DataGrid to the name of the DataTable. Example Binding to a DataSet dgAuthors.DataSource = ds dgAuthors.DataMember = "Authors" dgAuthors.DataBind() 20 Module 3: Using Microsoft ADO.NET to Access Data Alternatively, you can use the Tables collection of the DataSet to assign the DataTable directly to the DataSource of the DataGrid, as in the following example: dgAuthors.DataSource = ds.Tables("Authors") dgAuthors.DataBind() If you want to display a different view of data in the DataGrid control, create a new DataView object from the DataSet and bind that to the control. For example, the following code will display only those authors living in California. Example Using a Custom View Dim dv as DataView dv = New DataView (ds.Tables("Authors")) dv.RowFilter = "state = 'CA'" dgAuthors.DataSource = dv dgAuthors.DataBind() The following illustration shows the default format of the DataGrid control displaying data for authors living in California. Module 3: Using Microsoft ADO.NET to Access Data 21 Demonstration: Displaying Data in a DataGrid *****************************illegal for non-trainer use****************************** In this demonstration, you will see how to read data from a database into a DataSet and then display it in a DataGrid control. å To run the demonstration 1. Edit the file <install folder>\DemoCode\Mod03\grid.aspx. a. There are two DataGrid controls. The first of these sets the formatting attributes to make the DataGrid control more aesthetically pleasing to the viewer. Select one of the DataGrid controls and view the Properties window in Microsoft Visual Studio ® .NET to learn about the properties of the DataGrid control. Look specifically at the Style properties. b. The Page_Load event procedure makes a connection to the database and creates a DataSet. c. The first DataGrid is bound to the DefaultView of the DataSet. d. The second DataGrid is bound to a new DataView that is a filtered version of the data. 2. View the page in Microsoft Internet Explorer. 22 Module 3: Using Microsoft ADO.NET to Access Data Using Templates HeaderTemplate HeaderTemplate ItemTemplate ItemTemplate SeparatorTemplate SeparatorTemplate AlternatingItem AlternatingItem Template Template FooterTemplate FooterTemplate *****************************illegal for non-trainer use****************************** Most ASP.NET controls have a standard appearance, but the user may require something different. ASP.NET allows users to customize the appearance of some controls by using templates. When a control supports a template, you add the ASP.NET template elements. Then, within the template, you insert the elements and controls that you want to be displayed. List-bound controls support five types of templates. The Repeater and DataList controls can use these templates directly. The DataGrid control can use these templates only if they are bound to a column. Template Use HeaderTemplate Elements to render once before any data-bound rows have been rendered. A typical use is to begin a container element, such as a table. ItemTemplate Elements that are rendered once for each row in the data source. To display data in the ItemTemplate , declare one or more Web controls and set their data-binding expressions to evaluate to a field in the Repeater control's (that is, in the container control's) DataSource: <asp:Label runat="server" Text="<%#Container.DataItem.LstName %>" /> AlternatingItemTemplate Elements that are rendered for every other row in the Repeater control. SeparatorTemplate Elements to render between each row, typically line breaks (<BR> tags), lines (<HR> tags), and so on. FooterTemplate Elements to render once when all data-bound rows have been rendered. A typical use is to close an element opened in the HeaderTemplate item (with a tag such as </TABLE>). Module 3: Using Microsoft ADO.NET to Access Data 23 For more information about using templates with the DataGrid control, refer to the “DataGrid Web Control”topic in the Microsoft .NET Framework SDK documentation. 24 Module 3: Using Microsoft ADO.NET to Access Data Using the Repeater Control n Create the Control and Bind to a DataView n Display Data in Templated Elements <asp:Repeater <asp:Repeater id="repList" id="repList" runat="server"> runat="server"> <ItemTemplate> <ItemTemplate> <%# <%# Container.DataItem("au_lname") Container.DataItem("au_lname") %> %> </ItemTemplate> </ItemTemplate> </asp:Repeater> </asp:Repeater> *****************************illegal for non-trainer use****************************** DataList and Repeater controls give a developer greater flexibility over the rendering of list-like data. You might call these controls appearance-less, because they have no standard appearance; that is, they have no default layout or styles. The way data is displayed is completely determined by the HTML in the control's templates, which describe how to present data items. An advantage of the DataList control is that it allows you to display items in multiple columns. As a result, elements can flow horizontally or vertically. For more information about using templates with the DataList control, refer to the “DataList Web Control”topic in the Microsoft .NET Framework SDK documentation. To use the DataList or Repeater controls, you first bind the controls to a DataTable in a DataSet as shown in the following example code: replist.DataSource= ds Replist.DataMember= "Authors" replist.DataBind() Next, you bind data held in the Repeater control to templates that describe how to display the data. For example, to display a list of authors’last names, use the following binding syntax in an ItemTemplate template: <asp:Repeater id="repList" runat="server"> <ItemTemplate> <%# Container.DataItem("au_lname") %><BR> </ItemTemplate> </asp:Repeater> Module 3: Using Microsoft ADO.NET to Access Data The <% %> is the syntax for inline server-side code, the # is the binding expression, the Container object refers to the current record of the Repeater control, and the DataItem method refers to a field in the record. You are binding to a field in the current record. Example of a Repeater Control The following sample code creates a very simple table to display information about the set of authors retrieved from the database. <asp:Repeater id="repList" runat="server"> <HeaderTemplate> <table> <tr> <td>Lastname</td> <td>Firstname</td> <td>State</td> </tr> </HeaderTemplate> <ItemTemplate> <tr> <td><%# Container.DataItem("au_lname") %></td> <td><%# Container.DataItem("au_fname") %></td> <td><%# Container.DataItem("state") %></td> </tr> </ItemTemplate> <FooterTemplate> </table> </FooterTemplate> </asp:Repeater> The following illustration shows the table created by the above sample code: 25 26 Module 3: Using Microsoft ADO.NET to Access Data Using the AlternatingItemTemplate with the Repeater Control As mentioned previously, DataList and Repeater controls can use the templates directly. The following is an example of using the AlternatingItemTemplate with the Repeater control. The use of AlternatingItemTemplate highlights every alternate line. <AlternatingItemTemplate> <tr> <td style="background-color: green"> <%# Container.DataItem("au_lname") %></td> <td style="background-color: green"> <%# Container.DataItem("au_fname") %></td> <td style="background-color: green"> <%# Container.DataItem("state") %></td> </tr> </AlternatingItemTemplate> The following illustration shows the table with the AlternatingItemTemplate : Module 3: Using Microsoft ADO.NET to Access Data Demonstration: Displaying Data in a Repeater Control *****************************illegal for non-trainer use****************************** In this demonstration, you will see how to display data in a Repeater control. å To run the demonstration 1. Edit the file <install folder>\DemoCode\Mod03\repeater.aspx. a. The Page_Load event procedure makes a connection to the database, creates a DataSet, and binds it to the two Repeater controls. b. The first Repeater control, repList, simply outputs the data from the DataSet in a list. c. The second Repeater control, repTable, uses HeaderTemplate, ItemTemplate, AlternatingItemTemplate, and FooterTemplate templates to display data in a table. 2. View the page in Microsoft Internet Explorer. 27 28 Module 3: Using Microsoft ADO.NET to Access Data u Using Stored Procedures n Calling Stored Procedures n Passing Parameters n Calling Action Stored Procedures n Demonstration: Calling Stored Procedures *****************************illegal for non-trainer use****************************** In the past, data processing has been primarily connection-based. Now, in an effort to make multi-tiered applications more efficient, data processing is turning to a message-based approach that revolves around chunks of information. In ADO.NET, this is accomplished by the DataAdapter object, which provides a bridge to retrieve and save data between a DataSet object and its source data store. The DataAdapter object accomplishes this by invoking the appropriate SQL commands against the data store. Both the SqlDataAdapter and the OleDbDataAdapter classes feature four command objects, InsertCommand, UpdateCommand, DeleteCommand, and SelectCommand. These objects provide the create , update, delete, and read functions for a specific DataTable in the DataSet. These command objects are used when you want to perform a number of updates at the same time. Instead of having one stored procedure to do it all, you can put SQL Statements in each object and call the Update method. For more information about these command objects, see the .NET Framework SDK documentation. However, the easier and more commonly used method of updating data in a database is to use stored procedures. You can use stored procedures to read and modify data from a database. You can call stored procedures both from DataAdapter and Command objects. Module 3: Using Microsoft ADO.NET to Access Data 29 Calling Stored Procedures n Stored Procedures Provide Security for Database n Set Up the DataAdapter Dim Dim cmd cmd as as SqlDataAdapter SqlDataAdapter cmd = New cmd = New SqlDataAdapter() SqlDataAdapter() cmd.SelectCommand cmd.SelectCommand == New New SqlCommand() SqlCommand() With With cmd.SelectCommand cmd.SelectCommand .Connection .Connection == conn conn .CommandText .CommandText == "ProductCategoryList" "ProductCategoryList" .CommandType .CommandType == CommandType.StoredProcedure CommandType.StoredProcedure End End With With n Run the Stored Procedure and Store Returned Records cmd.Fill cmd.Fill (ds, (ds, "Categories") "Categories") *****************************illegal for non-trainer use****************************** A stored procedure is a sequence of Transact-SQL (T-SQL) statements stored on the database server. Stored procedures provide a level of security to a database. The database designer can create stored procedures to retrieve and modify data, and not allow developers access to the actual tables of the database. In this way, the database designer can then change the structure of the database without breaking applications that use it. Stored procedures are able to return a set of records. This will not always be the case. Stored procedures can encapsulate repetitive tasks and execute them efficiently. When you call a stored procedure that returns a set of records, use a DataAdapter and the Fill method. When you call a stored procedure that performs some function on the database but does not return a set of records, use a Command object and the ExecuteNonQuery method. Calling a Select Stored Procedure Using stored procedures in ADO.NET is similar to ADO. You create a command object and point it to the database connection. Next, you set the CommandText property to the name of the stored procedure and the CommandType property to CommandType.StoredProcedure. The following is the ProductCategoryList stored procedure. It returns a list of Categories. Procedure ProductCategoryList As SELECT CategoryID,CategoryName FROM Categories 30 Module 3: Using Microsoft ADO.NET to Access Data The following example code uses a Connection object and a DataAdapter object to call the ProductCategoryList stored procedure: Dim cmd as SqlDataAdapter cmd = New SqlDataAdapter() cmd.SelectCommand = New SqlCommand() With cmd.SelectCommand .Connection = conn .CommandText = "ProductCategoryList" .CommandType = CommandType.StoredProcedure End With Note You can directly set the connection and command text when creating the SqlDataAdapter object: cmd = New SqlDataAdapter("ProductCategoryList", conn) You then simply need to set the CommandType property before you call the Fill method. To execute the stored procedure, call the Fill method of the SqlDataAdapter object. This fills a DataTable object with the returned records of the stored procedure. cmd.Fill(ds, "Categories") After you have filled a DataTa ble with the results of a Select stored procedure, you can bind it to a list-bound control to display the data. Module 3: Using Microsoft ADO.NET to Access Data 31 Passing Parameters n Create Parameter, Set Direction and Value, Add to the Parameters Collection workParam workParam == New New SqlParameter("@CategoryID", SqlParameter("@CategoryID", __ SQLDbType.Int) SQLDbType.Int) workParam.Direction workParam.Direction == ParameterDirection.Input ParameterDirection.Input workParam.Value workParam.Value == CInt(txtCatID.Text) CInt(txtCatID.Text) cmd.SelectCommand.Parameters.Add(workParam) cmd.SelectCommand.Parameters.Add(workParam) n Run Stored Procedure ds ds == new new DataSet() DataSet() cmd.Fill(ds, cmd.Fill(ds, "Products") "Products") *****************************illegal for n o n-trainer use****************************** When using Microsoft SQL Server, or other procedure-based databases, parameters can be used to pass and retrieve information from the database. Using parameters in ADO.NET works just as it does in ADO. You can pass the string in the command or use the parameters collection. When using parameters, the names of the parameters added to the parameters collection of the command must match the names of the parameter markers in the stored procedure. Parameters Your application can pass specific data to a stored procedure by using parameters. The following table describes the types of parameters available to you. Direction Use Input Used by your application to send specific data values to a stored procedure. Output Used by a stored procedure to send specific values back to the calling application. InputOutput Used by a stored procedure to both retrieve information sent by your application and to send specific values back to the application. ReturnValue Used by a stored procedure to send a return value back to the calling application. 32 Module 3: Using Microsoft ADO.NET to Access Data Creating a Parameter To create a parameter for the SqlDataAdapter object, create a new SqlParameter object with the name and data type of the parameter. Next, set the Direction property of the new parameter to indicate how the parameter is used by the stored procedure. If the stored procedure returns a return value, create a parameter named returnValue . If the parameter is an input parameter, set the Value property to specify the data that should be sent to the server. For example, the ProductsByCategory stored procedure takes one input parameter: Procedure ProductsByCategory ( @CategoryID int ) As SELECT ProductID, ModelName, UnitCost, ProductImage, Chairman FROM Products WHERE CategoryID=@CategoryID To call the ProductsByCategory stored procedure, create an input parameter named @CategoryID and set its value to the value of a text box. Dim cmd as SqlDataAdapter cmd = New SqlDataAdapter () cmd.SelectCommand = New SqlCommand() With cmd.SelectCommand .Connection = conn .CommandText = "ProductCategoryList" .CommandType = CommandType.StoredProcedure End With Dim workParam as SqlParameter workParam = New SqlParameter("@CategoryID", SqlDbType.Int) workParam.Direction = ParameterDirection.Input workParam.Value = CInt(txtCatID.Text) After you have created the parameter, use the Add method of the Parameters collection of the SelectCommand object. The Add method takes a SqlParameter as an argument. If a stored procedure has more than one parameter, it does not matter what order you add them in because you create them by name. cmd.SelectCommand.Parameters.Add(workParam) Use the Fill method to run the stored procedure and retrieve the records. ds = new DataSet() cmd.Fill(ds, "Products") Module 3: Using Microsoft ADO.NET to Access Data 33 Calling Action Stored Procedures n Use SQLCommand Object Dim Dim myCmd myCmd As As SqlCommand SqlCommand == New New SqlCommand SqlCommand __ ("OrdersCount", conn) ("OrdersCount", conn) n Call the ExecuteNonQuery Method conn.Open() conn.Open() myCmd.ExecuteNonQuery() myCmd.ExecuteNonQuery() conn.Close() conn.Close() n Retrieve Output Parameters curSales curSales == myCmd.Parameters("@ItemCount").Value myCmd.Parameters("@ItemCount").Value *****************************illegal for non-trainer use****************************** When calling an update, insert, or delete stored procedure, you use the SqlCommand directly and call the ExecuteNonQuery method to run it. The OrdersCount stored procedure takes a customer’s ID and returns the number of outstanding orders that customer has: Procedure OrdersCount ( @CustomerID int, @ItemCount int OUTPUT ) As SELECT @ItemCount=COUNT(OrderID) FROM Orders WHERE CustomerID=@CustomerID Because this stored procedure does not return a set of records, you do not need to use a DataAdapter object. Instead, you can use a Command object directly, and call the ExecuteNonQuery method to run the stored procedure. 34 Module 3: Using Microsoft ADO.NET to Access Data To call this stored procedure, create an input parameter named @CustomerID, an output parameter named @ItemCount, add them to the Parameters collection of a Command object, and then call ExecuteNonQuery to run the stored procedure: Dim myCmd As SqlCommand = New SqlCommand("OrdersCount", conn) myCmd.CommandType = CommandType.StoredProcedure 'add an input parameter workParam = New SqlParameter("@CustomerID", SqlDbType.Int) workParam.Direction = ParameterDirection.Input workParam.Value = CInt(txtCustID.Text) myCmd.Parameters.Add (workParam) 'add an output parameter workParam = New SqlParameter("@ItemCount", SqlDbType.Int) workParam.Direction = ParameterDirection.Output myCmd.Parameters.Add ( workParam) 'execute the stored procedure conn.Open() myCmd.ExecuteNonQuery() conn.Close() Retrieving an Output Parameter If you need to retrieve a value from a stored procedure that returns a value or sets an output parameter, use the Parameters collection to find the value of the output parameter. You can reference the value of the output parameter by name or index. The following example code retrieves the value of the @ItemCount output parameter by name: curSales = myCmd.Parameters("@ItemCount").Value Module 3: Using Microsoft ADO.NET to Access Data 35 Demonstration: Calling Stored Procedures *****************************illegal for non-trainer use****************************** In this demonstration, you will see how to call stored procedures from DataSets, both with and without parameters. å To run the demonstration 1. Edit the file <install folder>/DemoCode/2063/mod03/storedprocedure.aspx There are three sub-procedures called from the Page_Load event procedure that call stored procedures in different ways. a. The displayCategories procedure calls a stored procedure that has no parameters. b. The displayProducts procedure calls a stored procedure that has one input parameter. c. The displayOrderCount procedure calls a stored procedure that has input and output parameters. 2. View the page in Internet Explorer. The first DataGrid is filled from the displayCategories procedure. 3. Enter a category number in the text box and click Get Products. The second DataGrid is filled from the displayProducts procedure. 4. Enter a customer number in the textbox (such as 31 or 33) and click Get Order Count. The <span> element is filled from the displayOrderCount procedure. 36 Module 3: Using Microsoft ADO.NET to Access Data 5. View the source code of the page. The Hidden field in the form contains the DataSet. 6. In Visual Studio .NET, you can view the objects in the Conf SQL Server database. a. Open the Server Explorer window. b. Expand Servers , then <Computer Name>, then SQL Servers , then <Computer Name>, then Conf. You can view the tables and other objects in the SQL Server database. Module 3: Using Microsoft ADO.NET to Access Data 37 Lab 3: Using ADO.NET to Access Data *****************************illegal for non-trainer use****************************** Objectives After completing this lab, you will be able to: n Connect to a database. n Create and fill a DataSet with data from a database. n Display data using the Repeater control. Prerequisite Before working on this lab, you must know how to use Web controls in an ASP.NET page. Lab Setup There are starter and solution files associated with this lab. The starter files are in the folder <install folder>\Labs\Lab03\Starter and the solution files for this lab are in the folder <install folder>\Labs\Lab03\Solution. Scenario There are five tracks in the ASP.NET conference. To view these tracks, a user goes to the ProductsList.aspx page. In Exercise 1, you will connect to the database, create a DataSet , fill it, and display it in a Repeater control. In Exercise 2, you will display the alternating lin e differently. In Exercise 3 (optional), you will use a DataList control to display a menu of items available in the ASP.NET conference. Estimated time to complete this lab: 60 minutes 38 Module 3: Using Microsoft ADO.NET to Access Data Exercise 1 Accessing a SQL Database by Using ADO.NET In this exercise, you connect to the Conf SQL Server database and call a stored procedure. You then display the data in a Repeater control. å To connect to the database 1. Open the file ProductsList.aspx in the folder InetPub\wwwRoot\ASPNET. 2. Locate the comment: ' TO DO: read data from database 3. Create a new connection to the Conf database. a. Declare a string variable named strConn. b. Set the variable to: "server=localhost;uid=sa;pwd=1Aspnet;database=Conf" c. Declare a SqlConnection variable named conn. d. Create a new SqlConnection object from the strConn variable and save it in the conn variable. Your code should look like the following: Dim strConn As String Dim conn As SqlConnection strConn = _ "server=localhost;uid=sa;pwd=1Aspnet;database=Conf" conn = New SqlConnection(strConn) Module 3: Using Microsoft ADO.NET to Access Data 39 å To call the ProductsByCategory stored procedure 1. Create a new SqlDataAdapter variable to call the ProductsByCategory stored procedure. Your code should look like the following: Dim cmdProducts As SqlDataAdapter cmdProducts = _ New SqlDataAdapter("ProductsByCategory", conn) cmdProducts.SelectCommand.CommandType = _ CommandType.StoredProcedure 2. Create an input parameter for the stored procedure with the following properties. Property Value Name @CategoryID Type SqlDbType.Int Value categoryID 3. Add the parameter to the Parameters collection of the SQLDataAdapter variable. Your code should look like the following: Dim paramCategoryID As SqlParameter paramCategoryID = _ new SqlParameter("@CategoryID", SqlDbType.Int, 4) paramCategoryID.Value = categoryID cmdProducts.SelectCommand.Parameters.Add(paramCategoryID) å To create and fill the DataSet 1. Create a new DataSet object. 2. Fill the DataSet by calling the Fill method of the SqlDataAdapter variable. Save the data in a table named Products. Your code should look like the following: Dim dsProducts As New DataSet cmdProducts.Fill(dsProducts, "Products") å To display the data in a Repeater control • At the end of the Page_Load event procedure, display the default view of the Products table in the DataSet by binding it to the repList Repeater control. Your code should look like the following: repList.DataSource = _ dsProducts.Tables("Products").DefaultView repList.DataBind() 40 Module 3: Using Microsoft ADO.NET to Access Data å To save and test your work 1. Save your changes to ProductsList.aspx. 2. Using Internet Explorer , view the ProductsList.aspx page by viewing http://localhost/ASPNET/ProductsList.aspx?CategoryID=15 Note The ProductsList.aspx page can display any of the categories of information in the Conf database. CategoryID 15 will display the conference tracks. You should see the tracks of the conference, as shown in the following illustration. 3. Change the CategoryID to 14 and reload the page. You should see the Pre-Conference Tutorials of the conference, as shown in the following illustration. Module 3: Using Microsoft ADO.NET to Access Data 41 Exercise 2 Displaying Data Using ASP.NET Controls In this exercise, you will modify the look of the data displayed in the Repeater control on the ProductsList.aspx page by adding an AlternatingItemTemplate. å To add an AlternatingItemTemplate 1. Open the file ProductsList.aspx in the folder InetPub\wwwRoot\ASPNET. 2. Copy the HTML tags for the ItemTemplate template, from <ItemTemplate> to </ItemTemplate>. 3. Paste the copied tags following the ItemTemplate template. 4. Change the start and end tags of the new template to AlternatingItemTemplate, as shown in the following sample code. <AlternatingItemTemplate> </AlternatingItemTemplate> 42 Module 3: Using Microsoft ADO.NET to Access Data 5. Set the background color of the alternating rows to BackgroundColor6, BackgroundColor5, BackgroundColor6, BackgroundColor5. These styles are defined in the conference.css style sheet. To change the appearance of the columns, set the class attribute of the <td> tags to the name of the style as follows: <td class="BackgroundColor6"> The AlternatingItemTemplate template should look like the following: <AlternatingItemTemplate> <tr> <td class="BackgroundColor6"> <%# Container.DataItem("Chairman") %> </td> <td class="BackgroundColor5"> <a href='ProductDetails.aspx?productID= <%# Container.DataItem("ProductID") %>'> <%# Container.DataItem ("ModelName") %><br> </a> </td> <td class="BackgroundColor6"> <b>Price: </b> <%# System.String.Format("{0:c}", _ Container.DataItem("UnitCost")) %> <br> </td> <td class="BackgroundColor5"> <a href='AddToCart.aspx?productID= <%# Container.DataItem("ProductID") %>'> <b>Add To Cart</b> </a> </td> </tr> </AlternatingItemTemplate> Module 3: Using Microsoft ADO.NET to Access Data å To save and test your work 1. Save your changes to ProductsList.aspx. 2. Using Internet Explorer, view the ProductsList.aspx page by viewing http://localhost/ASPNET/ProductsList.aspx?CategoryID=14 Your page should now look like the following illustration. 3. Click on a subject link. 4. Click on an Add to Cart link. 43 44 Module 3: Using Microsoft ADO.NET to Access Data Exercise 3 (Optional) Creating a Menu Page In this exercise, you will create a menu for the Web site. The menu.aspx page reads categories of data from the database and displays them in a DataList Web control. å To create a new page 1. Create a new ASP.NET page named Menu.aspx in the ASPNET Web site. Note There is a Menu.aspx file in the <install folder>\Labs\Lab03\Starter folder that you can add to your project and edit. 2. Create a DataList control named lstMenu. <asp:DataList id="lstMenu" width="145" runat="server"> </asp:DataList> 3. Between the <asp:DataList> and </asp:DataList> tags, create an ItemTemplate template that displays data in an asp:HyperLink control. <ItemTemplate> <asp:HyperLink id="HyperLink1" CssClass="MenuUnselected" Text='<%# Container.DataItem("CategoryName") %>' NavigateUrl='<%# "productslist.aspx?Categor yID=" & _ Container.DataItem("CategoryID") %>' runat="server" /> </ItemTemplate> The Text attribute of the asp:HyperLink control displays the CategoryName field from the DataSet bound to the DataList. The NavigateUrl attribute of the asp:HyperLink control links to the ProductsList.aspx page, passing the ID of the selected category. å To fill the DataList control in the Page_Load event procedure 1. Add an Import statement to import the System.Data namespace. 2. Create a Page_Load event procedure in a <script> section. 3. Add the following code to read categories from the Conf database using a method in the Conference component, and bind them to the lstMenu DataList control: Dim dvMenuItems As DataView Dim products As New Conference.ProductsDB dvMenuItems = products.GetProductCategories(). _ Tables(0).DefaultView 'Bind the DataView of menu items to the list lstMenu.DataSource = dvMenuItems lstMenu.DataBind() Module 3: Using Microsoft ADO.NET to Access Data å To save and test your work 1. Save your changes to Menu.aspx. 2. By using Internet Explorer, go to the Menu.aspx page, http://localhost/ASPNET/menu.aspx The page should look like the following illustration. 3. Test each hyperlink on the Menu.aspx page. 45 46 Module 3: Using Microsoft ADO.NET to Access Data u Accessing Data with DataReaders n Creating a DataReader n Reading Data from a DataReader n Demonstration: Accessing Data Using DataReaders n Using DataSets vs. DataReaders *****************************illegal for non-trainer use****************************** The benefit of using a DataSet is that it gives you a disconnected view of the database. For long running applications, this is often the best approach. For Web applications, developers usually perform short and simple operations with each request, such as displaying data. For such operations, developers do not need to maintain a DataSet object. In such cases, you can use a DataReader. In this section, you will learn how to read data from a data source by using DataReaders. Module 3: Using Microsoft ADO.NET to Access Data 47 Creating a DataReader n Create and Open the Database Connection Dim Dim conn conn As As SqlConnection SqlConnection == New New SqlConnection SqlConnection __ ("server=localhost;uid=sa;pwd=;database=pubs") ("server=localhost;uid=sa;pwd=;database=pubs") conn.Open() conn.Open() n Create the DataReader From a Command Object Dim Dim cmdAuthors cmdAuthors As As SqlCommand SqlCommand == New New SqlCommand SqlCommand __ ("select ("select ** from from Authors", Authors", conn) conn) Dim Dim dr dr As As SqlDataReader SqlDataReader dr dr == cmdAuthors.ExecuteReader() cmdAuthors.ExecuteReader() n Close the Connection *****************************illegal for non-trainer use****************************** When a large amount of data is being retrieved, holding memory open becomes an issue. For example, reading 10,000 rows out of a database causes a DataTable to allocate and maintain memory for those 10,000 rows for the lifetime of the table. If 1,000 users do this against the same machine at the same time, memory usage becomes critical. To address such situations, the DataReader is designed to produce a read-only, forward-only stream returned from the database. Only one record at a time is ever in memory. There are two DataReader objects, the SqlDataReader and the OleDbDataReader. A DataReader keeps the connection open until the DataReader is closed. To use a SqlDataReader, declare a SqlCommand instead of a SqlDataAdapter. The SqlCommand exposes an ExecuteReader method that takes a SqlDataReader as a parameter. Note that you must explicitly open and close the SqlConnection when you use a SQLCommand. Dim conn As SqlConnection = New SqlConnection _ ("server=localhost;uid=sa;pwd=;database=pubs") conn.Open() Dim cmdAuthors As SqlCommand = New SqlCommand _ ("select * from Authors", conn) Dim dr As SqlDataReader dr = cmdAuthors.ExecuteReader() ... dr.close() conn.Close() 48 Module 3: Using Microsoft ADO.NET to Access Data Error Handling with a DataReader When using connections with the DataReader object, you should always use a Finally blocking technique to ensure that, if anything fails, connections will be closed. Try conn.Open() dr = cmdAuthors.ExecuteReader() 'use the returned data in the datareader Catch e As Exception Console.WriteLine(e.ToString) Finally dr.Close() conn.Close() End Try Module 3: Using Microsoft ADO.NET to Access Data 49 Reading Data from a DataReader n Call Read for Each Record l n Call Get for Each Field l n Returns false when there are no more records Parameter is the ordinal position of the field Call Close to Free Up the Connection myReader.Read() myReader.Read() lblName.Text lblName.Text == myReader.GetString(1) myReader.GetString(1) ++ ", ", "" ++ __ myReader.GetString(2) myReader.GetString(2) myReader.Close() myReader.Close() *****************************illegal for non-trainer use**************************** * * After you have called the ExecuteReader method of the Command object, you access a record in the DataReader by calling the Read method. The default positioning in the DataReader is before the first record, therefore you must call Read before accessing any data. When no more records are available, the Read method returns a null value. Reading Fields from the Current Record To get the data from fields in the current record, call an appropriate Get method, for example, GetDateTime, GetDouble, GetInt32, or GetString. The parameter of the Get method is the ordinal value of the field that you want to read. For example, the following sample code reads the first name and last name fields, both string values, from the first record of the DataReader, by using the GetString() method: myReader.Read() lblName.Text = myReader.GetString(1) + ", " + _ myReader.GetString(2) You can also reference the fields of data in the current record of the data reader by name, and then call an appropriate conversion function, as shown in the following example code: myReader("au_fname").ToString() 50 Module 3: Using Microsoft ADO.NET to Access Data Looping Through All Records To loop through all the records in a DataReader, you can use a While loop, as shown in the following sample code: While myReader.Read() 'do something with the data End While Closing the DataReader While the DataReader is in use, the associated connection is busy serving the DataReader. Therefore, you must call Close to close the DataReader when you are finished using it. myReader.Close() Module 3: Using Microsoft ADO.NET to Access Data 51 Demonstration: Accessing Data Using DataReaders *****************************illegal for non-trainer use****************************** In this demonstration, you will see how to read data from a database by using a SQLDataReader. å To run the demonstration 1. Edit the file <install folder>\DemoCode\Mod03\Datareader.aspx a. The Page_Load event procedure sets up the DataReader and outputs the first record. b. The Page_Unload event procedure closes the connection. 2. View the page in Internet Explorer. 3. Edit the file <install folder>\Democode\Mod03\datareadersp.aspx This page fills a DataReader from a stored procedure and then displays the results. 4. View the page in Internet Explorer. 52 Module 3: Using Microsoft ADO.NET to Access Data Using DataSets vs. DataReaders DataSet 1. Create a database connection 2. Store query in DataAdapter 3. Populate DataSet with Fill method 4. Create DataView 5. Bind DataView to list- bound control DataReader 1. Create a database connection 2. Open the database connection 3. Store query in SqlCommand 4. Populate DataReader with ExecuteReader method 5. Call Read for each record, and Get for each field 6. Manually display data 7. Close the DataReader and the connection *****************************illegal for non-trainer use****************************** The general procedure for accessing databases from ASP.NET is different depending on whether you will be using a DataSet or a DataReader: Using DataSets Using DataReaders 1. Connect to the database by using SqlConnection or OleDbConnection. 1. Connect to the database by using SqlConnection or OleDbConnection. 2. Store the database query in SqlDataAdapter or OleDbDataAdapter objects. 2. Open the connection with the Open method. 3. Populate a DataSet from the DataAdapter by using Fill. 3. Store database query in SqlCommand or OleDbCommand objects. 4. Set up a new DataView for the desired table. 4. Populate a DataReader from the Command by using ExecuteReader method. 5. Bind a server control, such as the DataGrid, to the DataView. 5. Call Read and Get methods of the DataReader to read data. 6. Close the DataRe ader. 7. Close the connection. Module 3: Using Microsoft ADO.NET to Access Data 53 u Binding to XML Data n Overview of XML n Reading XML Data into a DataSet n Demonstration: Reading XML Data into a DataSet *****************************illegal for non-trainer use****************************** HTML is widely used for presenting information on the Web. HTML works well as a presentation language, but it is not suitable for representing data. For example, you can easily format data in an HTML table, but you cannot describe the individual components of the information. To share information between applications, you must have a language that can describe data in a standardized way so that any application, present or future, can understand and use this data correctly. XML is one such standardized language. XML not only helps you structure your data but acts as a common language between different business applications. In this section, you will get an overview of XML. You will also learn how to read and display XML data by using ADO.NET. 54 Module 3: Using Microsoft ADO.NET to Access Data Overview of XML n Machine-Readable and Human-Readable Data n Defines the Data Content and Structure n Separates Structure from Presentation n Allows You to Define Your Own Tags and Attributes <employee> <employee> <name>Jake</name> <name>Jake</name> <salary>25000</salary> <salary>25000</salary> <region>Ohio</region> <region>Ohio</region> </employee> </employee> *****************************illegal for non-trainer use****************************** Businesses today face many problems when it comes to organizing data. They need to meet the following requirements: n Data needs to be readable by both computers and users. n Both the content and the structure of the data need to be defined. n The structure of the data needs to be separate from the presentation of the data. n The structure needs to be open and extensible. XML fulfills all these requirements. XML defines the structure of data in an open and self-describing manner. This allows data to be easily transferred over a network and consistently processed by the receiver. XML describes how data is structured, not how it should be displayed or used. XML documents contain tags that assign meaning to the content of the document. These tags allow programmers to find the data they need in the XML document. For example, the following XML sample contains information about an employee but does not specify how to display this information: <employee> <name>Jake</name> <salary>25000</salary> <region>Ohio</region> </employee> Module 3: Using Microsoft ADO.NET to Access Data 55 XML is considered a markup language because it allows you to define data structure by using markup tags. You can define your own tags that describe the data in whatever way you find useful. XML data is held in a simple, open format that is easily parsed by other applications. The fact that XML documents contain text rather than binary data is another key advantage. Applications can parse an XML document, looking for specific tags of interest to those applications. Unknown tags and their associated data can be freely ignored. 56 Module 3: Using Microsoft ADO.NET to Access Data Reading XML Data into a DataSet n Read the XML File fs fs == New New FileStream FileStream __ (Server.MapPath("schemadata.xml"), (Server.MapPath("schemadata.xml"), __ FileMode.Open, FileMode.Open, FileAccess.Read) FileAccess.Read) n Read the Contents of the File Stream Reader Reader == New New StreamReader(fs) StreamReader(fs) n Read Data from the StreamReader into a DataSet ds.ReadXml(Reader) ds.ReadXml(Reader) *****************************illegal for non-trainer use****************************** DataSets in ADO.NET are designed to extract data in a way that is independent of its data source. Therefore, reading data from an XML source is similar to reading data from a database. To read XML data, you need to import the System.IO namespace in your ASP.NET page. Note You can’t read XML data into a DataReader. You can read it only into a DataSet. For XML data, the DataSet supports a ReadXml method that takes a FileStream as its parameter. The DataSet expects data to be in the following format: <DocumentElement> <TableName> <ColumnName1>column <ColumnName2>column <ColumnName3>column </TableName> <TableName> <ColumnName1>column <ColumnName2>column <ColumnName3>column </TableName> </DocumentElement> value</ColumnName1> value</ColumnName2> value</ColumnName3> value</ColumnName1> value</ColumnName2> value</ColumnName3> Each TableName section corresponds to a single row in the table. Module 3: Using Microsoft ADO.NET to Access Data The following example shows how to read the schema and data from an XML file by using the ReadXml method, the FileStream object, and the StreamReader object. Note that after the data is read into the DataSet, it is indistinguishable from SQL data— the DataGrid binds to it in the same way. å To read XML data and display it in a DataGrid 1. First, open the XML file: Dim fs As FileStream fs = New FileStream _ (Server.MapPath("schemadata.xml"), _ FileMode.Open,FileAccess.Read) 2. Next, attach a StreamReader to the FileStream. Dim Reader As StreamReader Reader = New StreamReader(fs) 3. Finally, read the XML data from the StreamReader into the DataSet. Dim ds As New DataSet ds.ReadXml(Reader) After the data has been read into a DataSet, the repeated elements in the XML become the columns in the DataSet and can be bound to any control to be displayed on the client. The full sample code is as follows: Dim ds As New DataSet Dim fs As FileStream Dim Reader As StreamReader 'Read the XML data into a DataSet fs = New FileStream _ (Server.MapPath("schemadata.xml"), _ FileMode.Open,FileAccess.Read) Reader = New StreamReader(fs) ds.ReadXml(Reader) fs.Close() 'Bind the DataSet to a DataGrid Dim Source As DataView Source = new DataView(ds.Tables(0)) MyDataGrid.DataSource = Source MyDataGrid.DataBind() 57 58 Module 3: Using Microsoft ADO.NET to Access Data Demonstration: Reading XML Data into a DataSet *****************************illegal for non-trainer use****************************** In this demonstration, you will see how to read information from an XML file and display it in a DataGrid control. å To run the demonstration 1. Open the file <install folder>\DemoCode\Mod03\Books1.xml. This is the data that will be displayed from the ASPX page. 2. Edit the file <install folder>\DemoCode\Mod03\xml.aspx. a. There is a DataGrid control that uses templates to change the look of the table. b. The Page_Load event procedure reads the data from the Books1.xml file into a DataSet and binds it to the DataGrid. 3. View the page in Internet Explorer. 4. Edit the file <install folder>\Democode\Mod03\aspXMLControl.aspx. This page uses the XML Web control to read data from the Books1.xml file, and apply the Books1.xsl style sheet. 5. View the page in Internet Explorer. Module 3: Using Microsoft ADO.NET to Access Data Review n Overview of ADO.NET n Connecting to a Data Source n Accessing Data with DataSets n Using Stored Procedures n Accessing Data with DataReaders n Binding to XML Data *****************************illegal for non-trainer use****************************** 1. What are some of the new objects in the ADO.NET object model? 2. What is the difference between a DataSet and a DataView? 3. What is the difference between a DataSet and a DataReader? 59 60 Module 3: Using Microsoft ADO.NET to Access Data 4. What is the purpose of the DataAdapter object? 5. Which method is used to populate a DataSet with results of a query? Module 4: Separating Code from Content Contents Overview 1 Advantages of Partitioning an ASP.NET Page 2 Creating and Using Code-Behind Pages 3 Creating and Using User Controls 12 Creating and Using Components 19 Lab 4: Separating Code from Content 27 Review 39 Information in this document, including URL and other Internet Web site references, is subject to change without notice. Unless otherwise noted, the example companies, organizations, products, domain names, e-mail addresses, logos, people, places, and events depicted herein are fictitious, and no association with any real company, organization, product, domain name, e-mail address, logo, person, places or events is intended or should be inferred. Complying with all applicable copyright laws is the responsibility of the user. Without limiting the rights under copyright, no part of this document may be reproduced, stored in or introduced into a retrieval system, or transmitted in any form or by any means (electronic, mechanical, photocopying, recording, or otherwise), or for any purpose, without the express written permission of Microsoft Corporation. Microsoft may have patents, patent applications, trademarks, copyrights, or other intellectual property rights covering subject matter in this document. Except as expressly provided in any written license agreement from Microsoft, the furnishing of this document does not give you any license to these patents, trademarks, copyrights, or other intellectual property. 2001 Microsoft Corporation. All rights reserved. Microsoft, MS-DOS, Windows, Windows NT, ActiveX, FrontPage, IntelliSense, Jscript, Outlook, PowerPoint, Visual Basic, Visual InterDev, Visual C++, Visual C#, Visual Studio, and Windows Media are either registered trademarks or trademarks of Microsoft Corporation in the U.S.A. and/or other countries. The names of actual companies and products mentioned herein may be the trademarks of their respective owners. Module 4: Separating Code from Content 1 Overview n Advantages of Partitioning an ASP.NET Page n Creating and Using Code-Behind Pages n Creating and Using User Controls n Creating and Using Components *****************************illegal for non-trainer use****************************** Active Server Pages (ASP) applications contain a mix of Hypertext Markup Language (HTML) and script, making the code difficult to read, debug, and maintain. Microsoft® ASP.NET eliminates this problem by promoting the separation of code and content. That is, in ASP.NET, the user interface and the user interface programming logic need not necessarily be written in a single page. There are three ways in which you can separate code and content in ASP.NET: n n n By using code-behind files that are pre-compiled modules written in any of the Microsoft .NET run-time-compliant languages. By creating user controlsfrequently used control sets and their logic and using them as you would use controls in your ASP.NET pages. By moving business logic into components that can run on the server and calling those components from server-side code. After completing this module, you will be able to: n Explain the need for code-behind pages. n Create a code-behind page and use it with an ASP.NET page. n Explain the advantages of user controls. n Explain how user controls work. n Create a component in Microsoft Visual Basic ®. n Use a component in an ASP.NET page. 2 Module 4: Separating Code from Content Advantages of Partitioning an ASP.NET Page n Individual Members of the Development Team Can Work on Separate, Individually-Owned Parts n Developers Can Work Within Environments That Are Familiar n Web Authors Can Use HTML Development Tools to Build the Interface *****************************illegal for non-trainer use****************************** Partitioning ASP.NET pages into code and content has several advantages. Partitioning eliminates confusing pages where code and HTML are intertwined, producing pages that are easier to maintain and understand. In addition: n Members of the development team can work on their own parts without disturbing the work of others. For example, the interface designer can work on the interface files at the same time that the programmer works on the source code files. n Partitioning code and content allows developers to use environments that are familiar to them. For example, you can use separate editors to develop the code. n Web authors can use other HTML development tools to build the visible interface part of an application. Module 4: Separating Code from Content u Creating and Using Code-Behind Pages n Understanding How Code-Behind Pages Work n Creating a Class File in Visual Basic n Demonstration: Creating a Code-Behind Page n Accessing Controls in a Code-Behind Page *****************************illegal for non-trainer use****************************** User interface logic for a Web form relies on code that you create to interact with the form. You can design your application so that the code resides in a separate file known as the code-behind page, that is written in Visual Basic or Microsoft Visual C#™ . When you run the Web form, the code-behind class file runs and dynamically produces the output for your page. In this section, you will learn how code-behind pages work. You will also learn how to create a code-behind class file in Visual Basic. 3 4 Module 4: Separating Code from Content Understanding How Code-Behind Pages Work Create Separate Files for User Interface and Interface Logic n Use Page Directive to Link the Two Files n Page.aspx <%@ Page Inherits="myDemo" Src= "demo.vb" %> <%@ <%@ Page Page Inherits="myDemo" Inherits="myDemo" Src="demo.vb"%> Src="demo.vb"%> demo.vb Public Public Class ClassmyDemo myDemo Public Public Function Function getData() getData() …… End End Function Function End EndClass Class n Call Procedures in the CodeBehind Page ds ds == getData() getData() *****************************illegal for non-trainer use****************************** Creating code-behind pages is relatively simple. It involves creating two separate files, one for the user interface and the other for the user interface logic. The interconnectivity between these two files is provided through the @Page directive, which is used to specify optional settings at the page level. Creating a User Interface File First, you create the HTML for the interface. The interface file is an ASP.NET page (that uses the .aspx extension). The first line of the interface ASP.NET page is an @Page directive that specifies the name of the code-behind file and the actual class name inside the code-behind file that will be used. In the following example, the ASP.NET page is linked to the demo.vb class file. The Inherits attribute specifies the class file to be used and the Src attribute indicates the path to the class file itself. <%@ Page Language="vb" Inherits="myDemo" Src="demo.vb" %> Note Specifying the path to the class file is optional. If the path is omitted, ASP.NET looks for the class file in the /bin directory of the application. Creating a Code-Behind File Next, you create a separate class file, in any of the supported languages, that provides the functionality required for the user interface page. A code-behind class file is identical to any other class file that you create in a particular language. In Visual Basic, the class file has a .vb extension. In Visual C#, the code-behind page has a .cs extension. This ensures that the code-behind file is passed to the correct compiler when the page is first executed. Module 4: Separating Code from Content Using Code-Behind Procedures To call a function or sub-procedure in a code-behind page, preface the name of the procedure with the name of the code-behind page. For example, in the class myDemo, in the code-behind page demo.vb, a function named getData returns a DataSet object. The following sample code calls the getData function and then displays the returned DataSet (ds) in the DataGrid control (dgAuthors). Public Sub Page_Load (Src As Object, E As EventArgs) Dim ds As DataSet ds = getData() dgAuthors.DataSource=ds dgAuthors.DataMember="Authors" dgAuthors.DataBind() End Sub 5 6 Module 4: Separating Code from Content Creating a Class File in Visual Basic n Class File Public Public Class Class myDemo myDemo Public Public Function Function getData() getData() As As DataSet DataSet …… End End Function Function End End Class Class n Using Objects from the ASP.NET Environment Imports Imports System System Imports Imports System.Web System.Web n Inheriting from the ASP.NET Page Class Public Public Class Class myDemo myDemo Inherits Inherits System.Web.UI.Page System.Web.UI.Page …… End End Class Class *****************************illegal for non-trainer use********************** ******** A code-behind class file is identical to any other class file that you might create in your chosen programming language. The basic structure of a Visual Basic class file looks like the following: Public Class class_name Public variable_name As variable_type Public Function function_name(parameters) As return_type … End Function Public Sub sub_name(parameters) … End Sub End Class Note Notice that, in the above class declaration, the functions, sub-procedures, and the class are all public. Public procedures are used to invoke code-behind pages from the user interface page. Module 4: Separating Code from Content To convert the preceding class file structure into a code-behind class file, you need to perform two steps: 1. Use the objects from the ASP.NET environment. You need to import the objects from the ASP.NET environment that you need to use in a class file. By default, all objects in an ASPX page import the objects from the ASP.NET environment. However, this is not true for a class file. Therefore, a class file, at the minimum, needs to import the System and Web libraries from the ASP.NET environment. This is done as follows: Imports System Imports System.Web 2. Inherit from the ASP.NET Page class. Your class must inherit from the ASP.NET Page class so that it can be integrated into the ASP.NET page in which it is used. This is done with the Inherits statement. Public Class class_name Inherits System.Web.UI.Page … End Class The following is a code-behind page with one class named myDemo, and one public function named getData. The function reads data from a database and returns it to the user interface page as a DataSet object. Imports Imports Imports Imports System System.Web System.Data System.Data.SqlClient Public Class myDemo Inherits System.Web.UI.Page Public Dim Dim Dim Function getData() As DataSet ds As DataSet conn As SqlConnection cmdAuthors As SqlDataAdapter conn = New SqlConnection _ ("server=localhost;uid=sa;pwd=;database=pubs") cmdAuthors = New SqlDataAdapter _ ("select * from Authors", conn) ds = new DataSet() cmdAuthors.Fill(ds, "Authors") return (ds) End Function End Class 7 8 Module 4: Separating Code from Content Demonstration: Creating a Code-Behind Page *****************************illegal for n o n-trainer use****************************** In this demonstration, you will see how to create a code-behind page and use it from an ASP.NET page. å To run the demonstration 1. Edit the page <install folder>\Democode\Mod04\beforeCodeBehind.aspx using Notepad. This page has both code and content. 2. Open the files codeBehindDemo.vb and codeBehind.aspx in the folder <install folder>\Democode\Mod04. Important The file codebehind.aspx cannot be opened in Visual Studio .NET. You must use Notepad or another text editor. These files perform the same function as the beforeCodeBehind.aspx page, but use a code-behind page. 3. View the page codeBehind.aspx in Microsoft Internet Explorer. Module 4: Separating Code from Content 9 å To demonstrate using code-behind pages in Microsoft Visual Studio® .NET Visual Studio .NET uses code-behind pages by default. 1. Add a new Web form to a Visual Studio .NET project. 2. Add a label Web control and a button Web control from the toolbox to the page. 3. View the HTML for the page and notice the attributes of the @Page directive. 4. Return to Design view and double-click the button Web control. This opens the code-behind page, and creates a click event procedure for the button. Public Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click End Sub 5. Add code to change the Text property of the label control. Label1.Text = "clicked" 6. Build the project. In Visual Studio .NET, the code-behind pages are compiled into an assembly. You need to build the project before they will be accessible. 7. View the page in Internet Explorer. 10 Module 4: Separating Code from Content Accessing Controls in a Code-Behind Page n Import Namespaces for Controls Imports Imports System.Web.UI.WebControls System.Web.UI.WebControls Imports Imports System.Web.UI.HtmlControls System.Web.UI.HtmlControls n Declare Variables with Same Name as Controls Dim Dim lbl lbl As As Label Label Dim txt As Dim txt As TextBox TextBox n Reference Properties of Controls Public Public Sub Sub btn_Click btn_Click (s (s as as Object, Object, ee As As EventArgs) EventArgs) lbl.Text lbl.Text == "You "You are are searching searching for for "" && txt.Text txt.Text End End Function Function *****************************illegal for non-trainer use****************************** You can create event procedures for the controls on a form in a code-behind page. In this way, you can transfer most of the code from the user interface page to a code-behind page. To do this, you need to import the namespace for the controls you are using, either System.Web.UI.WebControls or System.Web.UI.HtmlControls. You then need to declare public variables for the controls on the ASPX page. For example, the following is a form on the ASPX page with three controls: <form runat=server> <asp:textbox id="txt" runat="server" /> <asp:button id="btn" onclick="btn_click" text="Click Me" runat="server"/> <P><asp:label id="lbl" runat="server"/> </form> Module 4: Separating Code from Content The code-behind page can include the event procedure and reference the controls on the page, as shown in the following example: Imports System Imports System.Web Imports System.Web.UI.WebControls Public Class myDemo Inherits System.Web.UI.Page Public lbl As Label Public txt As TextBox Public Sub btn_click(s As Object, e As EventArgs) lbl.Text = txt.Text End sub End Class 11 12 Module 4: Separating Code from Content u Creating and Using User Controls n Creating a User Control n Using a User Control in an ASP.NET Page n Demonstration: Creating a User Control *****************************illegal for non-trainer use****************************** A user control is an ASP.NET page that is imported as a server control by another ASP.NET page. User controls provide an easy way to partition and reuse simple and common user interface (UI) functionality across a Web application. User controls are not pre-compiled. However, because all ASP.NET pages are compiled as soon as they are requested, user controls are compiled on demand and cached in server memory. User controls have many advantages: n User controls are self-contained. They provide separate variable namespaces, which means that none of the methods and variables of the user control conflict with any existing methods and variables of the hosting page. n User controls can be used more than once within a hosting page without causing variable and method conflicts. n User controls can be written in a different language from the main hosting page. The main difference between code-behind pages and user controls is that codebehind pages mainly involve inheriting code classes into a page and user controls also allow you to generate parts of the user interface. Module 4: Separating Code from Content 13 Creating a User Control n n User-Defined Server Control with an .ascx Extension l <%@ Control Language="vb" %> l Contains HTML but not <HTML>, <BODY>, or <FORM> l Contains code to handle its own events Public Properties and Methods are Promoted to Properties and Methods of the Control in the Host Page Public Public Property Property pNum pNum As As Integer Integer Get Get Return Return CInt(txtNum.Text) CInt(txtNum.Text) End Get End Get End End Property Property *****************************illegal for non-trainer use****************************** User controls are ASP.NET pages used as server controls. User controls have an .ascx extension. This file extension ensures that the user control’s page cannot be executed as a stand-alone ASP.NET page. User controls largely replace include files. They are used to address the same problems that were solved by using include files, such as dealing with headers, navigation bar, repeating blocks of code, and so on. A user control consists of HTML and code, but because user controls are included in existing pages, they do not contain <head>, <body>, or <form> tags. Those tags are included in the host ASP.NET page. User controls participate in the complete execution life cycle of every request and can handle their own events, encapsulating some of the page logic from the containing ASP.NET page. For example, a user control can handle its own postback in its Page_Load event procedure. 14 Module 4: Separating Code from Content The following code is the HTML part of a user control that combines a text box and two input validation controls: <%@ Control Language="vb" %> <asp:textbox id="txtNum" runat="server" /> <asp:RequiredFieldValidator id="txtNumValidator" runat="server" controlToValidate="txtNum" errorMessage="You must enter a value" display="dynamic"> </asp:RequiredFieldValidator> <asp:RangeValidator id="txtNumRngValidator" runat="server" controlToValidate="txtNum" errorMessage="Please enter a number between 0 and 99" type="Integer" minimumValue="0" maximumValue="99" display="dynamic"> </asp:RangeValidator> To expose values of controls to the containing page, create public properties. For example, the following code creates a property named pNum that is the Text property of the text box control in the user control: <SCRIPT language="VB" runat="Server"> Public Property pNum As Integer Get Return CInt(txtNum.Text) End Get Set txtNum.Text = Value.ToString() End Set End Property </SCRIPT> All public variables, properties, and methods of a user control are promoted to properties (that is, tag attributes) and methods of the control in the containing page. Module 4: Separating Code from Content @Control directive You can also have code-behind pages for user controls. The @Control directive is used to reference a user control from a code-behind page. It also defines user-control-specific attributes used by the ASP.NET page parser and compiler. This directive can only be used with user controls. <%@ Control attribute=value [attribute=value … ]%> For example, to reference a code-behind page for a user control, you use the following line of code: <%@ Control Inherits="myDemo" src="demo.vb"%> Note The @Control directive supports the same attributes as the @Page directive, except the AspCompat and Trace attributes. To enable tracing, you must add the Trace attribute to an @Page directive in the ASPX page that contains the user control. You can only include one @Control directive per .ascx file. 15 16 Module 4: Separating Code from Content Using a User Control in an ASP.NET Page n Include User Controls in Another ASP.NET Page Using the Register Directive <%@ <%@ Register Register TagPrefix="conference" TagPrefix="conference" TagName="validNum" TagName="validNum" Src="numberBox.ascx" Src="numberBox.ascx" %> %> n Insert the User Control Like a Server Control <conference:validNum <conference:validNum id="num1" id="num1" runat="server"/> runat="server"/> n Set Properties of the User Control num1.pNum num1.pNum == 55 *****************************illegal for non-trainer use****************************** User controls are included in an ASP.NET page by using the @Register directive: <%@ Register TagPrefix="conference" TagName="validnum" Src="numberbox.ascx" %> The TagPrefix attribute determines a unique namespace for the user control so that multiple user controls with the same name can be differentiated from each other. The TagName attribute is the unique name for the user control. The Src attribute is the virtual path to the user control file. After registering the user control with the @Register directive, you can place the user control tag in the ASP.NET page just as you would an ordinary server control (including the runat="server" attribute). <conference:validNum id="num1" runat="server"/> <conference:validNum id="num2" runat="server"/> When the main ASP.NET page is loaded, the run-time framework compiles the user control file and makes it available to the page. After the user control is available to the page, you can access its properties as follows: lblSum.Text = (num1.pNum + num2.pNum).ToString() Module 4: Separating Code from Content Demonstration: Creating a User Control *****************************illegal for non-trainer use****************************** In this demonstration, you will see how to create and use a user control. The files numberbox.ascx and add.aspx in the folder <install folder>\Democode\Mod04 contain the completed code for this demonstration. å To run the demonstration 1. Open the page <install folder>\Democode\Mod04\beforeuser.aspx. This page has all controls and logic in one file. 2. Open the page numberbox.ascx in the folder <install folder>\Democode\Mod04. Numberbox.ascx is a user control that performs the same function as each text box on the page beforeuser.asps. 3. Add the @Register directive to the beforeuser.aspx page to use the numberbox.ascx user control. <%@ Register TagPrefix="demos" TagName="validNum" Src="numberbox.ascx" %> 4. Delete the four input validation controls from the beforeuser.aspx page. 5. Change the two text box controls to be <demos:validNum> controls. Use the same ID values. Num1: <demos:validNum id="txtNum1" runat="server" /> Num2: <demos:validNum id="txtNum2" runat="server" /> 17 18 Module 4: Separating Code from Content 6. Change the Submit event procedure to read values from the user controls. Sub submit(s As Object, e As EventArgs) If Page.IsValid Then lblSum.Text = _ CStr(Convert.ToInt32(txtNum1.pNum) + _ Convert.ToInt32(txtNum2.pNum)) End If End Sub 7. View the beforeuser.aspx page in Internet Explorer. 8. View the HTML source in Internet Explorer. Module 4: Separating Code from Content 19 u Creating and Using Components n Deploying Components n Creating Components n Using Components in an ASP.NET Page n Demonstration: Creating and Using a Component *****************************illegal for non-trainer use****************************** In ASP.NET, business objects are the building blocks for multi-tiered Web applications, such as those with a layer for data access or common application rules. In this section, you will learn how to write some simple components and include them in your ASP.NET pages. The classic use for an external component is in a two-tier scenario to perform data access. This simplifies the code in your page, improving readability and separating your UI logic from the back-end functionality. The three-tiered application model extends the two-tiered scenario to include business rules between the UI and data access logic. The three-tiered model allows UI developers to work with a higher level of abstraction rather than directly manipulating data through low-level data access component application programming interfaces (APIs). The middle business component typically enforces business rules and ensures that the relationships and primary key restraints of the database are enforced. 20 Module 4: Separating Code from Content Deploying Components n No Registration Required l n No Server Restart Required l l n Components may be deployed by simply copying to the /bin dir or performing an FTP file transfer The Web server does not require a restart when you change your application New requests immediately begin execution against the changed file No Namespace Conflicts l Each assembly loaded from /bin is limited in scope to the application in which it is running *****************************illegal for non -trainer use****************************** A problem with using the classic Component Object Model (COM) model for Web application components is that the components must be registered on the server before they can be used from a traditional ASP application. Remote administration of these components is often not possible, because the registration utility must be run locally on the server. In addition, these components remain locked on disk after they are loaded by an application and the entire Web server must be stopped before these components can be replaced or removed. ASP.NET solves these problems by allowing components to be placed in a well-known directory that is automatically found at run time. This directory is named /bin, and is located immediately under the root directory for the application. Following are the advantages of storing components in the /bin directory: n No registration required No registration is required to make components available to the ASP.NET application. Components may be deployed by simply copying a file to the /bin directory or performing a File Transfer Protocol (FTP) file transfer. n No server restart required n When the component is changed by replacing a .dll in the /bin directory, new requests by ASP.NET applications immediately begin execution against the changed file(s). ASP.NET allows currently executing requests to complete before the old application is replaced with the updated component(s). The Web server does not require a restart when you change components. No namespace conflicts Each component loaded from /bin is limited in scope to the application in which it is running. This means that many applications could potentially use different components with the same class or namespace names, without conflict. Module 4: Separating Code from Content 21 Creating Components n A Component Is Basically a Class n Creating a Component Imports Imports System.Data.SQL System.Data.SQL Namespace Namespace myComponent myComponent Public Public Class Class ConferenceDB ConferenceDB Public Public Function Function getCategories(...) getCategories(...) …… End End Class Class End End Namespace Namespace n Compiling the Class vbc vbc /t:library /t:library /out:component.dll /out:component.dll component.vb component.vb *****************************illegal for non-trainer use****************************** A component at its most basic level is simply a class. The component can be instantiated from an ASP.NET page that imports the component. Code-Behind vs. Components A code-behind page is an uncompiled class file. It does not define a namespace that can be used by many applications. Instead, it defines a class that the .aspx page inherits from. Therefore, the .aspx page can immediately call methods and use properties of the code-behind page; you do not need to instantiate an object. An .aspx page uses a code-behind page by adding the following to the @Page directive: Code-Behind Example <%@ Page Language="vb" Inherits="myDemo" Src="demo.vb" %> A component is always compiled into a dynamic-link library (DLL). Any page can access the DLL. You need to instantiate an object of the class before calling its methods. An ASPX page uses a component by adding the following code: Component Example <%@ Import Namespace="myComponent" %> 22 Module 4: Separating Code from Content Creating a Component A component class file includes a namespace declaration and class declarations. Namespace myComponent Public Class ConferenceDB . . . End Class End Namespace Namespaces are used as an organizational system. They provide a way to present program components that are exposed to other programs and applications. Namespaces are always Public; however, the classes within the namespace may have Public, Friend, or Private access. Just as you would with code-behind pages, you need to import any libraries that you use in the page. Imports System.Data Imports System.Data.SqlClient Example The following code is an example of a simple class called the ConferenceDB class. This class has a function that retrieves a list of categories from the database. Imports System.Data Imports System.Data.SqlClient Namespace myComponent Public Class ConferenceDB Public Function getCategories _ (conn As SqlConnection) As DataSet 'Retrieve a list of categories from the database End Function End Class End Namespace Module 4: Separating Code from Content 23 Compiling the Component To compile this class, you can either click Build on the Build menu in Visual Studio .NET or run the compiler from the MS -DOS® command prompt. The /t option tells the compiler that you want to build a library (.dll), and the /out option tells the compiler where to place the resulting assembly. An assembly is a collection of resources that are built to work together to deliver a cohesive set of functionality. An assembly carries all the rules necessary to ensure cohesion of functionalities. It is the unit of access to the resources in the Common Language Runtime (CLR). vbc /t:library /out:component.dll component.vb If the component imports other libraries, you must reference them in the compile statement. For example, if you are using the System.Data namespace, include the System.Data.dll library, as shown in the following example: vbc /t:library /out:component.dll /r:System.Data.dll component.vb Finally, after compiling the component, move it to the \bin folder in the root of the virtual directory for your Web site. Important You must define a virtual directory for your Web site. The component is now available for use in an ASP.NET page. 24 Module 4: Separating Code from Content Using Components in an ASP.NET Page component.dll Namespace myComponent Class ConferenceDB End Class End Namespace n Adding a Component <%@ <%@ Import Import Namespace="myComponent" Namespace="myComponent" %> %> n Using the Component Dim Dim xx As As New New ConferenceDB ConferenceDB ds ds == x.getCategories(conn) x.getCategories(conn) *****************************illegal for non-trainer use****************************** By default, ASP.NET loads all assemblies from the /bin directory when the application is started. The assemblies to load are specified through the configuration system. Additional assemblies may also be imported into an application by using the configuration file. Because the assembly is pre-loaded by the ASP.NET run time, only a simple namespace import or variable declaration is required to make the component available. There are two ways to use the classes defined in a component. You can either import the namespace by using an @Import directive, or reference the namespace when declaring a variable. Using the @Import directive To include any component in an ASP.NET page, you need to add the @Import directive that specifies the namespace to include at the top of the page. For example, to include the myComponent component, you add the following directive at the top of the page: <%@ Import Namespace="myComponent" %> You can then instantiate an object of the class by referencing the class name directly, as shown in the following example. Dim x As New ConferenceDB Module 4: Separating Code from Content 25 Referencing Namespace when Declaring a Variable You can also declare a variable directly from a component, without adding the @Import directive to the page, by referencing the namespace in the declaration. For example, to declare a variable from the myComponent component, use the following code: Dim x As New myComponent.ConferenceDB Note If you create and compile the component in Visual Studio .NET, you will need to preface the namespace with the name of the Visual Studio .NET project. For example, if the component.vb file is located in a Visual Studio .NET project named demos, you would use the following Imports statement or variable declaration to reference it: <%@ Import Namespace="demos.myComponent" %> or Dim x As New demos.myComponent.ConferenceDB Calling Component Methods After you have instantiated an object from the class, you can access its properties and methods. The following example shows how to call the getCategories method of the ConferenceDB class. ds = x.getCategories(conn) 26 Module 4: Separating Code from Content Demonstration: Creating and Using a Component *****************************illegal for non-trainer use****************************** In this demonstration, you will see a simple component and how to use it in an ASP.NET page. å To run the demonstration 1. Open the file component.vb from the folder <install folder>\DemoCode\Mod04. 2. Compile the file (manually, or using Visual Studio .NET). a. If you use the batch file mkdemos.bat to compile the component, you need to create a \bin folder in the <install folder> folder, which is the root of the 2063 virtual directory, and move the component.dll file into it. b. If you build in Visual Studio .NET, the assembly is automatically moved to the \bin folder of the project, but you will need to change the @Import directive in the displaycomponent.aspx page to: <%@ Import Namespace="projectname.myComponent" %> 3. Open the displaycomponent.aspx page. The @Import directive imports the namespace from the component. The getCategories function is called in the Page_Load event procedure. 4. View the displaycomponent.aspx page in Internet Explorer. View the source HTML of the page. The code from the component was not added to the file. Module 4: Separating Code from Content Lab 4: Separating Code from Content *****************************illegal for non-trainer use****************************** Objectives After completing this lab, you will be able to: n Create a user control. n Insert a user control into an .aspx page. n Create and use components. Prerequisite Before working on this lab, you must know how to use Web controls in an ASP.NET page. Lab Setup There are starter and solution files associated with this lab. The starter files are in the folder <install folder>\Labs\Lab04\Starter and the solution files for this lab are in the folder <install folder>\Labs\Lab04\Solution. The ASPNET Web application uses classes in the Conference component. There are five files in this component: ConferenceDB.vb, CustomersDB.vb, ProductsDB.vb, ShoppingCartDB.vb, and OrdersDB.vb. These files are in the Components folder of the ASPNET Web application. If, for any reason, you need to rebuild the Conference component, run the mk.bat batch file from a command prompt. The mk.bat batch file creates the conference.dll component and then puts it in the bin folder of the ASPNET Web application. 27 28 Module 4: Separating Code from Content Scenario All the Web pages in the ASPNET Web site have the same controls at the top and down the left side of the page. These controls can be put into user controls and then easily added to the pages. In Exercise 1, you will create a user control and in Exercise 2, you will add the user control to the ProductsList.aspx page. Also, many of the pages in the ASPNET Web site use data obtained from the Conference database. In Exercise 3, you will create a component to isolate and reuse the data access code. In Exercise 4, you will call methods on your component from the ProductsList.aspx page. Estimated time to complete this lab: 60 minutes Module 4: Separating Code from Content Exercise 1 Creating a Menu User Control In this exercise, you will convert an .aspx page into a user control. The page Menu.aspx reads categories of data from the database and displays them in a DataList Web control. In this exercise, you will convert the Menu.aspx page into a user control. å To create the user control file 1. Open the file named Menu.aspx from the ASPNET Web site. 2. Remove the HTML tags. 3. Remove the BODY tags. 4. Change the @Page directive into an @Control directive. <%@ Control Language="vb" %> 5. Save the page as _Menu.ascx (overwrite the existing _Menu.ascx file). 29 30 Module 4: Separating Code from Content Exercise 2 Using User Controls In this exercise, you will add two user controls to the ProductsList.aspx page. One control will be located along the top of the page and can be found in the file _header.ascx. The other will be located at the left side of the page and can be found in the file _menu.ascx that you just created in Exercise 1. When you are finished with this exercise, the page ProductsList.aspx should look like the following illustration. å To add the header and menu user controls 1. Open the page ProductsList.aspx in the ASPNET Web site. 2. Include the header and menu user controls at the beginning of the page by using the @Register directive. Set the attributes for the controls as shown in the following table. TagPrefix TagName Src Conference Header _Header.ascx Conference Menu _Menu.ascx Your code should look like the following: <%@ Register TagPrefix="Conference" TagName="Header" Src="_Header.ascx" %> <%@ Register TagPrefix="Conference" TagName="Menu" Src="_Menu.ascx" %> Module 4: Separating Code from Content 31 3. Create an HTML table in the body of the page to hold the two user controls and the contents of the original page. You will need to build the table around the existing contents of the page. HEADER M E N U CONTENT Your HTML code should look like the following: <table width="100%" border=0> <tr><td> <!-- _Header.ascx user control --> </td></tr> <tr><td> <table border=0> <tr><td valign="top"> <!-- _Menu.ascx user control --> </td> <td> <!-- Existing contents of the page --> <!-- between <body> and </body> tags --> </td> </tr> </table> </td></tr> </table> 32 Module 4: Separating Code from Content 4. Add the header and menu user controls to the correct position in the table. Your HTML code should look like the following: <table width="100%" border=0> <tr><td> <!-- _Header.ascx user control --> <Conference:Header runat="server"/> </td></tr> <tr><td> <table border=0> <tr><td valign="top"> <!-- _Menu.ascx user control --> <Conference:Menu runat="server"/> </td> <td> <!-- Existing contents of the page --> <!-- between <body> and </body> tags --> </td> </tr> </table> </td></tr> </table> å To save and test your work 1. Save your changes to ProductsList.aspx. 2. Using Internet Explorer, go to the ProductsList page of the ASPNET Web site by viewing: http://localhost/ASPNET/ProductsList.aspx?CategoryID=15 Note CategoryID=15 corresponds to the Conference Trackscategory in the Categories table of the database. Notice the header and menu user controls. Module 4: Separating Code from Content 33 Exercise 3 Building a Component Currently, the page ProductsList.aspx reads data from the database and displays it in a Repeater control. In this exercise, you will build a component, GetProducts.vb, to read the data from the database. Then, in Exercise 4, you will use that component in the ProductsList.aspx page. å To create the GetProducts.vb component 1. Create a new file named GetProducts.vb in the Components folder of the ASPNET Web site. If you are using Visual Studio .NET, do the following: a. Right-click on the Components folder in the ASPNET project in the Solution Explorer window, click Add, and then click Add Component. b. In the Add New Item dialog box, click Component Class, type GetProducts.vb in the Name field, and then click Open to generate and open the new file. 2. Add the following code to import namespaces: Imports System.Data Imports System.Data.SqlClient 3. Create a new namespace named db2063. 4. Create a public class named Products. Your code should look like the following: Namespace db2063 Public Class Products End Class End Namespace 34 Module 4: Separating Code from Content å To add a method to the Products class 1. Create a new function named GetProducts that takes an Integer parameter named categoryID and returns a DataSet. Public Function GetProducts(categoryID As Integer) As _ DataSet 2. Open the ProductsList.aspx page. 3. Cut the content of the Page_Load event procedure, except for the first instruction that reads the CategoryID query string parameter and the last two instructions that set the DataSource of the Repeater controls. The Page_Load event procedure code should look like the following after you have cut the instructions as specified above: Sub Page_Load(Source As Object, E As EventArgs) 'Obtain CategoryID from QueryString Dim categoryID As Integer = _ CInt(Request.Params("CategoryID")) ' Bind to the control repList.DataSource = dsProducts.Tables(0).DefaultView repList.DataBind() End Sub 4. Save the changes to ProductsList.aspx. 5. Paste this code into the GetProducts function in the GetProducts.vb component. Module 4: Separating Code from Content 6. Add a return statement to return the Dataset at the end of the function. Your function should look like the following: Public Function GetProducts(categoryID As Integer) As _ DataSet Dim conn As SqlConnection Dim strConn As String Dim cmdProducts As SqlDataAdapter Dim paramCategoryID As SqlParameter Dim dsProducts As New DataSet ' Create the connection strConn = _ "server=localhost;uid=sa;pwd=1Aspnet;database=Conf" conn = New SqlConnection(strConn) ' Call the ProductsByCategory stored procedure cmdProducts = _ New SqlDataAdapter("ProductsByCategory", conn) cmdProducts.SelectCommand.CommandType = _ CommandType.StoredProcedure ' Add Parameters paramCategoryID = _ New SqlParameter("@CategoryID", SqlDbType.Int, 4) paramCategoryID.Value = categoryID cmdProducts.SelectCommand.Parameters.Add(paramCategoryID) ' Fill the DataSet cmdProducts.Fill(dsProducts, "Products") ' Return the DataSet return dsProducts End Function Note Visual Studio .NET Beta 2 may insert parentheses at the end of your function declaration or elsewhere. Be sure to compare your code with the preceding example and remove any extra parentheses before continuing. 7. Save your changes to GetProducts.vb. 35 36 Module 4: Separating Code from Content å To compile the component There are two ways to compile the component: in an MS -DOS command prompt, or in Visual Studio .NET. 1. To compile the component in an MS -DOS command prompt: a. Open an MS-DOS command prompt. b. Navigate to the folder InetPub\wwwroot\ASPNET\components. c. Run the following command: vbc /t:library /out:..\bin\db2063.dll /r:System.dll /r:System.Web.dll /r:System.Xml.dll /r:System.Data.dll GetProducts.vb The compiler generates a file named db2063.dll in the ASPNET\bin directory. 2. To compile the component in Visual Studio .NET, on the Build menu, click Build. The compiler adds the new class to the project assembly named ASPNET.dll in the ASPNET\bin directory. Module 4: Separating Code from Content 37 Exercise 4 Calling a Component In this exercise, you will call the component that you built in Exercise 3 to get a DataSet of products that you will display on the ProductsList.aspx page. Client ProductList.aspx Middle-tier components GetProducts.vb Data ProductsByCategory Stored Procedure å To call the component from the ProductsList.aspx page 1. Open the page ProductsList.aspx from the ASPNET Web site. 2. Edit the Page_Load event procedure. 3. Declare a variable named productCatalog that is an instance of the Products class in the db2063 namespace. Note If you used Visual Studio .NET to compile the component, you must preface the namespace of the component with the root namespace (the project name) of the project. If you used a command prompt to compile the component, your code should look like the following: Dim productCatalog As New db2063.Products If you used Visual Studio .NET to compile the component, your code should look like the following: Dim productCatalog As New ASPNET.db2063.Products 4. Declare a DataSet variable named dsProducts. 5. After the code that reads the categoryID parameter from the QueryString object, call the GetProducts method of the component and save the result in the dsProducts variable. Your code should look like the following: Dim dsProducts As New DataSet dsProducts = productCatalog.GetProducts(CategoryID) 38 Module 4: Separating Code from Content å To save and test your work 1. Save your changes to ProductsList.aspx. 2. Using Internet Explorer, go to the ProductsList page of the ASPNET Web site by viewing: http://localhost/ASPNET/ProductsList.aspx?CategoryID=15 The page should display the table of conference tracks. Module 4: Separating Code from Content Review n Advantages of Partitioning an ASP.NET Page n Creating and Using Code-Behind Pages n Creating and Using User Controls n Creating and Using Components *****************************illegal for non -trainer use****************************** 1. List some of the advantages of separating code from content. 2. How do you link the user interface page to its code-behind file? 3. What are the ASP.NET namespaces that you need to import in a codebehind class file? 39 40 Module 4: Separating Code from Content 4. What are some of the differences between a regular ASP.NET page and a user control? 5. What is the biggest advantage that ASP.NET offers for using external components? 6. How do you use a user control from an ASP.NET page? 7. How do you use a component from an ASP.NET page? Module 5: Using Trace in Microsoft ASP.NET Pages Contents Overview 1 Overview of Tracing 2 Trace Information 3 Page -Level Trace Application-Level Trace 4 10 Lab 5: Adding Trace to an ASP.NET Page 16 Review 21 Information in this document, including URL and other Internet Web site references, is subject to change without notice. Unless otherwise noted, the example companies, organizations, products, domain names, e-mail addresses, logos, people, places, and events depicted herein are fictitious, and no association with any real company, organization, product, domain name, e-mail address, logo, person, places or events is intended or should be inferred. Complying with all applicable copyright laws is the responsibility of the user. Without limiting the rights under copyright, no part of this document may be reproduced, stored in or introduced into a retrieval system, or transmitted in any form or by any means (electronic, mechanical, photocopying, recording, or oth erwise), or for any purpose, without the express written permission of Microsoft Corporation. Microsoft may have patents, patent applications, trademarks, copyrights, or other intellectual property rights covering subject matter in this document. Except as expressly provided in any written license agreement from Microsoft, the furnishing of this document does not give you any license to these patents, trademarks, copyrights, or other intellectual property. 2001 Microsoft Corporation. All rights reserved. Microsoft, MS-DOS, Windows, Windows NT, ActiveX, FrontPage, IntelliSense, Jscript, Outlook, PowerPoint, Visual Basic, Visual InterDev, Visual C++, Visual C#, Visual Studio, and Windows Media are either registered trademarks or trademarks of Microsoft Corporation in the U.S.A. and/or other countries. The names of actual companies and products mentioned herein may be the trademarks of their respective owners. Module 5: Using Trace in Microsoft ASP.NET Pages Overview n Overview of Tracing n Trace Information n Page-Level Trace n Application-Level Trace *****************************illegal for non-trainer use****************************** In earlier versions of Active Server Pages (ASP), code tracing was accomplished by inserting Response.Write statements w herever required. A drawback of this technique was the removal of the excess code that was added when the application was deployed, and the resulting inability to use the output from the Response.Write statements in a production environment. Microsoft® ASP.NET overcomes such drawbacks by introducing an automatic tracing mechanism. This tracing mechanism can be enabled and disabled either on a page-by-page basis or for an entire application, and it can be configured in the web.config file. After completing this module, you will be able to: n Describe page-level and application- level tracing. n Enable and disable tracing for an ASP.NET page. n Add custom trace information. 1 2 Module 5: Using Trace in Microsoft ASP.NET Pages Overview of Tracing n n With Tracing You Can: l Output variables or structures l Assert whether a condition is met l Trace through the execution path of the application Can Be Enabled and Disabled, Either on a Page-By-Page Basis or for an Entire Application *****************************illegal for non-trainer use****************************** The tracing feature in ASP.NET enables you to insert debugging print statements into your code. These statements allow you to output variables or structures, assert whether a condition is met, or trace through the execution path of the application. All of this information is output to an .aspx page or saved to a log, depending on settings in the web.config file. You can also use the Debug object to output debugging information. By using methods in the Debug object to print debugging information and check your logic with assertions, you can make your code more robust without impacting your shipping product's performance and code size. While you are debugging an application during development, both your trace and debug output statements go to the Output window in Microsoft Visual Studio ® .NET. However, with trace statements, you can debug a production Web site simply by changing a setting in the web.config file and having the trace statements output on the page. In this course, we will focus only on the trace feature of ASP.NET. Module 5: Using Trace in Microsoft ASP.NET Pages Trace Information *****************************illegal for non -trainer use****************************** Tracing provides plenty of information to the developer of an ASP.NET application. The trace output screen contains the following categories of information. Category Description Control Tree List of all items on the page. Cookies Collection List of cookies being used. Form Collection List of controls and their values on the form being posted. Headers Collection List of items in the Hypertext Transfer Protocol (HTTP) header. Request Details Information about the request: session ID, time of request, type of request, and request status. Server Variables List of all server variables and their values. Trace Information Output from standard and custom trace statements. 3 4 Module 5: Using Trace in Microsoft ASP.NET Pages u Page-Level Trace n How Does Page-Level Trace Work? n Demonstration: Adding Page-Level Trace Statements n Tracing into a Component *****************************illegal for non-trainer use****************************** You can use page-level tracing to write debugging statements directly to the output of a page and to conditionally execute debugging code when tracing is enabled. The performance data and the developer-specified messages (if any) are injected into the Hypertext Markup Language (HTML) output stream to the client to help clarify precisely what occurs when the framework processes a page request. In this section, you will learn how the page-level trace mechanism works. Module 5: Using Trace in Microsoft ASP.NET Pages 5 How Does Page-Level Trace Work? n Enabling Tracing for a Page <%@ <%@ Page Page Language="VB" Language="VB" Trace="true"%> Trace="true"%> n Sorting Output by Category <%@ <%@ Page Page Language="VB" Language="VB" Trace="true" Trace="true" TraceMode="SortByCategory"%> TraceMode="SortByCategory"%> n Inserting Trace Messages Trace.Write("category", Trace.Write("category", "message") "message") n Conditional Execution with Trace.IsEnabled If If Trace.IsEnabled Trace.IsEnabled strTrace strTrace == 'create 'create trace trace string string here here End If End If Trace.Write(strTrace) Trace.Write(strTrace) *****************************illegal for non -trainer use****************************** The page-level trace mechanism performs two functions when it is enabled: n It automatically appends a table of performance data to the end of the page. n It allows developers to insert custom diagnostic messages throughout their code. Enabling Tracing for a Page The trace capability must be enabled prior to use. To enable tracing for a page, include the following directive at the top of the page code: <%@ Page Language="VB" Trace="true" %> The page exposes the Trace property of the type TraceContext, which can be used to output debugging statements to the page output. The default value of the Trace attribute is set to False. Sorting Trace Messages The TraceContext class contains the TraceMode property that defines how trace messages are sorted in the page output. <%@ Page Trace="true" TraceMode="SortByCategory" %> TraceMode is of the type TraceModeEnum, and has two possible values: n SortByTime n Trace messages are output in order of chronological occurrence. This is the default setting. SortByCategory Trace messages are sorted alphabetically by the category argument to the Trace.Write and Trace.Warn methods. 6 Module 5: Using Trace in Microsoft ASP.NET Pages Inserting and Organizing Trace Messages You can use the Trace object to write debugging statements. You can use two methods to insert custom messages: Trace.Write and Trace.Warn. Trace.Write is used to display messages. Trace.Warn is used to display warnings. Trace.Write and Trace.Warn are easy to distinguish because Trace.Warn uses a red font color for its output, whereas Trace.Write uses the default font color. In their simplest forms, each method takes two string arguments: Trace.Write("category", "message") Trace.Warn("category", "message") The category argument is used to organize messages. For example: Trace.Write("Custom Trace","Beginning User Code...") Trace.Warn("Custom Trace","Array count is null!") Conditional Execution with Trace.IsEnabled Often, you will need to execute additional code to construct the statements to pass to the Trace.Write or Trace.Warn methods . The code should execute only if tracing is enabled for the page. To support this, the page exposes a Boolean property, Trace.IsEnabled, that returns True only if tracing is enabled for the page. You should first check the Trace.IsEnabled property to guarantee that your debugging code will execute only when tracing is enabled. If Trace.IsEnabled strTrace = "create a trace string here" End If Trace.Write(strTrace) Module 5: Using Trace in Microsoft ASP.NET Pages Demonstration: Adding Page-Level Trace Statements *****************************illegal for non-trainer use****************************** In this demonstration, you will learn how to use trace at the page level. å To run the demonstration 1. Edit the file add.aspx in the folder <install folder>\Democode\Mod05. 2. Enable tracing by adding the Trace="True" attribute to the @Page directive. <%@ Page Language="vb" Trace="True"%> 3. View the page in Microsoft Internet Explorer. Trace messages are shown on the page. 4. Add a custom trace message to the Page_Load event. Trace.Write ("add Page_Load", "txtNum1 = " & Cstr(txtNum1.pNum)) 5. View the page again. 6. Disable tracing, and then view the page again. No trace messages are shown on the page. 7. Add a trace message to the numberbox.ascx user control. 8. Enable tracing in add.aspx, and view the page in Internet Explorer. 7 8 Module 5: Using Trace in Microsoft ASP.NET Pages Tracing into a Component n Import the System.Web Library Imports Imports System.Web System.Web n Enable Tracing in Class Constructor HttpContext.Current.Trace.IsEnabled HttpContext.Current.Trace.IsEnabled == True True n Add Trace Statements to Method HttpContext.Current.Trace.Write HttpContext.Current.Trace.Write __ ("component", ("component", "this "this is is my my trace trace statement") statement") *****************************illegal for non -trainer use****************************** If you have a component that is called from an ASP.NET page, you can also add trace statements to the component. å To add trace to a component 1. At the top of the component, import the System.Web library. Imports System.Web 2. In the constructor of the class to which you want to add trace statements, enable tracing with the following statement: HttpContext.Current.Trace.IsEnabled = True In the preceding code, HttpContext.Current gets the Context object for the current request. 3. Next, in the method, use the following: HttpContext.Current.Trace.Write _ ("component", "this is my trace statement") Module 5: Using Trace in Microsoft ASP.NET Pages 9 The following table lists some useful information about the results of enabling trace on a page or component. Case Result If you enable trace in the constructor of the component. All pages that access the component will have trace enabled even if the page does not have it enabled. If you enable trace in a component method. Only the page that accesses the method of the component will have trace enabled, even if the page does not have trace enabled. If you disable trace in the constructor of the component. All pages that access the component will have trace disabled even if the page has trace enabled. If you do not explicitly enable or disable trace for a component, but the page that calls the component has trace enabled. Trace in the component will be enabled for that specific page. 10 Module 5: Using Trace in Microsoft ASP.NET Pages u Application-Level Trace n How Does Application-Level Trace Work? n Demonstration: Adding Application-Level Trace Statements *****************************illegal for non-trainer use****************************** ASP.NET also provides a way to enable tracing for the entire application, rather than just a single page of the application. An ASP.NET application is the collection of files and folders in a virtual root of Internet Information Services (IIS). In this section, you will learn how an application-level trace works. Module 5: Using Trace in Microsoft ASP.NET Pages 11 How Does Application-Level Trace Work? n Application-Level Trace Collects Additional Statistics from a Request in the trace.axd File n Enabling Application-Level Trace in web.config <trace <trace enabled="true" enabled="true" traceMode="SortByCategory" traceMode="SortByCategory" requestLimit="40" requestLimit="40" pageOutput="true"/> pageOutput="true"/> *****************************illegal for non-trainer use****************************** In addition to the page-level trace functionality, ASP.NET provides a way to enable trace output for an entire application. Enabling trace at the application level has the effect of enabling page- level trace for every page within that application, provided that there is no page-level directive to explicitly disable trace. When application- level tracing is enabled, the ASP.NET runtime also collects several additional statistics, such as the state of the control hierarchy, the contents of session and application state, the form and query string input values, and so on. These statistics are collected for a specified number of requests as determined by the application’s configuration file. Enabling Tracing With ASP.NET, there is a configuratio n file that you can use to configure certain application attributes. This file is named web.config and is located in the root folder of the application. You will learn more about the web.config file in Module 7, “Creating a Microsoft ASP.NET Web Application,” in Course 2063B, Introduction to Microsoft ASP.NET. The web.config file is in Extensible Markup Language (XML) format; therefore, all section and attribute names are case-sensitive. To enable tracing for an application, place the following code in the web.config file in the application’s root folder. <trace enabled="true"/> 12 Module 5: Using Trace in Microsoft ASP.NET Pages By using the above configuration, each page in the application will output pagelevel trace statements to the file trace.axd in the application’s root folder, as shown in the following illustration. If you want trace messages to be displayed on the individual pages of your application, set the PageOutput attribute of the trace element to True. <trace enabled="true" pageOutput="true"/> Note The trace section in the configuration file is contained in a <system.web> section inside the <configuration> section. <configuration> <system.web> <trace enabled="true"/> </system.web> </configuration> Module 5: Using Trace in Microsoft ASP.NET Pages 13 Setting Trace Attributes The trace section of the configuration file also supports an attribute for controlling whether trace statements are output to the client browser or are available only from trace.axd. The attributes supported in the trace configuration section are listed in the following table. Value Description enabled Set to True or False. Indicates whether tracing is enabled for the application or not. Default is True. pageOutput Indicates whether trace information should be rendered at the end of each page, or accessible only through the trace.axd utility. Default is False (trace information is only accessible through trace.axd). requestLimit Number of trace requests to store on the server. Default is 10. traceMode Set to sortByTime or sortByCategory. Indicates the display order for trace messages. Default is sortByTime . The following example shows how you can set trace attributes. The following configuration collects trace information for up to 40 requests and prevents trace statements from being output to the requesting browser: <trace enabled="true" traceMode="sortByCategory" requestLimit="40" pageOutput="false"/> 14 Module 5: Using Trace in Microsoft ASP.NET Pages Demonstration: Adding Application-Level Trace Statements *****************************illegal for non-trainer use****************************** In this demonstration, you will learn how to use trace at the application level. å To run the demonstration 1. Copy the web.config file from the folder <install folder>\DemoCode\Mod05 to the <install folder>, which is the virtual root of the 2063 Web site. 2. Edit the web.config file and enable application-level tracing by adding the following line of code to the file: <trace enabled="true"/> 3. View the page http://localhost/2063/DemoCode/Mod05/postback.aspx in Internet Explorer. You will not see any trace output in the page. 4. View the page http://localhost/2063/trace.axd in Internet Explorer and look at the details for the postback.aspx request. Note You may need to click Refresh to see the latest entries in the trace.axd page. This is where the details are shown. Scroll down to show the values sent to the form. Module 5: Using Trace in Microsoft ASP.NET Pages 15 5. Change web.config to display the trace messages on the page by adding the pageOutput="true" attribute to the trace element. 6. View the page http://localhost//2063/DemoCode/Mod05/postback.aspx in Internet Explorer again. Now the trace messages are displayed on the page. 7. When you are done with this demonstration, delete the web.config file in the root of the 2063 virtual directory so that tracing will be turned off for future demonstrations. 16 Module 5: Using Trace in Microsoft ASP.NET Pages Lab 5: Adding Trace to an ASP.NET Page ***************** ************illegal for non-trainer use****************************** Objectives After completing this lab, you will be able to: n Enable and disable tracing for an ASP.NET page. n Add custom trace messages to an ASP.NET page and a middle-tier component. Prerequisite Before working on this lab, you must know how to compile a component. Lab Setup There are starter and solution files associated with this lab. The starter files are in the folder <install folder>\Labs\Lab05\Starter and the solution files for this lab are in the folder <install folder>\Labs\Lab05\Solution. Estimated time to complete this lab: 30 minutes Module 5: Using Trace in Mi crosoft ASP.NET Pages 17 Exercise 1 Enabling Tracing In this exercise, you will enable and disable tracing and add custom messages to the trace stream. å To enable tracing in a page 1. Open the file ProductsList.aspx in the folder InetPub\wwwRoot\ASPNET. 2. At the beginning of the code, modify the existing @Page directive, add the trace attribute, and set its value to True, as shown in the following code: <%@ Page Language="vb" trace="true" %> 3. Save your changes to the ProductsList.aspx page. 4. View the page in Internet Explorer. You should see the trace information at the bottom of the page. å To add custom trace messages 1. Go to the beginning of the Page_Load event procedure of the ProductsList.aspx page and add a trace message that displays Beginning of Page_Load in a category named Product List. Your code should look like the following: Trace.Write("Product List", "Beginning of Page_Load") 2. Add another trace message to the end of the Page_Load event procedure that displays End of Page_Load. 3. Add a third trace message that displays the value of the variable categoryID after reading it from the QueryString. 4. Save your changes to ProductsList.aspx. 18 Module 5: Using Trace in Microsoft ASP.NET Pages 5. View ProductsList.aspx in Internet Explorer, passing the CategoryID=15: http://localhost/ASPNET/ProductsList.aspx?CategoryID=15 You should see your custom messages in the Trace Information section, as shown in the following illustration. Module 5: Using Trace in Microsoft ASP.NET Pages 19 Exercise 2 Tracing into a Component In this exercise, you will add trace statements to the DB2063 component that is called from the ProductsList.aspx page. å To enable tracing in the DB2063 component 1. Open the file GetProducts.vb in the folder InetPub\wwwRoot\ASPNET\Components. 2. Import the System.Web library. Your import statement should look like the following: Imports System.Web 3. In the GetProducts method, enable tracing by setting the HttpContext.Current.Trace.IsEnbled property to True. Your code should look like the following: HttpContext.Current.Trace.IsEnabled = true Note You can also put this command in the constructor of the class if you need to use tracing in the whole component. å To add custom trace messages 1. Go to the beginning of the GetProducts method and add a custom trace message that displays Beginning of GetProducts in a category named DB2063.Products Component. Your additional instruction should look like the following: HttpContext.Current.Trace.Write _ ("DB2063.Products Component", _ "Beginning of GetProducts") 2. Add another trace message at the end of the procedure, before the Return command that displays End of GetProducts. 3. Add a third trace message to the GetProducts method that displays the value of the categoryID parameter . 20 Module 5: Using Trace in Microsoft ASP.NET Pages å To save and test 1. Save your changes to GetProducts.vb. 2. Compile the component. a. To compile the component by using an MS -DOS ® command prompt, open an MS-DOS command prompt, navigate to the folder InetPub\wwwroot\ASPNET\components, and run the following command: vbc /t:library /out:..\bin\db2063.dll /r:System.dll /r:System.Web.dll /r:System.Xml.dll /r:System.Data.dll GetProducts.vb b. To compile the component by using Visual Studio .NET, click Build on the Build menu. Note If you compile the component by using Visual Studio .NET, you will need to change the Page_Load event procedure in the ProductsList.aspx page to instantiate the Products object from the newly built DB2063 component in the ASPNET project. Dim productCatalog As New ASPNET.db2063.Products 3. View the ProductsList.aspx page in Internet Explorer, again passing the categoryID=15: http://localhost/ASPNET/ProductsList.aspx?CategoryID=15 You should see your custom messages from the page and from the component in the Trace Information section, as shown in the following illustration. Module 5: Using Trace in Microsoft ASP.NET Pages 21 Review n Overview of Tracing n Trace Information n Page-Level Trace n Application-Level Trace *****************************illegal for non-trainer use****************************** 1. How do you enable page-level tracing? 2. What is the difference between the Trace.Write and Trace.Warn methods? 3. What property is used to sort trace messages in a page? 4. How do you enable application- level trace? 22 Module 5: Using Trace in Micros oft ASP.NET Pages 5. If you have trace enabled in a component, but disabled in the page that calls the component, will the trace messages be displayed? 6. If you have trace enabled for a page, but neither enabled nor disabled in a component called by the page, will the trace messages from the component be displayed? Module 6: Using Web Services Contents Overview What Is a Web Service? 1 2 Calling a Web Service from a Browser 12 Calling a Web Service by Using a Proxy 15 Creating a Simple Web Service by Using Visual Basic 22 Creating and Calling a Web Service by Using Visual Studio .NET 26 Lab 6: Using Web Services Review 35 47 Information in this document, including URL and other Internet Web site references, is subject to change without notice. Unless otherwise noted, the example companies, organizations, products, domain names, e-mail addresses, logos, people, places, and events depicted herein are fictitious, and no association with any real company, organization, product, domain name, e-mail address, logo, person, places or events is intended or should be inferred. Complying with all applicable copyright laws is the responsibility of the user. Without limiting the rights under copyright, no part of this document may be reproduced, stored in or introduced into a retrieval system, or transmitted in any form or by any means (electronic, mechanical, photocopying, recording, or otherwise), or for any purpose, without the express written permission of Microsoft Corporation. Microsoft may have patents, patent applications, trademarks, copyrights, or other intellectual property rights covering subject matter in this document. Except as expressly provided in any written license agreement from Microsoft, the furnishing of this document does not give you any license to these patents, trademarks, copyrights, or other intellectual property. 2001 Microsoft Corporation. All rights reserved. Microsoft, MS-DOS, Windows, Windows NT, ActiveX, FrontPage, IntelliSense, Jscript, Outlook, PowerPoint, Visual Basic, Visual InterDev, Visual C++, Visual C#, Visual Studio, and Windows Media are either registered trademarks or trademarks of Microsoft Corporation in the U.S.A. and/or other countries. The names of actual companies and products mentioned herein may be the trademarks of their respective owners. Module 6: Using Web Services 1 Overview n What Is a Web Service? n Calling a Web Service from a Browser n Calling a Web Service by Using a Proxy n Creating a Simple Web Service by Using Visual Basic n Creating and Calling a Web Service by Using Visual Studio .NET *****************************illegal for non-trainer use****************************** The Web has helped to facilitate better communication within and between companies by providing fast access to information. For many organizations, however, browsing data-driven pages does not adequately satisfy their business needs. Programmable Web sites that directly link organizations, applications, services, and devices with one another would better meet these needs. Web services provide a simple, flexible, standards-based model for binding applications together over the Internet, and taking advantage of existing infrastructure and applications. Web applications can easily be assembled by using locally developed services and existing services, regardless of which platforms, development languages, or object models have been used to implement the constituent services or applications. After completing this module, you will be able to: n Explain the goal of Web services and how they fit into the Web architecture. n Describe the Web services execution model. n Call a Web service from a browser. n Call a Web service by using a proxy. n Use the data returned by a Web service. n Create a simple Web service by using Microsoft® Visual Basic ®. 2 Module 6: Using Web Services u What Is a Web Service? n Features of Web Services n Web Services Execution Model n Finding Existing Web Services n Examples of Existing Web Services n Demonstration: Calling a Web Service from the Browser *****************************illegal for non-trainer use**************************** * * Web services provide a simple, flexible, standards-based model for binding applications together over the Internet and taking advantage of the existing infrastructure and applications. In this section, you will learn about the need for Web services and about their architecture. You will also learn about existing Web services and how to find them. Module 6: Using Web Services 3 Features of Web Services n Allow Applications to Communicate Across the Internet n Language Independent n Protocol Independent n Platform Independent n Stateless Architecture *****************************illegal for non-train er use****************************** One of today’s most pressing challenges for developers is application integration. Application integration is the process of taking a group of applications and turning them into easy-to-use Web applications, even if they run on different operating systems, were created with different programming languages, and were built with different object models. Like components, Web services represent black-box functionality that developers can reuse without worrying about how to implement the service. Web services provide well-defined interfaces (called contracts) that describe the services they represent. Developers can assemble applications by using a combination of remote services, local services, and custom code. For example, a company might assemble an online store that uses the Microsoft Passport service to authenticate users, a third-party personalization service to adapt Web pages to each user’s preferences, a credit-card processing service, a sales tax service, packagetracking services from each shipping company, an in-house catalog service that connects to the company’s internal inventory management applications, and custom code to individualize the interface and make it unique. Unlike current component technologies, however, Web services do not use protocols that are specific to certain object models, such as the Distributed Component Object Model (DCOM), which requires specific, homogeneous infrastructures on the computers that run the client and the server. Web services communicate by using standard Web protocols and data formats, such as Hypertext Transfer Protocol (HTTP), Extensible Markup Language (XML), and Simple Object Access Protocol (SOAP). Any system that supports these Web standards can support Web services. A Web service can be used internally by a single application, or it can be used externally by many applications that access it through the Internet. Because it is accessible through a standard interface, a Web service allows disparate systems to work together. The Web services model is independent of languages, platforms, and object models. 4 Module 6: Using Web Services The Web service model is supported by Microsoft ASP.NET, which is a unified Web development platform that has grown from Active Server Pages (ASP) technology. The ASP.NET Web services model assumes a stateless service architecture. Stateless architectures are generally more scalable than stateful architectures. Each time a service request is received, a new object is created. There is a request for the method call, the method call is returned, and then the object is destroyed. Services can use the ASP.NET State Management services to maintain a state between requests. Module 6: Using Web Services Web Services Execution Model *****************************illegal for non-trainer use****************************** The Web services execution model involves two entities: the client and the service provider. Note The term “client” is often misinterpreted. In this sense, a client is a Web browser that views the results of calling a Web service. The preceding slide illustration shows how Web services are used between a client and the Web server. Each component has a specific role in the execution model. Web Service Model In the Web service model, the Web service developer: 1. Creates the .asmx file that includes the namespace, classes, properties, and methods. 2. Declares methods as Web methods that can be accessed over the Internet. The following is an example of a simple .asmx file : <%@ WebService Language="VB" Class="MathService" %> Imports System.Web.Services Imports System Class MathService <WebMethod()> Public Function Add(int1 As Integer, _ int2 As Integer) As Integer return(int1 + int2) End Function End Class 5 6 Module 6: Using Web Services Client In the Web service model, the client: 1. Calls the Web service from the browser to determine which methods are available. When you call a Web service from a browser, you access the description page, which lists the methods that are included in the Web service. The protocol that is used in this case is HTTP, and the data is returned as XML. 2. Calls a method of the Web service from the browser. When you call a method of a Web service from a browser, the protocol that is used is HTTP, and the data is returned as XML. Web Server You can also call methods of the Web service by using code on an ASP.NET page. To call a Web service from an ASP.NET page, the developer must: 1. Find out which Web services are available. This involves finding the Uniform Resource Locator (URL) for the Web service. 2. Compile the .asmx file (Web service) into a proxy by using the Wsdl.exe utility. This creates a .vb or .cs file that contains source code for the proxy. You will learn about proxy files and how to compile an .asmx file into a proxy in the next section of this module. 3. Compile the proxy (the .vb or .cs file you created in the previous step) into a .dll file in the /bin directory of the Web site. 4. Open the ASP.NET Web page. a. Create an instance of the proxy. b. Call the methods of the Web service. c. Use the data returned by the Web service. Note As the preceding slide illustration shows, the proxy resides on the same server as the Web page (.aspx) that calls it. An advantage of using a proxy is that it translates the returned data from the server into a data type that the .aspx page can use. If you call a Web service method directly from an .aspx page without using a proxy, you will receive the data in XML form, which must be parsed in another step. Module 6: Using Web Services 7 To learn more about the Web services execution model, view the Web Services Execution Model animation. Open the file 2063B_06A001.swf from the Media folder. 8 Module 6: Using Web Services Finding Existing Web Services n n UDDI l Defines a way to publish and discover information about Web services l Relies on a distributed registry of businesses and their service descriptions implemented in a common XML format Businesses Individually Register Information About the Web Services by Using UDDI Business Registration http://www.uddi.org http://uddi.microsoft.com *****************************illegal for non -trainer use****************************** Getting information about which business partners have Web services and finding specific information about the available Web services is very difficult for companies today. The Universal Description, Discovery and Integration (UDDI) specification defines a way to publish and discover information about Web services. UDDI relies on a distributed registry that has been implemented in a common XML format. This registry is a list of businesses, along with descriptions of their available services. The UDDI specification consists of several related documents and an XML schema that defines a SOAP-based programming protocol for registering and discovering Web services. The core component of UDDI is the UDDI business registration, an XML file that is used to describe a business entity and its Web services. Conceptually, the information provided in a UDDI business registration consists of three components: White Pages, which include address, contact, and known identifiers; Yellow Pages, which include industrial categorizations based on standard taxonomies; and Green Pages, which include the technical information about the services that are exposed by the organization. Green Pages include references to specifications for Web services, as well as any support that may be required for pointers to file and URL-based discovery mechanisms. Businesses individually register information about the Web services that they expose for other businesses to use. This information can be added to the UDDI business registry through a Web site, or by using tools that use the programmatic service interfaces described in the UDDI programmer’s application programming interface (API) specification. The UDDI business registry is a logically centralized, physically distributed service with multiple root nodes that replicate data with each other regularly. When a business registers with a single instance of the business registry service, the service shares the data automatically with other UDDI root nodes. After the data has been distributed, it becomes freely available to anyone who needs to discover which Web services are exposed by a particular business. Module 6: Using Web Services For more information about UDDI, go to the UDDI Web site at http://www.uddi.org/ or the Microsoft UDDI Project Web site at http://uddi.microsoft.com 9 10 Module 6: Using Web Services Examples of Existing Web Services n Find Web Services at: l http://www.xmethods.net l http://www.gotdotnet.com l http://dotnet.microsoft.com *****************************illegal for non-trainer use****************************** You can find existing Web services at the following Web sites: n http://www.xmethods.net n http://www.gotdotnet.com n http://dotnet.microsoft.com Some examples of Web services that can be found at these sites include: n FedEx Tracker Provides acc ess to FedEx Tracking information. n Weather-temperature Gives the current temperature in a given United States zip code region. n Barnes and Noble Price Quote Returns the price of a book at barnesandnoble.com when you provide an International Standard Book Number (ISBN). Module 6: Using Web Services 11 Demonstration: Calling a Web Service from the Browser *****************************illegal for non-trainer use****************************** In this demonstration, you will see how to call a Web Service. å To run the demonstration 1. View the description page for the MathService Web service at http://localhost/2063/Democode/Mod06/mathservice.asmx 2. Click the Add link. 3. Fill in parameters for the Add method, and then click Invoke. 4. Return to the mathservice.asmx page and view the Web Service Description Language (WSDL) contract. 12 Module 6: Using Web S ervices Calling a Web Service from a Browser http://server/vroot/webservice.asmx http://server/vroot/webservice.asmx *****************************illegal for non -trainer use****************************** Because Web Services are accessible by using URLs, HTTP, and XML, programs running on any platform and in any language can access them. If you know the base URL for a Web service (the URL to the .asmx file that is the base of the Web service), you can use this URL to access a Web page known as the HTML description page. The HTML description page provides information about what a Web service does, the methods it contains and their parameters, and its response type. In addition, you can use the description page to test the functionality of the Web service. Module 6: Using Web Services 13 For example, suppose that you access a Web service called hotel_Full.asmx that is used to retrieve details from a hotel. You know the base URL for this service is http://localhost/ASPNET/hotel_full.asmx. Entering the base URL with no extensions or parameters produces a page that displays information about the service and the methods it contains. In addition to viewing information about the Web service in the browser, you can obtain a more formal definition of the Web service by viewing its Web Service Description Language (WSDL) contract. A Service Description link at the top of the description page allows you to view the contract, which contains an XML description of the Web service and its contents. You can use this file to generate a proxy manually. WSDL Contract The WSDL contract is an XML document. The document defines the format of messages that the Web service understands. The service description acts as an agreement that defines the behavior of a Web service and instructs potential clients in how to interact with it. In addition to message format definitions and messaging patterns, the service description also contains the address that is associated with each Web service entry point. The format of this address depends on the protocol that is used to access the service, such as a URL for HTTP or an e-mail address for Simple Mail Transfer Protocol (SMTP). 14 Module 6: Using Web Services Calling a Web Service from a Browser (continued) n Pass the Name of the Method and All Required Parameters to the URL of the Web Service http://server/vroot/webservice.asmx/method?param=value http://server/vroot/webservice.asmx/method?param=value n Return Value Is in XML Format *****************************illegal for non-trainer use****************************** You can also call the methods of a Web service directly from a browser. To call a Web service method, pass the name of the method, the required parameters, and the values of the parameters to the URL of the Web service. The Web service returns data in XML format when it is called from a Web browser by using HTTP. For example, if a Web service named hotel_full has a method named Price that takes one parameter named strRoomType1, you can call it directly from the browser by viewing the following URL: http://localhost/conference/hotel_full.asmx/Price?strRoomType1=single The following XML is data that was returned from this URL: <?xml version="1.0"?> <double xmlns="http://tempuri.org/">200</double> If you want to use this kind of data in your Web application, you must parse it in a separate step. Module 6: Using Web Services 15 u Calling a Web Service by Using a Proxy n Compiling an .asmx File into a Proxy n Compiling the Proxy into a DLL n Calling Web Service Methods n Demonstration: Calling a Web Service by Using a Proxy *****************************illegal for non-trainer use****************************** Another method for calling a Web service is by using a proxy. In this section you will learn how to call a Web service by using a proxy. Note You will first learn how to create a Web service manually, and then learn how to create it by using Microsoft Visual Studio® .NET. 16 Module 6: Using Web Services Compiling an .asmx File into a Proxy n n A Proxy Class: l Looks like the original class but does not contain any application logic l Allows a client to access a Web service as if it were a local COM object Creating a Proxy Class from an .asmx File wsdl wsdl /l:vb /l:vb /n:myNameSpace /n:myNameSpace http://location/service.asmx?wsdl http://location/service.asmx?wsdl *****************************illegal for non-trainer use****************************** A proxy class is code that looks exactly like the class it is meant to represent, but does not contain any of the application logic. Instead, it contains marshaling and transport logic. The Proxy object allows a client to access a Web service as if it were a local Component Object Model (COM) object, which lets any COM-enabled language access the Web servic e easily. You can create a proxy class from an SDL file. The Microsoft .NET Framework software development kit (SDK) includes a tool called Wsdl.exe that you can use to create a proxy class. Syntax wsdl [options] {URL | path} In the preceding syntax, URL is the Uniform Resource Location (URL) to a WSDL contract file (.wsdl), XSD schema file (.xsd), or a discovery document (.disco). Path is the path to a local WSDL contract, XSD schema, or discovery document (including .discomap files). Module 6: Using Web Services 17 The following table provides a detailed description of the options that are used with the Wsdl.exe command. Option Description /urlkey Specifies the configuration key to use to read the default value for the URL property when generating code. Also called /appsettingurlkey. /baseurl Specifies the base URL to use when calculating the URL fragment. You must use the /urlkey option with this option. Also called /appsettingbaseutl. /d[omain] Specifies the domain name to use when connecting to a server that requires authentication. /l[anguage] The language that is used for the generated proxy: CS (Microsoft Visual C# ™ ; default), VB (Microsoft Visual Basic), or JS (Microsoft JScript® .NET). /n[amespace] The namespace of the generated proxy. Default value is the global namespace. /nologo Suppresses the Microsoft startup banner display. /o[ut] The location in which to create the proxy file and the filename for the file. The default location is the current directory; the default filename is based on the Web Service name. /p[assword] Specifies the password to use if connecting to a server that requires authentication. /protocol The protocol that is used to generate the proxy: SOAP, HttpGet, HttpPost, or a custom protocol as specified in the configuration file. Default value is SOAP. /proxy: The URL of the proxy server that is used to establish a connection. Default uses the system proxy settings. Associated with this are three other options: n /pd (or /proxydomain) which sets the domain in which the proxy server resides, n /pp (or /proxypassword) which sets the password required by the proxy server, and n /pu (or /proxyusrename) which sets the username required to connect to the proxy server. /server Generates an abstract class for a Web service that is based on the contract. Default generates a client proxy class. /u[sername] Specifies the username to use when connecting to a server that requires authentication. /? Displays command syntax and options for the Wsdl.exe tool. Wsdl.exe generates a single source file as output. This file contains a proxy class that has been defined by using the specified language and the methods that are exposed by the Web service. Each proxy method contains the appropriate network invocation and marshalling code that is necessary to invoke and receive a response from the remote Web service. 18 Module 6: Using Web Services For example, to compile a store Web service file named Store.asmx into a proxy, you could type the following code: wsdl /l:vb /n:myStore http://localhost/Store/Store.asmx?wsdl Here, myStore is the namespace of the Web service. This code creates a proxy class in a file named Store.vb that contains methods that are exposed by the Web service. Module 6: Using Web Services 19 Compiling the Proxy into a DLL n Compiling a Proxy Class into a DLL vbc vbc /out:..\bin\proxyclassname.dll /out:..\bin\proxyclassname.dll /t:library /t:library /r:System.Web.Services.dll /r:System.Web.Services.dll proxyclassname.vb proxyclassname.vb n The .dll File Is Published in the /bin Folder *****************************illegal for non-trainer use****************************** After you create a proxy class, you need to compile it into a dynamic -link library (DLL). You can use the following syntax to compile a Visual Basic proxy class into a DLL: vbc /out:..\bin\proxyclassname.dll /t:library /r:System.Web.Services.dll proxyclassname.vb In the preceding code’s syntax, you use the /t switch to specify the target output type of the compiled resource. You use the value library to create a stand-alone file that contains the class and the metadata for a given class or classes. You use the /r swit ch to reference an assembly that contains the metadata and classes that you need within the class instance. Example If you want to compile the Store.vb class into a DLL, you could use the following code: vbc /out:..\bin\Store.dll /t:library /r:System.Web.Services.dll store.vb Note that in the preceding code’s syntax, the output is stored in the /bin folder. To use the proxy DLL, you need to publish the DLL in the /bin folder. The /bin folder resides in the root of the Web virtual site, or in the root in Internet Information Services (IIS). 20 Module 6: Using Web Services Calling Web Service Methods n Creating an Instance of the Proxy Dim Dim myStoreProxy myStoreProxy As As myStore.Store myStore.Store myStoreProxy myStoreProxy == New New myStore.Store() myStore.Store() n Calling Methods Dim Dim ds ds As As DataSet DataSet ds ds == myStoreProxy.products() myStoreProxy.products() *****************************illegal for non-trainer use****************************** Create an Instance To use a proxy in an .aspx page, you need to create an instance of the proxy in your page. For example, to use the Store proxy, you create an instance of it by writing the following code: Dim myStoreProxy As myStore.Store myStoreProxy = New myStore.Store() In the preceding code, myStore is the namespace of the proxy class, and Store is the actual proxy class. Call a Method You can call the methods of a Web service from an .aspx page directly by using the proxy, and you can then access the data that the Web service returns. For example, if the Store class has a Web-callable method named products that returns a DataSet of all the products sold by the store, you could call the method by using the following code: Dim ds As DataSet ds = myStoreProxy.products() Module 6: Using Web Services 21 Demonstration: Calling a Web Service by Using a Proxy *****************************illegal for non-trainer use****************************** In this demonstration, you will see how to create and use a proxy to call a Web service. å To run the demonstration 1. Create a bin directory in the folder <install folder>. This is the virtual root directory of the 2063 Web site. 2. Build the proxy DLL for the MathService Web service by running <install folder>\Democode\Mod06\mkService.bat. This batch file creates a proxy DLL named mathserver.dll and moves it to the \bin directory. 3. Open the file <install folder>\Democode\Mod06\math.aspx to show how to call the Web service from code. 4. View math.aspx in Microsoft Internet Explorer. 5. Enter numbers in the two text boxes, and then click =. 22 Module 6: Using Web Services u Creating a Simple Web Service by Using Visual Basic n Writing a Web Service n Demonstration: Creating a Web Service *****************************illegal for non -trainer use****************************** The biggest advantage of Web services is that they can be created easily. In this section, you will learn how to create a Web service and expose methods. Module 6: Using Web Services 23 Writing a Web Service n Adding a Page Directive <%@ <%@ WebService WebService Language="VB" Language="VB" Class= Class= "MyStore" "MyStore" %> %> n Importing the Namespaces Imports Imports System System Imports Imports System.Web.Services System.Web.Services *****************************illegal for non-trainer use****************************** Writing a simple Web service takes only a few minutes, and can be accomplished in any text editor. As an example, consider a Web service called MyStore. MyStore exposes a method for getting the price for all the products in the store. Adding the Page Directive At the top of the .asmx file is a directive that identifies the file as a Web service and specifies the language for the service. <%@ WebService Language="VB" Class="MyStore" %> Importing the Namespaces Next, import the System and the System.Web.Services namespaces. The WebMethod() attribute resides in the System.Web.Services namespace. You can use the WebMethod() attribute to call a method from the Web. Imports System Imports System.Web.Services 24 Module 6: Using Web Services Writing a Web Service (continued) n Defining a Class with WebMethods Public Public Class Class MyStore MyStore <WebMethod()> <WebMethod()> Public Public Function Function __ Price() Price() As As String String Price Price == "The "The item item costs costs $10." $10." End Function End Function End End Class Class n Save the File with an .asmx Extension *****************************illegal f o r n o n-trainer use****************************** Defining a Class File In the same .asmx file, you must also define a class that encapsulates the functionality of the Web service. This class should be public, and inherit from the WebService base class. Each method that will be exposed from the service needs to flagged with a <WebMethod()> custom attribute in front of it. This attribute is required to create a Web-callable method. If the method does not have the <WebMethod()> custom attribute, the method w ill not be exposed from the service. The following code has the MyStore class and the Price method: Public Class MyStore <WebMethod()> Public Function Price() As String Price = "The item costs $10." End Function End Class Saving a Web Service Web Service files are saved with an .asmx file extension. The ASP.NET runtime automatically compiles files that have an .asmx extension when a request to the service is made. Module 6: Using Web Services 25 Demonstration: Creating a Web Service *****************************illegal for non-trainer use****************************** In this demonstration, you will see how to create a simple Web service that subtracts two numbers. å To run the demonstration 1. Edit the file <install folder>\Democode\Mod06\MathService.asmx. 2. Create a Subtract method that subtracts one number from another. 3. View the page http://localhost/2063/Democode/Mod06/mathservice.asmx 4. Fill in parameters for the Subtract method, and then click Invoke. 5. If you want to call this new method service from an ASP.NET page, you can use the mkservice.bat file to compile it. Then call the Subtract method in the math.aspx page. 26 Module 6: Using Web Services u Creating and Calling a Web Service by Using Visual Studio .NET n Creating a Web Service by Using Visual Studio .NET n Demonstration: Creating a Web Service by Using Visual Studio .NET n Calling a Web Service by Using Visual Studio .NET n Demonstration: Calling a Web Service by Using Visual Studio .NET *****************************illegal for non-trainer use****************************** Visual Studio .NET makes creating and calling Web services easy. In Visual Studio .NET, you can easily expos e any function, in any language, as a Web service. You do not need to learn XML and SOAP to take advantage of Web services. When you compile your business objects, Visual Studio .NET automatically generates an XML file that describes the function and, when it is called, the function will automatically send and receive XML packets. After you build the Web service, both the compiled code and the XML file that describes the public methods of the service are published to the Web server. The Web service can then be invoked through HTTP, and XML will automatically be used to pass data to and from the service. In Visual Studio .NET, you can drag any exposed Web service directly into your application. Doing so enables Visual Studio .NET to treat the Web service as a class. Calling the Web service is as simple as creating a new instance of the Web Service class and then calling an exposed method. In this section, you will learn how to create and call Web services by using Visual Studio .NET. Module 6: Using Web Services 27 Creating a Web Service by Using Visual Studio .NET n Creating a Web Service: 1. Create a new project in Visual Studio .NET 2. Select the ASP.NET Web Service option and specify the name of the Web service 3. Open the Web service in the code view and declare its Web-callable functions 4. Compile the Web service by using the Build option *****************************illegal for non-trainer use****************************** When you use Visual Studio .NET to create a Web service, you do not need to add several lines of code that you need to add when using Microsoft Notepad or another text editor. You can simply declare the Web-callable functions of the Web service. Visual Studio .NET automatically creates the code for adding pages directives, importing namespaces, and declaring the class structure when you create a new project for the Web service. To learn how to create a Web service by using Visual Studio .NET, consider a simple Web service called Stocks. 28 Module 6: Using Web Services å To create a Web service in Visual Basic 1. Create a new project in Visual Studio .NET. 2. Select the ASP.NET Web Service option, type a name for the Web service, and then click OK. By default, Visual Studio .NET creates a Web service file named Service1.asmx. Note You can change the default name of the Web service file (Service1.asmx) and the default name of the class (Service1). Module 6: Using Web Services 29 3. Open the .asmx file in code view, and then declare its Web-callable functions. For example, the following illustration shows a GetRating method. 4. Compile the Web service by clicking Build on the Build menu. Visual Studio .NET compiles the Web service code and deploys it as a DLL to the \bin directory of the Web site. 30 Module 6: Using Web Services Demonstration: Creating a Web Service by Using Visual Studio .NET *****************************illegal for non-trainer use****************************** In this demonstration, you will learn how to create a simple stock rating service. The rating service returns a Buy value if the ticker symbol ACME is entered. å To run this demonstration 1. Create a new project in Visual Studio .NET. It is important to create a new project for the ASP.NET Web service. 2. Select the ASP.NET Web Service option, and then specify the name of the Web service as Stocks. A Stocks folder is created in the folder \Inetpub\wwwroot. 3. Open the default .asmx file, Service1.asmx, in code view by right-clicking the file in the Solution Explorer and clicking View Code. The default name of the class is Service1 (the code is in the file Sevice1.asmx.vb). 4. Create a GetRating function as follows: <WebMethod()> Public Function GetRating(Ticker As String) _ As String If Ticker ="ACME" Then Return "Buy" Else Return "Sell" End If End Function 5. Save the file. 6. On the Build menu, click Build to compile the Web service. 7. Open the Web service in Internet Explorer by viewing http://localhost/Stocks/Service1.asmx Module 6: Using Web Services 31 Calling a Web Service by Using Visual Studio .NET n Calling a Web Service: 1. Open a Web Application project 2. Create a Web reference for the Web service by using the Add Web Reference dialog box 3. Create an instance of the Web service 4. Call the functions of the Web service 5. Build the Web application project *****************************illegal for non-trainer use****************************** To use a Web service from Visual Studio .NET, you can simply add a Web reference to it. After browsing to the Web service URL, you can reference the service from your project. Because the WSDL for the Web service contains both the URL of the Web service and all of the functions that are available, Visual Studio .NET can automatically create the code that calls the service from your page. 32 Module 6: Using Web Services å To call a Web service by using Visual Studio .NET 1. Open a Web Application project in Visual Studio .NET. 2. On the Project menu, click Add Web Reference. 3. In the Address field of the Add Web Reference dialog box, type the URL of the Web service that you are accessing, press ENTER, and then click Add Reference . Visual Studio .NET creates a Web reference to the Web service with the name of the server hosting the Web service, as shown in the following illustration. Module 6: Using Web Services 4. In a function in an ASPX page, create an instance of the Web service, and then call its functions. For example, if you have a button to call the GetRating() method of the Stocks Web service, use the following code in the Click event procedure: Sub Button1_Click(s As Object, e As EventArgs) Dim service As New GetStocks.localhost.service1() lblResults.Text = service.GetRating("ACME") End Sub Note When you use Web services in a Visual Studio .NET project, the proxy is built for you and added to the assembly for the project. Therefore, to reference a Web service, you must use the name of the project, the name of the Web reference, and then the name of the WSDL file created by Visual Studio .NET. 5. Compile the Web application by clicking Build on the Build menu. 33 34 Module 6: Using Web Services Demonstration: Calling a Web Service by Using Visual Studio .NET *****************************illegal for non-trainer use****************************** In this demonstration, you will learn how to call a Web service called Stocks by using Visual Studio .NET. å To run the demonstration 1. Create a new ASP.NET Web Application project in Visual Studio .NET called GetStocks. 2. Add a Web reference to the Web service that you created in the previous demonstration. It should be located at http://localhost/Stocks/service1.asmx 3. Open the default Webform1.aspx page in design view and add a text box, a button, and a label using the Web Forms section of the Toolbox. Use the default properties for each. 4. Create a Click event procedure for the button. Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim service As New GetStocks.localhost.service1() Label1.Text= service.GetRating(TextBox1.Text) End Sub 5. Build the Web application by clicking Build on the Build menu. 6. View the .aspx page in Internet Explorer. 7. Test the Web service by entering the ACME stock symbol in the text box and clicking the button. Module 6: Using Web Services 35 Lab 6: Using Web Services *****************************illegal for non-trainer use****************************** Objectives After completing this lab, you will be able to: n Call a Web service from an ASP.NET page. n Create a Web service by using Visual Basic . Prerequisites Before working on this lab, you must know: n How to create an event procedure for a server control. n How to create a class in Visual Basic . Lab Setup There are starter and solution files associated with this lab. The starter files are in the folder <install folder>\Labs\Lab06\Starter and the solution files for this lab are in the folder <install folder>\Labs\Lab06\Solution. 36 Module 6: Using Web Services Scenario After selecting a track for the ASP.NET conference, the user can reserve a room in a hotel for the duration of the conference. From the CheckOut.aspx page, it is possible to select one of two hotels at which to stay. Selecting a hotel calls the hotel_reservation.aspx page. There are two hotels that have contracted with the conference. For the purposes of this lab, one hotel will always be full; the other will always have rooms available. In Exercise 1, you will add code to the hotel_reservation.aspx page to call an existing Web service to get information about the Full hotel. In Exercise 2, you will create a Web service for a third hotel by using Visual Basic. In Exercise 3, you will add code to the hotel_reservation.aspx page to get information about the second hotel, hotel_Empty. Estimated time to complete this lab: 60 minutes Module 6: Using Web Services 37 Exercise 1 Using a Web Service In this exercise, you will call a Web service for a hotel named Full. If time permits, in Exercise 3, you will call another Web service for a hotel named Empty, and then retrieve information regarding room availability. The Web service for the Full hotel is named Hotel_Full.dll. The Web service for the Empty hotel is named Hotel_Empty.dll. There are five methods in each service. n Reserve takes room types and start and end dates and returns a Boolean value that indicates whether a room is available. <WebMethod()>public Function Reserve ( strRoomType1 As String, strRoomType2 As String, dtmStartDate As Date, dtmEndDate As Date) As Boolean n Price returns a double value that is the price of the hotel for one night. <WebMethod()>public Function Price( strRoomType1 As String) As Double n Description returns a string that describes the hotel. <WebMethod()>public Function Description() As String n Room returns a string that describes the rooms of the hotel. <WebMethod()>public Function Room() As String n Food returns a string that describes the food available at the hotel. <WebMethod()>public Function Food() As String å To call the Full hotel Web service 1. Open the hotel_reservation.aspx file. 2. Add three label Web controls to the page with the following IDs: lblDescription, lblRoom, and lblFood. Place them before the drop-down list (just before the line: <b> Select a Room Type: </b><br>). 3. If you are using Visual Studio .NET, add a reference to the Full hotel Web service: a. Right-click ASPNET in the Solution Explorer, and then click Add Web Reference. b. In the Add Web Reference dialog box, type http://localhost/ASPNET/Hotel_Full.asmx in the Address field, press ENTER, and then click Add Reference . 38 Module 6: Using Web Services 4. Create a Page_Load event procedure. a. If you are using Visual Studio .NET, create a proxy variable for the Full hotel named hotel_FullProxy of type ASPNET. localhost.hotel_Full and then create an instance of the proxy object. Your code should look like the following: Dim hotel_FullProxy As ASPNET.localhost.hotel_Full hotel_FullProxy = New ASPNET.localhost.hotel_Full() b. If you are using Microsoft Notepad, create a proxy variable for the Full hotel named hotel_FullProxy of type myHotel_Full.hotel_Full and then create an instance of the proxy object. Note The proxy has already been created and compiled into the hotel_Full.dll DLL and placed in the \bin directory. The namespace for the Web service is myHotel_Full. Your code should look like the following: Dim hotel_FullProxy As myHotel_Full.hotel_Full hotel_FullProxy = New myHotel_Full.hotel_Full() c. Call the Description, Room, and Food methods of the Full hotel’s Web service to read information about the hotel. Display the returned information in the corresponding label controls, as shown in the following table. Label Method lblDescription Description lblRoom Room lblFood Food Your code should look like the following: lblDescription.Text = hotel_FullProxy.Description() lblRoom.Text = hotel_FullProxy.Room() lblFood.Text = hotel_FullProxy.Food() Module 6: Using Web Services 39 å To save and test your work 1. Save your changes to the file hotel_reservation.aspx. 2. If you are using Visual Studio .NET, build the project by clicking Build on the Build menu. 3. Using Internet Explorer, go to the hotel reservation page of the ASPNET Web site by viewing http://localhost/ASPNET/hotel_reservation.aspx. 4. You should see information displayed about the hotel, as shown in the following illustration. 40 Module 6: Using Web Services Exercise 2 Creating a Web Service In this exercise, you will create a Web service for another hotel, hotel_New. å To create the framework of the Web service 1. If you are using Notepad, create a new .asmx file named hotel_New.asmx, and then add the @WebService directive, the Imports statements, and the Class definition. Your code should look like the following: <%@ WebService Language="VB" Class="hotel_New" %> Imports System.Web.Services Imports System Class hotel_New End Class 2. If you are using Visual Studio .NET, create a new Web service project named hotel_New. Note Visual Studio .NET creates an .asmx file named Service1.asmx with a class named Service1. Change the name of the Service1.asmx file to hotel_new.asmx, and then change the name of the Class to hotel_New. 3. Copy the five methods from the hotel_Empty.asmx Web service into the hotel_New Web service. å To customize the WebMethods • In the hotel_New.asmx page, modify the Price, Description, Room, and Food methods to return new values. å To save and test your work 1. Save your changes to hotel_New.asmx. 2. If you are using Visual Studio .NET, build the project by clicking Build on the Build menu. 3. If you are using Microsoft Notepad, open an MS -DOS® command prompt. a. Navigate to the folder InetPub\wwwroot\ASPNET. b. Run the following commands: wsdl /l:vb /n:myHotel_New http://localhost/ASPNET/hotel_New.asmx? wsdl vbc /out:.\bin\hotel_New.dll /t:library /r:System.dll /r:System.Xml.dll /r:System.Web.Services.dll hotel_New.vb Module 6: Using Web Services 41 4. Using Internet Explorer, go to the description page of the Web Service. The Web service is located at http://localhost/ASPNET/hotel_New.asmx if you are using Microsoft Notepad. The Web service is located at http://localhost/hotel_New/hotel_New.asmx if you are using Visual Studio .NET. 5. Test the Price, Description, Room, and Food methods. å To call hotel_New from hotel_reservation.aspx • In the hotel_reservation.aspx page, call the hotel_New Web service instead of the hotel_Full Web service. Note Refer to Exercise 1 of this lab for detailed instructions on how to call a Web service from the hotel_reservation.aspx page. 42 Module 6: Using Web Services Exercise 3 (If Time Permits) Calling Another Web Service In Exercise 1, you called a Web service named Hotel_Full. In this exercise, you will call another Web service named Hotel_Empty, and then retrieve information regarding room availability. å To call another Web service The user selects a hotel on the Checkout.aspx page and that hotel is passed to the hotel_reservation.aspx page in the HotelID variable. The values are 1 for the Full hotel, and 2 for the Empty hotel. 1. At the beginning of the Page_Load event procedure in hotel_reservation.aspx, read the value of the HotelID variable using the request.Params function. Store the value in an integer variable named intHotelID. Your code should look like the following: Dim intHotelID As Integer intHotelID = CInt(Request.Params("HotelID")) 2. Initialize the text in label lblReservationConfirmation with an empty string. Module 6: Using Web Services 43 3. Test the value of the variable intHotelID. a. If the value is 1, move the code to a proxy for the Full hotel, and call methods from that Web service to this location. b. If the value is 2, create a new proxy for the Empty hotel, and call methods from this Web service. The Page_Load event should look like the following: Dim intHotelID As Integer intHotelID = CInt(Request.Params("HotelID")) ' Initialize the reservation confirmation message lblReservationConfirmation.Text = "" ' Which hotel is it? Select Case intHotelID Case 1 ' Create a proxy for the Full hotel Dim hotel_FullProxy As myHotel_Full.hotel_Full hotel_FullProxy = New myHotel_Full.hotel_Full() ' Get the general, room and food descriptions lblDescription.Text = hotel_FullProxy.Description() lblRoom.Text = hotel_FullProxy.Room() lblFood.Text = hotel_FullProxy.Food() Case 2 ' create a proxy for the Empty hotel Dim hotel_EmptyProxy As myHotel_Empty.hotel_Empty hotel_EmptyProxy = New myHotel_Empty.hotel_Empty() ' Get the general, room and food descriptions lblDescription.Text = hotel_EmptyProxy.Description() lblRoom.Text = hotel_EmptyProxy.Room() lblFood.Text = hotel_EmptyProxy.Food() End Select å To save and test your work 1. Save your changes to the file hotel_reservation.aspx. 2. Using Internet Explorer, go to Checkout.aspx page in the ASPNET Web site, http://localhost/ASPNET/Checkout.aspx 3. Click Hotel Full. You should see the descriptions from the Full hotel. 4. Return to the Checkout page, and then click Hotel Empty. You should see the descriptions from the Empty hotel. 44 Module 6: Using Web Services å To get the availability of the room On the hotel_reservation.aspx page, when the user clicks Submit, call the Reserve method of the hotel Web service and, if there is an available room, call the Price method to determine the price of the room. 1. Inside the Submit button’s click event procedure (cmdSubmit_Click), after the test for the calendar dates, add code to retrieve the HotelID variable from the query string. 2. Test the type of hotel. Again, the values are 1 for the Full hotel, and 2 for the Empty hotel. 3. For each of the two cases, create a proxy for the corresponding Web service and call the Reserve method. The Reserve method requires the following parameters: Parameter Data Type Description strRoomType1 String Indicates if the room should be single or double. strRoomType2 String Indicates if the room should be smoking or nonsmoking. dtmStartDate Date The starting date. dtmEndDate Date The ending date. Module 6: Using Web Services 45 4. Display a message in the lblReservationConfirmation label indicating the availability of a room. If there is an available room, include in the message the type of room that was selected, the dates requested, and the price. The code that you have added should look like the following: Dim intHotelID As Integer Dim blnRoomFree As Boolean = False Dim dblPrice As Double = 0.00 ' Obtain HotelID from QueryString intHotelID = CInt(Request.Params("HotelID")) ' Ask the hotel service if there is an available room Select Case intHotelID Case 1 ' Create a proxy for the Full hotel Dim hotel_FullProxy As myHotel_Full.hotel_Full hotel_FullProxy = new myHotel_Full.hotel_Full() ' Get the availability of the selected type of room ' for the specified dates blnRoomFree = hotel_FullProxy.Reserve _ (lstRoomType1.SelectedItem.Text, _ lstRoomType2.SelectedItem.Text, _ calStartingDate.SelectedDate, _ calEndingDate.SelectedDate) ' Get the price dblPrice = hotel_FullProxy.Price _ (lstRoomType1.SelectedItem.Text) Case 2 ' Create a proxy for the Empty hotel Dim hotel_EmptyProxy As myHotel_Empty.hotel_Empty hotel_EmptyProxy = new myHotel_Empty.hotel_Empty() ' Get the availability of the selected type of room ' for the specified dates blnRoomFree = hotel_EmptyProxy.Reserve _ (lstRoomType1.SelectedItem.Text, _ lstRoomType2.SelectedItem.Text, _ calStartingDate.SelectedDate, _ calEndingDate.SelectedDate) ' Get the price dblPrice = hotel_EmptyProxy.Price _ (lstRoomType1.SelectedItem.Text) End Select ' code continued on next page 46 Module 6: Using Web Services ' code continued from previous page ' Build the confirmation message If blnRoomFree Then lblReservationConfirmation.Text = _ "Room available. " & _ "<br><br> Your selection was:<br>" & _ lstRoomType1.SelectedItem.Text & ", " & _ lstRoomType2.SelectedItem.Text & "<br>" & _ "from " & _ calStartingDate.SelectedDate.ToShortDateString() _ & " to " & _ calEndingDate.SelectedDate.ToShortDateString() _ & "<br><br>" & "The price will be: " & _ System.String.Format("{0:c}", dblPrice) Else lblReservationConfirmation.Text = _ "No room available." End If å To save and test your work 1. Save your changes to the file hotel_reservation.aspx. 2. Using Internet Explorer, go to the Checkout.aspx page in the ASPNET Web site, http://localhost/ASPNET/Checkout.aspx 3. Click Hotel Full. 4. Select a room type and starting and ending dates, and then click Reserve . You should see a message stating that there is no room available. 5. Return to the Checkout.aspx page and click Hotel Empty. 6. Select a room type and starting and ending dates, and then click Reserve . You should see a message stating that a room is available and its price should be displayed. Module 6: Using Web Services Review n What Is a Web Service? n Calling a Web Service from a Browser n Calling a Web Service by Using a Proxy n Creating a Simple Web Service by Using Visual Basic n Creating and Calling a Web Service by Using Visual Studio .NET *****************************illegal for non-trainer use****************************** 1. What is the main purpose of Web services? 2. How do you find an existing Web service? 3. What are the different methods of calling a Web service? 4. What is the WSDL contract for a Web service? 47 48 Module 6: Using Web Services 5. How do you create methods for a Web service? 6. How do you call methods of a Web service? Module 7: Creating a Microsoft ASP.NET Web Application Contents Overview 1 Requirements of a Web Application 2 What Is New in ASP.NET? 3 Sharing Information Between Pages Securing an ASP.NET Application 13 24 Lab 7: Creating an ASP.NET Web Application 38 Review 50 Information in this document, including URL and other Internet Web site references, is subject to change without notice. Unless otherwise noted, the example companies, organizations, products, domain names, e-mail addresses, logos, people, places, and events depicted herein are fictitious, and no association with any real company, organization, product, domain name, e-mail address, logo, person, places or events is intended or should be inferred. Complying with all applicable copyright laws is the responsibility of the user. Without limiting the rights under copyright, no part of this document may be reproduced, stored in or introduced into a retrieval system, or transmitted in any form or by any means (electronic, mechanical, photocopying, recording, or otherwise), or for any purpose, without the express written permission of Microsoft Corporation. Microsoft may have patents, patent applications, trademarks, copyrights, or other intellectual property rights covering subject matter in this document. Except as expressly provided in any written license agreement from Microsoft, the furnishing of this document does not give you any license to these patents, trademarks, copyrights, or other intellectual property. 2001 Microsoft Corporation. All rights reserved. Microsoft, MS-DOS, Windows, Windows NT, ActiveX, FrontPage, IntelliSense, Jscript, Outlook, PowerPoint, Visual Basic, Visual InterDev, Visual C++, Visual C#, Visual Studio, and Windows Media are either registered trademarks or trademarks of Microsoft Corporation in the U.S.A. and/or other countries. The names of actual companies and products mentioned herein may be the trademarks of their respective owners. Module 7: Creating a Microsoft ASP.NET Web Application 1 Overview n Requirements of a Web Application n What Is New in ASP.NET? n Sharing Information Between Pages n Securing an ASP.NET Application *****************************illegal for non-trainer use****************************** Just as in Active Server Pages (ASP), Microsoft® ASP.NET supports the concept of a Web application with applic ation-specific settings and services. An ASP.NET application is defined as all the files, pages, handlers, modules, and executable code that can be invoked from a virtual directory and its subdirectories on a Web application server. In this module, you will learn about some of the files that are used to build Web applications and some of the capabilities of an ASP.NET application, such as maintaining state and authentication. You will also learn how to configure and deploy an ASP.NET application. After completing this module, you will be able to: n Describe cookie-less sessions. n Set up cookie-less sessions in the web.config file. n Use event procedures in global.asax. n Set up page output caching for ASP.NET pages. n Share information between pages of an ASP.NET application by using ASP.NET cache, web.config, session variables, and a database. n Describe how authentication works. n Set up authentication for an application in web.config. 2 Module 7: Creating a Microsoft ASP.NET Web Application Requirements of a Web Application n State Maintenance n Security n Performance and Scalability n Easy Configuration n Easy Deployment *****************************illegal for non-trainer use****************************** A good Web application meets the following requirements: n State maintenance n Web applications should be able to maintain state across pages. If state is maintained between pages, information supplied by users can be reused and users do not need to enter the same information multiple times. Security A good Web application should have security features. Most importantly, it should be able to authenticate and authorize users who can access the application. n Performance and scalability n All Web applications should be built with high performance and scalability in mind. Caching is an extremely important technique for building highperformance, scalable Web server applications. Easy configuration Configuration is an important aspect of any application. A central requirement of any Web application server is a rich and flexible configuration system. The objective is to enable developers to associate settings easily with an installable application without needing to embed values into code. This allows administrators to adjust or customize these values easily after the Web application has been deployed. n Easy deployment Historically, one of the biggest problems associated with Web applications is deployment. A well-designed Web application is easy to deploy. Module 7: Creating a Microsoft ASP.NET Web Application u What Is New in ASP.NET? n Cookie-less Session IDs n Configuration File (web.config) n Setting Up Cookie-less Sessions n Global Application File (Global.asax) n Demonstration: Using Event Procedures in Global.asax n Page Caching *****************************illegal for non -trainer use****************************** In addition to all of the features provided by ASP, ASP.NET provides several new features designed to enhance the functionality of an application. This section focuses on the new features in ASP.NET. 3 4 Module 7: Creating a Microsoft ASP.NET Web Application Cookie-less Session IDs n Each Active Session Is Identified and Tracked Using Session IDs n SessionIDs Are Communicated Across Client-Server Requests Using an HTTP Cookie or Included in the URL n Using a Cookie l n Default mechanism for storing SessionIDs Cookie-less Sessions l Information is encoded into URLs http://server/(h44a1e55c0breu552yrecobl)/page.aspx http://server/(h44a1e55c0breu552yrecobl)/page.aspx *****************************illegal for non-trainer use****************************** Each active session in ASP.NET is identified and tracked by using a 120-bit SessionID string containing Uniform Resource Locator (URL) -legal ASCII characters. SessionID values are generated by using an algorithm that guarantees both uniqueness and randomness. SessionIDs are communicated across client-server requests by using either a Hypertext Transfer Protocol (HTTP) cookie or included in the URL. Using Cookies Cookies are a mechanism by which data can be maintained in a file on the user's computer. By default, SessionIDs are stored in cookies. However, users can turn of f cookies through a setting in their browsers. This creates the risk that your Web application will not work if it requires session information conveyed by cookies and a user has disabled cookies in his or her browser. Module 7: Creating a Microsoft ASP.NET Web Application Using Cookie-less Sessions The ability to use cookie-less sessions in ASP.NET is a new concept that was not available with earlier technologies, including ASP. This method uses URLs, as opposed to cookies, to pass the SessionID to an ASP.NET page. It involves encoding data into a URL, which is done automatically by the browser. This enables you to use session state even with browsers that have cookie support disabled. For example, the browser generates the following URL for a request to the ShoppingCart.aspx page on the http://localhost/conference web site: http://localhost/conference/(h44a1e55c0breu552yrecobl)/ShoppingCart.aspx To enable cookie-less sessions, add the following to the web.config configuration file: <sessionState cookieless="true"/> 5 6 Module 7: Creating a Microsoft ASP.NET Web Application Configuration File (web.config) n All Configuration Information for an ASP.NET Application Is Contained in web.config n Web.config Can Be Placed in the Same Folder as the Application Files n Web.config Contains Sections for Each Major Category of ASP.NET Functionality <configuration> <configuration> <system.web> <system.web> <trace <trace enabled="true" enabled="true" requestlimit="40" requestlimit="40" pageoutput="true"/> pageoutput="true"/> </system.web> </system.web> </configuration> </configuration> *****************************illegal for non-trainer use****************************** ASP.NET configuration uses hierarchical configuration architecture. All configuration information for an ASP.NET application is contained in configuration files named web.config that can be placed in the same directories as the application files. Child directories inherit the settings of the parent directories unless overridden by a web.config file in the child directory. If a web.config file is present at the root directory of a Web serverfor example, Inetpub\wwwrootthe configuration settings will apply to every application in that server. The presence of a web.config file within a given directory or application root is optional. If a web.config file is not present, all configuration settings for the directory are automatically inherited from the parent directory. The root configuration file for all Web applications is named machine.config, and is found in the c:\winnt\Microsoft.NET\Framework\v<version_number>\Config folder. Module 7: Creating a Microsoft ASP.NET Web Application 7 In a web.config file, there are sections for each major category of ASP.NET functionality, as shown in the following table. Section name Description <browsercaps> Responsible for controlling the settings of the browser capabilities component. <compilation> Responsible for all compilation settings used by ASP.NET. <globalization> Responsible for configuring the globalization settings of an application. <httpmodules> Responsible for configuring HTTP modules within an application. HTTP modules participate in the processing of every request into an application. Common uses include security and logging. <httphandlers> Responsible for mapping incoming URLs to IHttpHandler classes . Sub-directories do not inherit these settings. Also responsible for mapping incoming URLs to IHttpHandlerFactory classes. Data represented in <httphandlerfactories> sections are hierarchically inherited by sub-directories. <iisprocessmodel> Responsible for configuring the ASP.NET process model settings on Internet Information Services (IIS) Web Server Systems. <authentication> <identity> <authorization> Responsible for all security settings used by the ASP.NET security HttpModule. <sessionState> Responsible for configuring the session state HttpModule. <trace> Responsible for configuring the ASP.NET trace service. ASP.NET configuration settings are represented within these configuration sections. For example, as you saw in Module 5, “Using Trace in Microsoft ASP.NET Pages,” in Course 2063B, Introduction to Microsoft ASP.NET, you can turn the trace feature on for an entire application in the <trace> configuration section as follows: <configuration> <system.web> <trace enabled="true" requestlimit="40" pageoutput="true"/> </system.web> </configuration> 8 Module 7: Creating a Microsoft ASP.NET Web Application Setting Up Cookie-less Sessions n Session State Is Configured in the <sessionState> Section of web.config n <sessionState> Settings: n l cookieless l mode l timeout l sqlConnectionString Setting Up Cookie-less Session <sessionState <sessionState cookieless="true“ cookieless="true“ /> /> *****************************illegal for non-trainer use********************** ******** Session state features can be configured by the <sessionState> section in the web.config file. The <sessionState> section sets the behavior of the session state throughout the application. The following table lists the settings of the <sessionState> section and their descriptions. Setting Description cookieless="[true/false]" Indicates whether cookies should be used to store Session IDs. The default value is False. When the value is False, cookies are used. mode="[off/InProc/ SQLServer/StateServer]" Specifies where the session information is kept: in memory on the Web server; in a Microsoft SQL Server™ database; or in a separate process on the Web server or remote computer. sqlConnectionString Specifies the connection string for a SQL Server. For example, "data source=127.0.0.1;user id=sa; password=". This attribute is required when mode is set to sqlserver. timeout="[number of minutes]" Specifies the number of minutes a session can be idle before it is abandoned. The default value is 20 minutes. For example, to double the default timeout of 20 minutes, the following can be added to the web.config of an application: <sessionstate timeout="40" /> Setting Up a Cookie-less Session By default, ASP.NET uses cookies to identify requests within a single session. If cookies are not available, or have been disabled by the user, a session can be tracked by adding a session identifier to the URL. You can enable cookie -less sessions as follows: <sessionstate cookieless="true" /> Module 7: Creating a Microsoft ASP.NET Web Application 9 Global Application File (Global.asax) n Global.asax is Similar to Global.asa in ASP Applications n Global.asax Supports More Than 15 Events l As page is requested: BeginRequest, AuthenticateRequest, AuthorizeRequest l As page is returned: EndRequest *****************************illegal for non-trainer use****************************** Similar to ASP, ASP.NET supports one global declarative file per application for application events and state called global.asax. The global.asax file is similar to ASP’s global.asa, but has numerous new events that are not supported by global.asa. Note In ASP.NET, global.asax can be used as an .asax file or as a component that can be deployed in the application’s /bin directory. Events The event model provided by ASP.NET supports more than 15 events. This is different from global.asa, which had only Application and Session OnStart and OnEnd events. For example, in ASP, if you wanted some code to run at the beginning of every page, you would have needed to use an Include file at the top of every ASP page. Using the ASP.NET global.asax file, you can simply declare the code in the Application_BeginRequest event procedure, which is called at the beginning of every request for the application. Sub Application_BeginRequest(s As Object, e As EventArgs) ... End Sub 10 Module 7: Creating a Microsoft ASP.NET Web Application ASP.NET still supports the Application and Session OnStart and OnEnd event procedures, but Global.asax also includes events that are fired when a client requests a page. The following table lists events that can be used when a page is requested. Event Name Description Application_Error This event is fired when an un-handled error occurs within an application. Application_BeginRequest This event is fired whenever a new request is received. Application_AuthenticateRequest This event indicates that the request is ready to be authenticated. Application_AuthorizeRequest This event signals that the request is ready to be authorized. Application_ResolveRequestCache This event is used by the output cache module to stop the processing of requests that have been cached. Application_AcquireRequestState This event signals that per-request state should be obtained. Application_PreRequestHandlerExecute This event signals that the request handler is about to execute. Global.asax also includes events that are fired when the requested page is sent back to the client. The following table lists these events. Event Name Description Application_PostRequestHandlerExecute This event is first available after the handler (such as an ASP.NET page), or Web service has completed its work. Application_ReleaseRequestState This event is called when the request state should be stored, because the application is finished with it. Application_UpdateRequestCache This event signals that code processing is complete and the file is ready to be added to the ASP.NET cache. Application_EndRequest This event is the last event called when the application ends. Application_PreRequestHeaderSent This event provides the opportunity to add, remove, or update headers and the response body. Module 7: Creating a Microsoft ASP.NET Web Application 11 Demonstration: Using Event Procedures in Global.asax *****************************illegal for non-trainer use****************************** In this demonstration, you will see how to display events fired in the global.asax file. å To run this demonstration 1. Copy the file <install folder>\Democode\Mod07\global.asax to the folder <install folder>. This is the root of the 2063 virtual directory. 2. Open the file global.asax. There are Response.Write statements in the event procedures. 3. View http://localhost/2063/DemoCode/Mod07/GlobalEvents.aspx in Microsoft Internet Explorer. 4. Delete the global.asax file from the root of the 2063 virtual directory. 12 Module 7: Creating a Microsoft ASP.NET Web Application Page Caching n n Output Caching l Caches content generated from dynamic pages l Page is compiled into IL and native code l Native code is cached as Page class and is available to serve for the next request l Page class is updated when the source ASP.NET file is changed or cache timeout happens Setting the Cache Timeout <%@ <%@ OutputCache OutputCache Duration= Duration= "900" "900" %> %> *****************************illegal for non-trainer use****************************** Page caching allows you to cache dynamic content. When an ASP.NET page is accessed for the first time, the page is compiled into Intermediate Language (IL) and to native code. This native code is cached as Page class and is available to serve the next request. This cached Page class is updated and rebuilt when the source ASP.NET file is changed or the cache timeout is reached. Setting the Cache Timeout Value You can specify the cache timeout value by setting the output cache page directive. For example, to cache an ASP.NET page for 15 minutes, add the following @OutputCache directive to the .aspx page: <%@OutputCache Duration="900" %> The unit for time for the Duration attribute is seconds. This cache option is very useful for pages that do not change often (or do not change within a known time period). Note Creating an output cache for an application should be your final task in application development. Otherwise, when you debug your pages, instead of getting new and modified pages, you may get old pages that are stored in the output cache. Module 7: Creating a Microsoft ASP.NET Web Application u Sharing Information Between Pages n Using ASP.NET Cache n Using web.config Variables n Demonstration: Using web.config Variables n Using Session and Application Variables n Demonstration: Using Session Variables n Saving Session and Application Variables in a Database n Discussion: Different Ways of Sharing Information *****************************illegal for non-trainer use********** ******************** It is often necessary to share information between the pages of a Web application. The information being shared can be either static or dynamic. In this section, you will learn how to share both static and dynamic data between pages of a Web application. 13 14 Module 7: Creating a Microsoft ASP.NET Web Application Using ASP.NET Cache n ASP.NET Cache: l n Stores objects and values for reuse in an application Placing Objects in ASP.NET Cache Cache.Insert("mykey", Cache.Insert("mykey", myValue, myValue, __ Nothing, Nothing, DateTime.Now.AddHours(1), DateTime.Now.AddHours(1), __ TimeSpan.Zero) TimeSpan.Zero) n Retrieving Objects From ASP.NET Cache myValue myValue == Cache("mykey") Cache("mykey") If If myValue myValue <> <> Nothing Nothing Then Then DisplayData(myValue) DisplayData(myValue) End End If If *****************************illegal for non-trainer use****************************** The ASP.NET cache can be used to store objects and values that you reuse in your application. ASP.NET provides a full-featured cache engine that can be used by pages to store and retrieve arbitrary objects across HTTP requests. The ASP.NET cache is private to each application and stores objects in memory. The lifetime of the cache is equivalent to the lifetime of the application. This means that, when the application is restarted, the cache is recreated. The ASP.NET cache also provides a way to pass values between pages within the same application. The ASP.NET cache methods implement automatic locking; therefore, it is safe for objects to be accessed concurrently from more than one page. The only drawback is that another page may change the values that you place in the cache. It is not a per-user cache. The cache provides a simple dictionary interface that allows you to insert objects easily and retrieve them later. In the simplest case, placing an item in the cache is exactly like adding an item to a dictionary: Cache("mykey") = myValue Retrieving this data is equally simple: myValue = Cache("mykey") If myValue <> Nothing Then DisplayData(myValue) End If You can also supply parameters when inserting an item into the cache by using the Insert method. Module 7: Creating a Microsoft ASP.NET Web Application 15 Cache.Insert Syntax Cache.Insert ( key As String, _ value As Object, _ dependencies As CacheDependency, _ absoluteExpiration As DateTime, _ slidingExpiration As TimeSpan ) n key is the cache key used to reference the object. n value is the object to be cached. n dependencies should be set to Nothing. n absoluteExpiration is the time at which the cached object expires and is removed from the cache. n slidingExpiration is the interval between the time the cached object was last accessed and when that object is scheduled to expire. For example, if slidingExpiration is set to 20 minutes, the object will expire and be removed from the cache 20 minutes after the object was last accessed. The following code shows how to use the ASP.NET cache to store a DataView that is used in an ASPX page. The first time the page is requested, it reads data from the database and then stores it in the ASP.NET cache. At every subsequent request for the page, the DataView is retrieved from the cache, eliminating a call to the database. This example uses absolute expiration to set the cache to expire one hour from the first time it was accessed. Dim dvMenuItems As DataView dvMenuItems = Cache("dvMenuItems") If (dvMenuItems = Nothing) Then Dim products As New Conference.ProductsDB dvMenuItems = products.GetProductCategories(). _ Tables(0).DefaultView Cache.Insert("dvMenuItems", dvMenuItems, Nothing, _ DateTime.Now.AddHours(1), TimeSpan.Zero) End If MyList.DataSource = dvMenuItems MyList.DataBind() To set the cache to use sliding expiration and expire one hour after the last time it was accessed, apply the following parameters to the Insert method: Cache.Insert("dvMenuItems", dvMenuItems, Nothing, _ DateTime.Now, TimeSpan.FromHours(1)) 16 Module 7: Creating a Microsoft ASP.NET Web Application Using web.config Variables n Store Application Variables in web.config <configuration> <configuration> <appsettings> <appsettings> <add <add key="pubs" key="pubs" value= value= "server=localhost;uid=sa;pwd=;database=pubs"/> "server=localhost;uid=sa;pwd=;database=pubs"/> </appsettings> </appsettings> </configuration> </configuration> n Retrieve in an .aspx File Dim Dim appSetting appSetting As As NameValueCollection NameValueCollection Dim strConn As String Dim strConn As String appSetting appSetting == CType(Context.GetConfig CType(Context.GetConfig __ ("appsettings"), ("appsettings"), NameValueCollection NameValueCollection )) strConn = appSetting("pubs").ToString() strConn = appSetting("pubs").ToString() *****************************illegal for non-trainer use****************************** You can use the <appsettings> section of the web.config file as a repository for application settings. In the <appsettings> section, you can create key/value pairs for data that is commonly used throughout your application. This is very useful because you can define all application configuration data in a central location. For example, you can store a database connection string for an application in a central location, instead of having it in each ASP.NET page. The following web.config file creates two key/value pairs for the connection strings for the databases used in the application: <configuration> <appsettings> <add key="pubs" value="server=localhost;uid=sa;pwd=;database=pubs" /> <add key="northwind" value="server=localhost;uid=sa;pwd=;database=northwind" /> </appsettings> </configuration> Use the GetConfig method of the Context object to read the data from the web.config file. You need to supply the name of the section and the name of the key to retrieve. The GetConfig method returns a NameValueCollection variable containing the key/value pairs defined in the requested section. Module 7: Creating a Microsoft ASP.NET Web Application For example, the following sample code reads the value of the pubs key from the <appSettings> section. Dim appSetting As NameValueCollection Dim strConn As String appSetting = CType(Context.GetConfig("appsettings"), _ NameValueCollection) strConn = appSetting("pubs").ToString() You can also use the GetConfig method of the HttpContext object to access configuration information from a component. The syntax for this is: appSetting = _ CType(HttpContext.Current.GetConfig("appsettings"), _ NameValueCollection) 17 18 Module 7: Creating a Microsoft ASP.NET Web Application Demonstration: Using web.config Variables *****************************illegal for non-trainer use****************************** In this demonstration, you will see how to create a constant in web.config and use the constant from different ASP.NET pages. å To run the demonstration 1. Create a new web.config file in the folder <install folder>\DemoCode\Mod07. 2. Add the <configuration> tag with an <appsettings> section. 3. Add a new key to the <appsettings> section: <configuration> <appSettings> <add key="intNumberInConfig" value="9" /> </appSettings> </configuration> 4. Open the file <install folder>\DemoCode\Mod07\UsingConfigVar1.aspx. The intNumberInConfig value is retrieved and displayed in the Page_Load event procedure. 5. View the UsingConfigVar1.aspx page in Internet Explorer. The value of intNumberInConfig, 9, is displayed. 6. Click Next. The UsingConfigVar2.aspx page opens and displays the same value. Module 7: Creating a Microsoft ASP.NET Web Application Using Session and Application Variables n Session Object Stores Information for a Particular User Session Sub Sub Session_Start(s Session_Start(s As As Object, Object, ee As As EventArgs) EventArgs) Session("BackColor") Session("BackColor") == "beige" "beige" Session("ForeColor") Session("ForeColor") == "black" "black" End End Sub Sub n Application Object Shares Information Among All Users of a Web Application Sub Sub Application_Start(s Application_Start(s As As Object, Object, ee As As EventArgs) EventArgs) Application("NumberofVisitors") Application("NumberofVisitors") == 00 End End Sub Sub *****************************illegal for non-trainer use****************************** You can use session and application variables to share information between pages of an ASP.NET application. You generally initialize session and application variables in the Start event procedures of the Session and Application objects in the global.asax file. Session Variables You use the Session object to store information that is needed for a particular user session. Va riables stored in the Session object will not be discarded when the user goes between pages in the Web application. Instead, these variables will persist for the entire user session. The following example illustrates how session variables are used to store information about a particular user session. <script language="VB" runat="server"> Sub Session_Start(S As Object, E As EventArgs) Session("BackColor") = "beige" Session("ForeColor") = "black" Session("FontName") = "verdana" End Sub </script> 19 20 Module 7: Creating a Microsoft ASP.NET Web Application Application Variables You can use the Application object to share information among all users of a Web application. An Application object is created when the first user of the application requests an .aspx file. It is destroyed when all users have exited the application and the application is unloaded. For example, you might store the total number of visitors to a Web site in an application- level variable. Sub Application_Start(s As Object, e As EventArgs) Application("NumberofVisitors") = 0 End Sub Note A disadvantage of using session and application variables is that the memory occupied by these variables will not be released until the value is either removed or replaced. For example, keeping seldom-used 10-megabyte (MB) recordsets in application-state permanently is not the best use of system resources. Reading Session and Application Variables To use a session or application variable in an ASP.NET page, simply read the value from the Session or Application object. Session("BackColor") Session("ForeColor") Session("FontName") Application("NumberofVisitors") Module 7: Creating a Microsoft ASP.NET Web Application 21 Demonstration: Using Session Variables *****************************illegal for non-trainer use****************************** In this demonstration, you will learn how to share the same session variable through two different ASP.NET pages. å To run the demonstration 1. Copy the file <install folder>\Democode\Mod07\global.session to the root of the 2063 virtual folder and rename it global.asax. 2. Open the file global.asax and initialize a session variable named intNumber to 3 by adding the following code to the Session_Start event procedure: Session("intNumber")=3 3. Open the file <install folder>\Democode\Mod07\UsingSessionVar1.aspx. The session variable is retrieved and displayed in the Page_Load event procedure. 4. View the page http://localhost/2063/democode/Mod07/UsingSessionVar1.aspx in Internet Explorer. The value of the session variable, 3, is displayed. 5. Click Next. The UsingSessionVar2.aspx page opens, increments the session variable by 4, and displays the new value, 7. 6. Click Back to return to the UsingSessionVar1.aspx, which displays the new value of the session variable. 22 Module 7: Creating a Microsoft ASP.NET Web Application Saving Session and Application Variables in a Database n Session State Can Be Stored in a Separate SQL Server Database n A Temporary Table Is Used for the Serialized Session Data n Advantages: l State can be recovered even if an application crashes l An application can be partitioned across multiple Web farm machines *****************************illegal for non-trainer use****************************** In ASP.NET, an application can store session state in a separate SQL Server database. A temporary table is used for the serialized session data. The table can be accessed by a combination of stored procedures and managed data access components for SQL Server. By cleanly separating the storage of session data from the application usage of it, ASP.NET provides advantages that did not exist in ASP: n Ability to recover from application crashes n Because all state is stored externally from an individual worker process, it will not be lost if the process crashes or is forcibly restarted. Ability to partition an application across multiple Web farm servers Because all state is stored externally from worker processes, you can partition an application across multiple worker processes running on multiple servers. The model for communicating state between a worker process and a state service running on the same server is almost identical to models in which the state service is located on a completely different machine. To configure your application to store session state in a separate database, set the mode attribute of the sessionState section to SQLServer and set the sqlConnectionString attribute to the connection string for the server. For more information on saving session information in a database, see “Session State” in the Microsoft .NET Framework software development kit (SDK) documentation. Module 7: Creating a Microsoft ASP.NET Web Application Discussion: Different Ways of Sharing Information *****************************illegal for non-trainer use**************** ************** 23 24 Module 7: Creating a Microsoft ASP.NET Web Application u Securing an ASP.NET Application n What Is Authentication? n Forms Authentication Architecture n Setting Up Security in web.config n Creating a Login Form n Demonstration: Setting Up Security in web.config *****************************illegal for non-trainer use****************************** Securing Web sites is a critical is sue for Web developers. A secure system requires careful planning, and Web site administrators and programmers must have a clear understanding of the options for securing a site. Security, in the context of an ASP.NET application, involves performing three fundamental functions for all requests: authentication, authorization, and impersonation. Authentication is the process verifying that the user requesting a page is actually that user. To authenticate a request, you accept credentials from a user and validate those credentials against some authority. After you have authenticated the user, the authorization process determines whether that user should be granted access to a given resource. Another important feature of server applications is the ability to control the identity under which server application code is executed. When a server application executes code with the identity of the requesting entity, this is known as impersonation. In this section, you will learn about securing an ASP.NET application by implementing authentication and authorization in web.config. Module 7: Creating a Microsoft ASP.NET Web Application 25 What Is Authentication? n n Authentication l Accept credentials from a user l Validate the credentials Types of ASP.NET Authentication l Windows authentication l Passport authentication l Forms authentication *****************************illegal for non-trainer use****************************** Authentication is the process of accepting credentials from a user and validating those credentials against some authority. If the credentials are valid, you have an authenticated identity. Authentication in ASP.NET is implemented through authentication providers. ASP.NET authentication providers are the code modules that contain the code necessary to authenticate the requestor ’s credentials. The first version of ASP.NET will ship with support for the following authentication providers: n Windows authentication This method is used in conjunction with the IIS authentication. Authentication is performed by IIS in one of three ways: Basic, Digest, or Integrated Windows Authentication. The advantage of using this authentication type is that it requires minimum coding. Also, because it is Microsoft Windows NT ® authentication, there is no additional cost to implement this type of security. However, because the resources for authentication are not embedded in the ASP.NET application, using this method involves additional effort when deploying the application. n For more information on Windows authentication, see the Microsoft .NET Framework SDK documentation. Passport authentication Passport authentication is a centralized authentication service provided by Microsoft that offers a single sign-in and core profile services for member sites. It is a Web service and an integral part of the Microsoft .NET Framework. For more information on Passport authentication, go to: http://www.passport.com/Business 26 Module 7: Creating a Microsoft ASP.NET Web Application n Forms authentication Forms authentication refers to a system where unauthenticated requests are redirected to a Hypertext Markup Language (HTML) form (by using HTTP client-side redirection). The user provides credentials and submits the form. If the application validates credentials on the form, the system issues a cookie to the user. Subsequent requests are issued with the cookie in the request headers; therefore, they are authenticated. Module 7: Creating a Microsoft ASP.NET Web Application 27 Forms Authentication Architecture ASP.NET Authentication Not Authenticated Client requests page Access Denied û Not Authenticated Cookie û Login Page (Users enter their credentials) Authenticated Authorized Authenticated Authorized Requested Page *****************************illegal for non-trainer use****************************** The most commonly used authentication type in ASP.NET applications is forms authentication. A request for a page protected by forms authentication must still go through IIS first. Therefore, you must set IIS authentication to Anonymous Access. This allows all requests to get to ASP.NET before being authenticated. Tip For more information on setting up Anonymous Access, see the Security section in the IIS documentation. The following is the set of events that take place during forms authentication: 1. A client generates a request for a protected page. 2. IIS receives the request, and passes it to the ASP.NET application. Because the authentication mode is set to Anonymous Access, IIS authentication is not used. 3. ASP.NET checks to see if a valid authentication cookie is attached to the request. If it is, this means that the user’ s credentials have already been confirmed, and the request is tested for authorization. The authorization test is performed by ASP.NET and is accomplished by comparing the credentials contained in the request’s authorization cookie to the authorization settings in the application’ s configuration file (web.config). If the user is authorized, access is granted to the protected page. 4. If there is no cookie attached to the request, ASP.NET redirects the request to a login page (the path of which resides in the application’s configuration file), where the user enters the required credentials, usually a name and password. 28 Module 7: Creating a Microsoft ASP.NET Web Application 5. The application code on the login page checks the credentials to confirm their authenticity and, if authenticated, attaches a cookie containing the credentials to the request. If authentication fails, the request is returned with an “Access Denied” message. 6. If the user is authenticated, ASP.NET checks authorization as in step 3, and can either allow access to the originally requested, protected page or redirect the request to some other page, depending on the design of the application. Alternatively, it can direct the request to some custom form of authorization where the credentials are tested for authorization to the protected page. Usually if authorization fails, the request is returned with an “Access denied”message. Module 7: Creating a Microsoft ASP.NET Web Application 29 Setting Up Security in web.config n Setting Up Authentication <system.web> <system.web> <authentication <authentication mode="Forms"> mode="Forms"> <forms <forms name="name" name="name" loginurl="login.aspx"/> loginurl="login.aspx"/> </authentication> </authentication> </system.web> </system.web> n Setting Up Authorization <location <location path="ShoppingCart.aspx"> path="ShoppingCart.aspx"> <system.web> <system.web> <authorization> <authorization> <deny <deny users="?"/> users="?"/> <allow <allow users="Mary"/> users="Mary"/> </authorization> </authorization> </system.web> </system.web> </location> </location> *****************************illegal for non-trainer use****************************** Security for ASP.NET applications is set up in the application’s web.config file. The security settings in web.config are included in the <authentication>, <authorization>, and <identity> sections. Note You can set up authentication only in the web.config file in the root of your Web application. Setting Up Authentication Begin by setting the authentication method for the application in an <authentication> subsection of the <system.web> section, as shown in the following example. <configuration> <system.web> <authentication mode="authmode"> </authentication> </system.web> </configuration> As mentioned earlier in this module, ASP.NET supports three types of authentication: Windows authentication, Forms authentication, and Passport authentication. You can set the authentication mode for an application by setting the mode attribute in the <authentication> tag to "None", "Windows", "Passport", or "Forms". 30 Module 7: Creating a Microsoft ASP.NET Web Application If you set the authentication mode to “Forms”, you need to add a <forms> element to the <authentication> section, as shown in the following example: <system.web> <authentication mode="Forms"> <forms name=".namesuffix" loginurl="login.aspx" /> </authentication> </system.web> In the <forms> section, you configure settings of the cookie. Set the name attribute to the suffix to be used for the cookies and the loginUrl attribute to the URL of the page to which un-authenticated requests are redirected. Setting Up Authorization After specifying the authentication mode, you need to either mark the entire Web application as needing authorization or specify which pages are secure and require authorization. Securing an Entire Application To mark the entire application as secure, create an <authorization> section in the <authentication> section, as illustrated in the following code example: <system.web> <authentication mode="Forms"> <forms name=".aspxauth" loginurl="login.aspx" /> <authorization> </authorization> </authentication> </system.web > Module 7: Creating a Microsoft ASP.NET Web Application 31 Securing Specific Pages To mark only specific pages as secure, create a <location> section with <sys tem.web> and <authorization> sub-sections for each secure page in your Web application: <location path="ShoppingCart.aspx"> <system.web> <authorization> </authorization> </system.web> </location> Any configuration settings contained in the <location> section will be directed at the file or directory indicated in the path attribute. There can be multiple <location> sections in the <configuration> section. In the <system.web> section, you create an <authorization> subsection to specify what type of authorization will be enforced. Create <allow> or <deny> tags to allow or deny users access to a page. Within these tags, "?" indicates anonymous users, whereas "*" means all users. For example, the following code denies access to all anonymous users. <authorization> <deny users="?"/> </authorization> The following code allows the user “Mary”access to a page: <authorization> <allow users="Mary"/> </authorization> The following example denies all anonymous users access to the ShoppingCart.aspx page. <location path="ShoppingCart.aspx"> <system.web> <authorization> <deny users="?"/> </authorization> </system.web> </location> For more information about setting up authorization in web.config, see “ASP.NET Authorization”in the Microsoft .NET Framework SDK documentation. 32 Module 7: Creating a Microsoft ASP.NET Web Application Creating a Login Form n Login Page Verifies and Checks the Credentials of a User l Login page validates user credentials and redirects if valid Sub Sub cmdLogin_Click(s cmdLogin_Click(s As As Object, Object, ee As As EventArgs) EventArgs) If If (login(txtEmail.Value, (login(txtEmail.Value, txtPassword.Value)) txtPassword.Value)) FormsAuthentication.RedirectFromLoginPage FormsAuthentication.RedirectFromLoginPage __ (txtEmail.Value, (txtEmail.Value, False) False) End If End If End End Sub Sub n Reading User Credentials from Cookie l User.Identity.Name returns the value saved by CookieAuthentication.RedirectFromLoginPage *****************************illegal for non-trainer use****************************** During authentication, all requests are redirected to the login page specified in the loginurl attribute of the <cookie> tag. The login page verifies and checks the credentials of a user. How Does a Login Page Work? If the authentication mode is set to "Forms", ASP.NET looks for a cookie attached to a request for a secure page. If it does not find one, it redirects the request to a specified login page. On the login page, the user enters the required credentials. The page checks the entered credentials either through application-specific code or by calling FormsAuthentication.Authenticate. If the credentials are valid, a cookie is generated and the user is redirected to the originally requested page by calling FormsAuthentication.RedirectFromLoginPage . However, if the credentials are not valid, the user stays on the login page and is given a message that indicates that the login credentials are invalid. The RedirectFromLoginPage method takes two parameters, userName, which specifies the name of the user for forms authentication purposes, and createPersistentCookie. If the value of createPersistentCookie is True, a cookie is created on the user’s machine. Module 7: Creating a Microsoft ASP.NET Web Application 33 The following table lists all the methods of the FormsAuthentication object, which can be used in the authentication process. Method Function Authenticate Given the supplied credentials, this method attempts to validate the credentials against those contained in the configured credential store. GetAuthCookie Creates an authentication cookie for a given user name. This does not set the cookie as part of the outgoing response, so that an application can have more control over how the cookie is issued. GetRedirectUrl Returns the redirect URL for the original request that caused the redirect to the login page. RedirectFromLoginPage Redirects authenticated users back to the original URL they requested. SetAuthCookie Creates an authentication ticket for the given userName and attaches it to the cookies collection of the outgoing response. It does not perform a redirect. SignOut Given an authenticated user, calling SignOut removes the authentication ticket by doing a SetCookie with an empty value. This removes either durable or session cookies. Creating a Login Page A login page is simply an ASP.NET page with an HTML form, a Submit button, and a Click event procedure for the Submit button. The following is an example of a form on a login page: <form runat=server> Email:<input id="txtEmail" type="text" runat=server/> <BR> Password<input id="txtPassword" type="password" runat="server"/> <BR> <asp:button text="Login" OnClick="Login_Click" runat="server" /> <asp:label id="lblMsg" runat="server"/> </form> 34 Module 7: Creating a Microsoft ASP.NET Web Application In the Click event procedure of the Submit button, you validate the information entered in the form, then call FormsAuthentication.RedirectFromLoginPage if it is valid. The RedirectFromLoginPage method issues the cookie and then redirects the user to the originally requested page. The following sample code uses a custom function named Login to validate the username and password, and then calls RedirectFromLoginPage if they are valid: <script language="VB" runat=server> Sub cmdLogin_Click(Sender As Object, E As EventArgs) Dim strCustomerId As String 'Validate User Credentials strCustomerId = Login(txtEmail.Value, txtPassword.Value) If (strCustomerId <> "") Then FormsAuthentication.RedirectFromLoginPage _ (strCustomerId, False) Else lblMsg.Text = "Invalid Credentials: Please try again" End If End Sub </script> Reading Credentials from Cookie After a user has been authenticated, you can obtain the user name of the authenticated user programmatically by using the User.Identity.Name property. This is useful to build an application that uses the user’ s name as a key to save information in a database table or directory resource. Using Credentials from web.config If you do not want to write your own validation function, you can create a list of users in the web.config file and use the FormsAuthentication.Authenticate method to validate a username and password pair. The following web.config file creates two valid users for an application: <system.web> <authentication mode="Forms"> <forms loginurl="democode/Mod07/LoginDemo.aspx"> <credentials passwordFormat="Clear"> <user name="ruth" password="password"/> <user name="bob" passw ord="password"/> </credentials> </forms> </authentication> </system.web> Module 7: Creating a Microsoft ASP.NET Web Application 35 The following event procedure on the login page calls the Authenticate method to authenticate only those users from the web.config file: Sub cmdLogin_Click(S As Object, E As EventArgs) If (FormsAuthentication.Authenticate _ (txtEmail.value, txtPassword.Value)) FormsAuthentication.RedirectFromLoginPage _ (txtEmail.Value, False) Else lblMsg.Text = "Invalid Credentials: Please try again" End If End Sub 36 Module 7: Creating a Microsoft ASP.NET Web Application Demonstration: Setting Up Security in web.config *****************************illegal for non-trainer use****************************** In this demonstration, you will learn how to set up authentication in web.config and how to create an authentication cookie in a login file. å To run the demonstration 1. Copy the files <install folder>\Democode\Mod07\config.demo, LoginDemo.aspx, SecurePageDemo1.aspx, SecurePageDemo2.aspx, UsingSessionVar1.aspx, and UsingSessionVar2.aspx to the root of the 2063 virtual directory. 2. Rename the file config.demo to web.config. 3. Edit the file web.config. There is an <authentication> section that redirects all unauthenticated requests to the LoginDemo.aspx page. Two pages have been set up as secure pages. 4. Edit the file <install folder>\LoginDemo.aspx. The cmdLogin_Click event procedure validates the user name and password and calls RedirectFromLoginPage if they are valid. 5. View the unsecured page http://localhost/2063/Us ingSessionVar1.aspx page in Internet Explorer. 6. View the secure page http://localhost/2063/SecurePageDemo1.aspx page in Internet Explorer. You are redirected to the LoginDemo.aspx page. Module 7: Creating a Microsoft ASP.NET Web Application 37 7. Type an e-mail name and an invalid password (“password” is the only valid password) and click Sign In Now. It will fail because the password is invalid. 8. Type password for the password field and click Sign In Now again. You will be redirected to the SecurePageDemo1.aspx page. 9. View the secure page http://localhost/2063/SecurePageDemo2.aspx in Internet Explorer. 38 Module 7: Creating a Microsoft ASP.NET Web Application Lab 7: Creating an ASP.NET Web Application *****************************illegal for non-trainer use****************************** Objectives After completing this lab, you will be able to: n Use forms authentication to authenticate and authorize users when accessing secured pages. n Use the ASP.NET cache to save data for the _menu.aspx page. n Maintain state of an application by saving data in a database. Prerequisite Before working on this lab, you must know how to use a component. Lab Setup There are starter and solution files associated with this lab. The starter files are in the folder <install folder>\Labs\Lab07\Starter and the solution files for this lab are in the folder <install folder>\Labs\Lab07\Solution. Module 7: Creating a Microsoft ASP.NET Web Application 39 Scenario In Exercise 1, you will use the ASP.NET cache to store a DataSet that is used by the _menu.aspx page. When users want to sign into the conference system, they need to enter a valid e-mail name and corresponding password. This is done on the login.aspx page or through register.aspx in the case of a new user. In this lab, you will first complete the login.aspx and register.aspx pages to attempt to authenticate a user through the use of a cookie (forms authentication). Exercises 2 and 4 involve variations on forms authentication of this user. Exercise 3 illustrates how to retrieve the customer ID of the authenticated user from any of the pages of your application. You can use this ID to store customer information or products selected by the customer in the database. Estimated time to complete this lab: 60 minutes 40 Module 7: Creating a Microsoft ASP.NET Web Application Exercise 1 Storing Data In this exercise, you will programmatically cache the DataView used by the DataList control in the file _Menu.ascx. You will then look at web.config to see how the connection string for the Conf database is stored. å To read the DataView from the cache 1. Open the file _Menu.ascx file in the folder InetPub\wwwRoot\ASPNET. 2. At the beginning of the Page_Load event procedure, immediately after the dvMenuItems variable is declared, add code to read the contents of the dvMenuItems item from the cache and save it in the dvMenuItems variable. Your code should look like the following: dvMenuItems = Cache("dvMenuItems") 3. Test the contents of dvMenuItems. If the content is empty: a. Create the DataView from the database by using the code that is already in the event procedure. b. Store the DataView in the cache. Create the cache such that it will be stored for one hour. Your code should look like the following: If (dvMenuItems Is Nothing) Then Response.Write ("Getting items from the database.<P>") Dim products As New Conference.ProductsDB dvMenuItems = products.GetProductCategories(). _ Tables(0).DefaultView Cache.Insert("dvMenuItems", dvMenuItems, Nothing, _ DateTime.Now.AddHours(1), TimeSpan.Zero) Else Response.Write ("Got items from the cache.<P>") End If å To save and test your work 1. Save your changes to _Menu.ascx. 2. By using Internet Explorer, go to the home page of the ASPNET Web site by viewing http://localhost/ASPNET/default.aspx The items are retrieved from the database. 3. Refresh the page in Internet Explorer. The items are retrieved from the cache. Module 7: Creating a Microsoft ASP.NET Web Application 41 å To investigate web.config application settings As you can see in the _Menu.ascx file, the GetProductCategories() method is used to get the items for the menu from the database. This method is in the ProductsDB.vb component. 1. Open the ProductsDB.vb file from the Components folder and locate the GetProductCategories method. The SQL connection string is obtained from ConferenceDB.ConnectionString. 2. Open the ConferenceDB.vb file from the Components folder and locate the ConnectionString property. The connection string is read from the DSN key in the <appSettings> section of the web.config file. 3. Open the web.config file in the ASPNET Web site and locate the DSN key in the <appSettings> section. 42 Module 7: Creating a Microsoft ASP.NET Web Application Exercise 2 Using Forms Authentication In this exercise, you will validate the user’s name and password from the login.aspx page with information stored in the database. If the information is valid, you will transfer the contents of the temporary shopping cart into a permanent shopping cart for the user. Next, you will create an authentication cookie that will be used throughout the Web site. You will use two different classes in the conference component: Conference.ShoppingCartDB manipulates the shopping cart and Conference.CustomersDB accesses the customer information in the Conf database. Note The source code for these classes can be found in the \Components\ShoppingCartDB.vb and \Components\CustomerDB.vb files in the ASPNET Web site. You will call the following methods: n Conference.ShoppingCartDB.GetShoppingCartID() returns a string with the ID of the current shopping cart. Public Function GetShoppingCartId() As String n Conference.ShoppingCartDB.MigrateCart() migrates the items from one shopping cart (temporary) to another (permanent). The permanent shopping cart uses the customer's ID as the shopping cart ID. Public Sub Procedure MigrateCart(oldCartId As String, NewCartId As String) n Conference.CustomersDB.Login() validates an e-mail name and password pair against credentials stored in the customers table of the database. If the e-mail name and password pair is valid, the method returns the customer ID. In the case of an invalid e-mail name and password pair, this method returns an empty string. Public Function Login(email As String, password As String) As String Module 7: Creating a Microsoft ASP.NET Web Application 43 å To connect to a data source 1. Open the file Login.aspx in the folder InetPub\wwwRoot\ASPNET. 2. In the cmdLogin_Click event procedure, declare the variables as shown in the following table. Variable name Data Type shoppingCart New Conference.ShoppingCartDB strTempCartID String accountSystem New Conference.CustomersDB strCustomerID String 3. Call the Login method of the accountSystem object and store the returned customer ID in the variable strCustomerID. Pass the e-mail name and password to the Login method: Your code should look like the following: strCustomerId = _ accountSystem.Login(txtEmail.Value, txtPassword.Value) 4. If the returned CustomerID is empty, this indicates that the user is not authorized to log on. Output a "login failed" message in the spnInfo label. 5. If the returned CustomerID is not empty, the user is authorized to log on and you need to migrate the contents of the temporary shopping cart to a permanent one by performing the following operations: a. Get the shopping cart ID by using the GetShoppingCartId method of the shoppingCart object and store it in the strTempCartID variable. b. Migrate any existing temporary shopping cart items to the permanent shopping cart by using the MigrateCart method of the shoppingCart object. Pass the temporary shopping cart ID and the customer ID to the method. c. Create a non-persistent cookie and direct the user back to the Login page by calling the RedirectFromLoginPage method of the FormsAuthentication object. Your code should look like the following: If (strCustomerId <> "") Then ' Get the old Shopping Cart ID strTempCartID = shoppingCart.GetShoppingCartId() ' Migrate existing shopping cart into 'permanent shopping cart shoppingCart.MigrateCart(strTempCartID, strCustomerId) ' Redirect browser back to originating page FormsAuthentication.RedirectFromLoginPage( _ strCustomerId, false) Else ' Login failed spnInfo.innerHTML = "Login Failed" End If 44 Module 7: Creating a Microsoft ASP.NET Web Application å To save and test your work 1. Save your changes to login.aspx. 2. By using Internet Explorer, go to the Login page of the ASPNET Web site by viewing http://localhost/ASPNET/Login.aspx 3. Fill out the e-mail field with [email protected] with a blank password and click Sign In Now. You will get the Login Failed message. 4. Fill in the password field with the value password and click Sign In Now. You will be redirected to the default page of the ASPNET Web site, default.aspx. Note The e-mail name and password pair [email protected]/password is already in the database. Module 7: Creating a Microsoft ASP.NET Web Application 45 Exercise 3 Retrieving Cookie Data in ASP.NET Pages In this exercise, you will add code to the GetID.aspx page that reads the customer ID (also known as Cart ID) from the authentication cookie. If the customer has not been authenticated, you will use a temporary ID. The GetID.aspx page is not directly linked to the ASPNET Web site. Instead, it simply reads the customer ID or temporary ID and displays it. å To read the customer ID 1. Add the GetID.aspx page to the ASPNET Web site. a. On the Project menu, click Add Existing Item. b. In the Add Existing Item dialog box, navigate to the <install folder>\Labs\Lab07\Starter folder. c. Select the GetID.aspx file, and then click Open. Note You will be asked if you want to create a new class file. Click No. 2. Open the GetID.aspx file. 3. Locate the comment: ' TO DO: Read the customer ID 4. Test the value of User.Identity.Name. 5. If the string is not empty (""), output the value of User.Identity.Name using Response.write. 46 Module 7: Creating a Microsoft ASP.NET Web Application 6. If the string is empty, the user has not previously been authenticated. a. Read the value of the Conference_CartID cookie. This cookie is issued the first time a non-authentic ated user accesses the shopping cart. b. If the cookie is not empty, output the value of the Conference_CartID cookie. c. If the cookie is empty, output a message that says that the customer is not authenticated, and has not yet accessed the shopping cart. Your code should look like the following: If User.Identity.Name <> "" Then Response.write("Customer ID from authentication " & _ "cookie:<br>") Response.write(User.Identity.Name) Else If Request.Cookies("Conference_CartID") Is Nothing Then Response.write("Customer not authenticated " & _ "and has not accessed the shopping cart yet") Else Response.write("Temporary Customer ID stored " & _ "in a cookie:<br>") Response.write( _ Request.Cookies("Conference_CartID").Value) End If End If å To save and test your work 1. Save your changes to GetID.aspx. 2. Start a new instance of Internet Explorer and go to the GetID.aspx page by viewing http://localhost/ASPNET/GetID.aspx You should be able to see the message stating that the customer is not authenticated and has not yet accessed the shopping cart. 3. Click Go to Home Page . 4. Select an item and add it to the shopping cart. 5. Go back to the GetID.aspx page and click Refresh. You should see the message that a temporary customer ID is stored in a cookie, as well as the value of the temporary ID. 6. Click Go to Login Page. 7. Enter a valid e-mail name and password, and then click Sign In Now. For this lab, use [email protected] for the user name and password for the password. 8. Go back to the GetID.aspx page, and click Refresh. You should see the message that the customer ID is from an authentication cookie and the value of the Customer ID. Module 7: Creating a Microsoft ASP.NET Web Application 47 å To view the GetShoppingCartId method 1. Open the ShoppingCartDB.vb file in the Components folder of the ASPNET Web site. 2. Locate the GetShoppingCartID method. This method returns an ID to be used for adding items to a shopping cart in the database. The method returns the value of the authenticated user, the value stored in the Conference_CartID cookie, or a new temporary ID created by calling Guid.NewGuid. 48 Module 7: Creating a Microsoft ASP.NET Web Application Exercise 4 Using Forms Authentication in Register.aspx In this exercise, you will add a new customer to the database. Next, you will create an authentication cookie for the new customer. Afterward, you will transfer the content of the temporary shopping cart into the new customer’s permanent shopping cart and redirect to the shopping cart page (ShoppingCart.aspx). As you did in the previous exercise, you will call two different components: the first, named Conference.ShoppingCartDB, is used to manipulate the shopping cart; the second, Conference.CustomersDB is used to access to the customer information. You will need to call the Conference.CustomersDB.AddCustomer() method, which inserts a new customer record into the customers database. This method returns a unique Customer ID. Public Function AddCustomer(fullName As String, email As String, password As String) As String å To connect to a data source 1. Open the file Register.aspx in the folder InetPub\wwwRoot\ASPNET. 2. Delete the following ins truction from the cmdValidation_Click event procedure: Response.Redirect("validOK.aspx") 3. In the cmdValidation_Click event procedure, declare the following variables: Variable Name Data Type shoppingCart New Conference.ShoppingCartDB strTempCartID String accountSystem New Conference.CustomersDB strCustomerID String 4. Call the GetShoppingCartId method of the shoppingCart object to read the current shopping cart ID. Save the value in the strTempCartID variable. 5. Create a new customer in the Customers table of the database by calling the AddCustomer method of the accountSystem object. Save the created customer ID in the strCustomerID variable. Your code should look like the following: strCustomerId = _ accountSystem.AddCustomer(txtFullName.Text, _ txtEmail.Text, txtPassword.Text) Note Use the Text property of these controls because they are Web controls. Module 7: Creating a Microsoft ASP.NET Web Application 49 6. If the returned CustomerID is not empty, the user was added to the database and you need to migrate the items in the temporary shopping cart to the permanent shopping cart: a. Authenticate a non-persistent cookie by passing the strCustomerID parameter to the SetAuthCookie method. b. Get the shopping cart ID by using the GetShoppingCartId method of the shoppingCart object and store it in the strTempCartID variable. c. Migrate any existing shopping cart items to the permanent shopping cart by using the MigrateCart method of the shoppingCart object. Pass the temporary cart ID and the customer ID to the MigrateCart method. d. Redirect the user to the shoppingCart.aspx page he or she came from by calling the Navigate method of the Page object. Your code should look like the following: If (strCustomerId <> "") Then ' Set the user's authentication name to the customerId FormsAuthentication.SetAuthCookie(strCustomerId, False) ' Migrate any existing shopping cart items into ' the permanent shopping cart shoppingCart.MigrateCart(strTempCartID, strCustomerId) ' Redirect browser back to shopping cart page Response.Redirect("ShoppingCart.aspx") End If å To save and test your work 1. Save your changes to Register.aspx. 2. Using Internet Explorer, go to the register page of the ASPNET Web site by viewing http://localhost/ASPNET/register.aspx 3. Create a new user with your full name, your e-mail address, and a password, and then click Submit. 4. To verify whether this new user was successfully registered, open the Login page by viewing http://localhost/ASPNET/login.aspx. Enter the e-mail address and password of the new user you just registered, and then click Sign In Now! You should receive validation and be redirected to the home page of the ASPNET Web site, default.aspx. 50 Module 7: Creating a Microsoft ASP.NET Web Application Review n Requirements of a Web Application n What Is New in ASP.NET? n Sharing Information Between Pages n Securing an ASP.NET Application *****************************illegal for non-trainer use****************************** 1. How do you set up a Web application to use cookie-less sessions? 2. Where is global.asax file of an application located? 3. Where is the web.config file for an application located? 4. In web.config, all configuration information must reside under what tags? Module 7: Creating a Microsoft ASP.NET Web Application 5. How do you specify which authentication method will be used by an ASP.NET application? 6. What is the difference between output cache and ASP.NET cache? 7. How can you secure an entire application? 51 THIS PAGE INTENTIONALLY LEFT BLANK
© Copyright 2024