Asp.net 简明教程
ASP.NET - Introduction
What is ASP.NET?
ASP.NET 是一个网络开发平台,它提供了一个编程模型、一个综合的软件基础设施和各种服务,通过这些服务可以为 PC 和移动设备构建出强劲的网络应用程序。
ASP.NET 建立在 HTTP 协议之上,并使用 HTTP 命令和策略来设置一个浏览器到服务器的双边通信和协作。
ASP.NET 属于 Microsoft .Net 平台。ASP.NET 应用程序是经过编译的代码,使用 .Net 框架中的可扩展和可重用组件或对象编写。这些代码可以使用 .Net 框架中的整个类层次。
ASP.NET 应用程序代码可以使用以下任何一种语言编写:
-
C#
-
Visual Basic.Net
-
Jscript
-
J#
ASP.NET 用于在互联网上产出交互式的、数据驱动的网络应用程序。它包含大量的控件,例如文本框、按钮和标签,用于组装、配置和操控代码以创建 HTML 页面。
ASP.NET Web Forms Model
ASP.NET 网页表单将事件驱动的、用于交互的模型扩展到了网络应用程序。浏览器向网络服务器提交一个网络表单,作为响应,服务器返回一个完整的标记页面或 HTML 页面。
所有客户端用户活动都会被转发到服务器进行状态化处理。服务器处理客户端动作的输出,然后触发反应。
现在,HTTP 是一种无状态协议。ASP.NET 框架有助于存储有关应用程序状态的信息,其中包括:
-
Page state
-
Session state
页面状态是客户端状态,即 Web 表单中各种输入字段的内容。会话状态是从用户访问和使用过的各个页面获得的信息集合,即整体会话状态。为了澄清概念,我们以购物车为例。
用户向购物车添加商品。从某个页面(例如商品页面)选择商品,并将在不同页面(例如购物车页面)上显示收集到的商品总数和价格。只有 HTTP 无法跟踪来自各个页面的所有信息。ASP.NET 会话状态和服务器端基础架构跟踪会话中全局收集的信息。
在生成 ASP.NET 运行时代码时,ASP.NET 运行时将页面状态从服务器跨页面请求携带到服务器,并将在隐藏字段中合并服务器端组件的状态。
通过这种方式,服务器了解整体应用程序状态并以双层连接方式运行。
The ASP.NET Component Model
ASP.NET 组件模型提供 ASP.NET 页面的各种构建块。本质上它是一个对象模型,描述:
-
几乎所有 HTML 元素或标签(例如 <form> 和 <input>)的服务器端对应项。
-
服务器控件,它有助于开发复杂的用户界面。例如,日历控件或网格视图控件。
ASP.NET 是一项技术,可在 .Net 框架上运行,其中包含所有与 Web 相关的功能。.Net 框架由面向对象层次结构组成。ASP.NET 网页应用程序由页面组成。当用户请求 ASP.NET 页面时,IIS 将页面的处理委托给 ASP.NET 运行时系统。
ASP.NET 运行时将 .aspx 页面转换为一个类实例,该类从 .Net 框架的基本类页面继承。因此,每个 ASP.NET 页面都是一个对象,其所有组件(即服务器端控件)也是对象。
Components of .Net Framework 3.5
在进入 Visual Studio.Net 的下一部分之前,让我们先了解 .Net 框架 3.5 的各个组件。下表描述了 .Net 框架 3.5 的组件及其执行的工作:
Components and their Description |
(1) Common Language Runtime or CLR 它执行内存管理、异常处理、调试、安全检查、线程执行、代码执行、代码安全、验证和编译。CLR 直接管理的代码称为托管代码。当托管代码被编译时,编译器将源代码转换为 CPU 无关的中间语言 (IL) 代码。即时 (JIT) 编译器将 IL 代码编译为本机代码,这是 CPU 特定的。 |
(2) .Net Framework Class Library 它包含一个可重复使用类型、类、接口、结构和枚举值的巨大库,统称为类型。 |
(3) Common Language Specification 它包含 .Net 支持的语言规范和语言集成的实现。 |
(4) Common Type System 它为在运行时声明、使用和管理类型以及跨语言通信提供指南。 |
(5) Metadata and Assemblies 元数据是描述程序的二进制信息,它存储在可移植可执行文件 (PE) 中或存储在内存中。程序集是一个逻辑单元,它包含程序集清单、类型元数据、IL 代码和一组资源(如图像文件)。 |
(6) Windows Forms Windows Forms 包含应用程序中显示的任何窗口的图形表示。 |
(7) ASP.NET and ASP.NET AJAX ASP.NET 是 Web 开发模型,而 AJAX 是 ASP.NET 的扩展,用于开发和实现 AJAX 功能。ASP.NET AJAX 包含允许开发人员在不完全重新加载页面的情况下更新网站上数据的组件。 |
(8) ADO.NET 这是用于处理数据和数据库的技术。它提供对数据源的访问,例如 SQL Server、OLE DB、XML 等。ADO.NET 允许连接到数据源以检索、处理和更新数据。 |
(9) Windows Workflow Foundation (WF) 它有助于在 Windows 中构建基于工作流的应用程序。它包含活动、工作流运行时、工作流设计器和规则引擎。 |
(10)Windows Presentation Foundation 它提供了用户界面和业务逻辑之间的分离。它有助于使用文档、媒体、2D 和 3D 图形、动画等等来开发视觉上惊艳的界面。 |
(11) Windows Communication Foundation (WCF) 这是用于构建和执行连接系统的技术。 |
(12) Windows CardSpace 它提供安全措施,以供在互联网上访问资源和共享个人信息。 |
(13) LINQ 它使用类似于传统查询语言 SQL 的语法,为 .Net 语言赋予了数据查询功能。 |
ASP.NET - Environment Setup
ASP.NET 在 HTTP 上提供一个抽象层,网络应用程序即构建于其上。它在面向对象的范例中提供类和构件等高级实体。
构建 ASP.NET 应用程序和前端的关键开发工具是 Visual Studio。在本教程中,我们将使用 Visual Studio 2008。
Visual Studio 是用于编写、编译和调试代码的集成开发环境。它提供了一整套开发工具,用于构建 ASP.NET Web 应用程序、Web 服务、桌面应用程序和移动应用程序。
The Visual Studio IDE
新项目窗口从可用模板中选择一个应用程序模板。
当您启动一个新网站时,ASP.NET 将提供站点所需的启动文件夹和文件,包括站点的第一个网络表单的两个文件。
名为 Default.aspx 的文件包含定义表单的 HTML 和 asp 代码,名为 Default.aspx.cs(用于 C# 编码)或名为 Default.aspx.vb(用于 VB 编码)的文件包含您选择的语言代码,此代码负责执行表单上的操作。
Visual Studio IDE 中的主要窗口是 Web 窗体设计器窗口。其他支持窗口有工具箱、解决方案资源管理器和属性窗口。您可以使用设计器设计一个 Web 表单,向表单上的控件添加代码以使表单根据您的需要工作,您可以使用代码编辑器。
Working with Views and Windows
您可以使用以下方式处理窗口:
-
若要将 Web 窗体设计器从一个视图切换到另一个视图,请单击“设计”或“源”按钮。
-
要关闭窗口,请单击右上角的关闭按钮,要重新显示,请从“视图”菜单中选择。
-
要隐藏窗口,请单击其自动隐藏按钮。然后窗口会变为一个选项卡。要再次显示,请再次单击自动隐藏按钮。
-
要更改窗口的大小,只需拖动它即可。
Adding Folders and Files to your Website
创建新的 Web 窗体时,Visual Studio 会自动为窗体生成 HTML 起始代码,并在 Web 窗体设计器的源视图中显示它。使用解决方案资源管理器添加网站上的任何其他文件、文件夹或现有项目。
-
要添加一个标准文件夹,请右键单击解决方案资源管理器中用于添加该文件夹的项目或文件夹,然后选择“新建文件夹”。
-
要添加一个 ASP.NET 文件夹,请右键单击解决方案资源管理器中的项目,然后从列表中选择该文件夹。
-
要向网站添加现有项目,请右键单击解决方案资源管理器中用于添加该项目的项目或文件夹,然后从对话框中选择。
Projects and Solutions
一个典型的 ASP.NET 应用程序包含许多项:Web 内容文件 (.aspx)、源文件 (.cs 文件)、程序集 (.dll 和 .exe 文件)、数据源文件 (.mdb 文件)、引用、图标、用户控件和各种其他文件和文件夹。构成网站的所有这些文件都包含在一个解决方案中。
创建新的网站时,VB2008 会自动创建解决方案并将其显示在解决方案资源管理器中。
解决方案可以包含一个或多个项目。项目包含内容文件、源文件以及诸如数据源和图像文件之类的其他文件。通常情况下,会将项目的内容编译成程序集,这种程序集可能是可执行文件 (.exe) 或是动态链接库 (.dll) 文件。
一个项目通常包含以下内容文件:
-
Page file (.aspx)
-
User control (.ascx)
-
Web service (.asmx)
-
Master page (.master)
-
Site map (.sitemap)
-
Website configuration file (.config)
ASP.NET - Life Cycle
ASP.NET 生命周期指定了如何:
-
ASP.NET 处理页面以生成动态输出
-
实例化并处理应用程序及其页面
-
ASP.NET 动态编译页面
ASP.NET 生命周期可分为两组:
-
Application Life Cycle
-
Page Life Cycle
ASP.NET Application Life Cycle
应用程序生命周期包括以下阶段:
-
用户发出访问应用程序资源(即页面)的请求。浏览器会将此请求发送至 Web 服务器。
-
统一管道接收到第一个请求,并且发生以下事件:创建类 ApplicationManager 的对象。创建一个 HostingEnvironment 类的对象,以提供有关资源的信息。编译应用程序中的顶级项。
-
创建响应对象。创建应用程序对象,例如 HttpContext、HttpRequest 和 HttpResponse,并对其进行初始化。
-
创建 HttpApplication 对象的实例并将其分配给请求。
-
HttpApplication 类处理请求。此类触发不同的事件以处理请求。
ASP.NET Page Life Cycle
当请求页面时,将会将其加载到服务器内存中,处理并发送至浏览器。然后,将其从内存中卸载。在每一步中,都可以使用可根据应用程序的需要进行覆盖的方法和事件。换句话说,可以编写自己的代码来覆盖默认代码。
Page 类创建页面上所有控件的分层树。页面上的所有组件(指令除外)都是此控件树的一部分。可以通过向页面指令中添加 trace= "true" 来查看控件树。我们将在“指令”和“事件处理”下介绍页面指令和跟踪。
页面的生命周期阶段包括:
-
Initialization
-
页面上控件的实例化
-
状态的恢复和维护
-
事件处理程序代码执行
-
Page rendering
理解页面周期有助于编写代码,以便在页面生命周期的任何阶段发生特定事务。它还有助于编写定制控件并在正确的时间初始化它们,使用视图状态数据填充其属性,并运行控件行为代码。
以下是 ASP.NET 页面的不同阶段:
-
Page request - 当 ASP.NET 收到页面请求时,它会决定是解析和编译页面还是使用页面的缓存版本,并据此发送响应。
-
Starting of page life cycle - 在此阶段,会设置请求和响应对象。如果请求是旧请求或回发,则会将页面的 IsPostBack 属性设置为真。还会设置页面的 UICulture 属性。
-
Page initialization - 在此阶段,通过设置 UniqueID 属性,为页面上的控件分配唯一 ID,并应用主题。对于新请求,将加载回发数据,并将控件属性还原为视图状态值。
-
Page load - 在此阶段,使用视图状态和控件状态值设置控件属性。
-
Validation - 将调用验证控件的 Validate 方法,在方法成功执行后,将页面的 IsValid 属性设置为真。
-
Postback event handling - 如果请求是回发(旧请求),则会调用相关的事件处理程序。
-
Page rendering - 在此阶段,将保存页面和所有控件的视图状态。页面将为每个控件调用 Render 方法,并且渲染输出将写入页面响应属性的 OutputStream 类。
-
Unload - 将渲染后的页面发给客户端,并且会卸载页面属性(如响应和请求),并完成所有清理。
ASP.NET Page Life Cycle Events
在页面生命周期的每个阶段,页面都会触发某些可编码的事件。事件处理程序基本上是绑定到事件的函数或子例程,使用声明式属性(如 Onclick 或 handle)进行绑定。
以下是页面生命周期事件:
-
PreInit - PreInit 是页面生命周期中的第一个事件。它将检查 IsPostBack 属性,并确定该页面是否是回发。它将设置主题和母版页,创建动态控件,并获取和设置配置文件属性值。可以通过重载 OnPreInit 方法或创建 Page_PreInit 处理程序来处理此事件。
-
Init - Init 事件将初始化控件属性,并构建控件树。可以通过重载 OnInit 方法或创建 Page_Init 处理程序来处理此事件。
-
InitComplete - InitComplete 事件允许跟踪视图状态。所有控件都会开启视图状态跟踪。
-
LoadViewState - LoadViewState 事件允许将视图状态信息加载到控件中。
-
LoadPostData - 在此阶段,将使用 <form> 标记定义所有输入字段的内容进行处理。
-
PreLoad - PreLoad 会在回发数据加载到控件中之前发生。可以通过重载 OnPreLoad 方法或创建 Page_PreLoad 处理程序来处理此事件。
-
Load - 首先,Load 事件会被触发,然后递归触发所有子控件的该事件。控件树中的控件会创建。这个事件可以通过重载 OnLoad 方法或创建 Page_Load 处理器来处理。
-
LoadComplete - 加载过程将完成,控件事件处理程序将运行,页面验证也将进行。这个事件可以通过重载 OnLoadComplete 方法或创建 Page_LoadComplete 处理器来处理。
-
PreRender - 在输出渲染之前,将发生 PreRender 事件。通过处理这个事件,页面和控件可以在输出渲染之前执行任何更新。
-
PreRenderComplete - 由于 PreRender 事件会递归触发所有子控件,这个事件将确保预渲染阶段完成。
-
SaveStateComplete - 页面上的控件状态将保存下来。个性化设置、控件状态和视图状态信息将保存。HTML 标记将生成出来。可以通过重写 Render 方法或创建 Page_Render 处理器来处理这个阶段。
-
UnLoad - UnLoad 阶段是页面生命周期的最后一个阶段。它会递归触发所有控件的 UnLoad 事件,最后触发页面的该事件。将进行最后的清理,所有资源和引用(例如数据库连接)将释放。这个事件可以通过修改 OnUnLoad 方法或创建 Page_UnLoad 处理器来处理。
ASP.NET - First Example
一个 ASP.NET 页面由许多服务器控件以及 HTML 控件、文本和图像组合而成。页面中的敏感数据和页面上不同控件的状态存储在隐藏字段中,这些字段构成了该页面请求的上下文。
ASP.NET 运行时控制页面实例及其状态之间的关联。一个 ASP.NET 页面是 Page 的对象或从它继承而来。
页面上的所有控件也是相关控件类的对象,继承自父控件类。当运行页面时,会创建一个对象的页面实例及其所有的内容控件。
ASP.NET 页面也是一个使用 .aspx 扩展名保存的服务器端文件。它本质上是模块化,可以分为以下核心部分:
-
Page Directives
-
Code Section
-
Page Layout
Page Directives
页面指令设置了页面运行的环境。@Page 指令定义了 ASP.NET 页面解析器和编译器使用的特定于页面的属性。页面指令指定页面应该如何被处理,以及需要对页面做出哪些假设。
它允许导入命名空间、加载程序集并使用自定义标记名称和命名空间前缀注册新控件。
Code Section
代码部分提供页面和控件事件的处理程序以及其他所需的功能。我们提到了,ASP.NET 遵循对象模型。现在,当在用户界面上发生某些事件,比如用户单击按钮或移动光标时,这些对象会触发事件。这些事件需要响应的响应类型编写在事件处理程序函数中。事件处理程序就是绑定到控件的函数。
代码部分或代码隐藏文件提供所有这些事件处理程序例程,以及开发人员使用的其他函数。页面代码可以预编译并以二进制程序集的形式部署。
Page Layout
页面布局提供页面的界面。它包含服务器控件、文本、内联 JavaScript 和 HTML 标记。
以下代码片段提供了一个示例 ASP.NET 页面,解释了用 C# 编写的页面指令、代码部分和页面布局:
<!-- directives -->
<% @Page Language="C#" %>
<!-- code section -->
<script runat="server">
private void convertoupper(object sender, EventArgs e)
{
string str = mytext.Value;
changed_text.InnerHtml = str.ToUpper();
}
</script>
<!-- Layout -->
<html>
<head> <title> Change to Upper Case </title>
</head>
<body>
<h3> Conversion to Upper Case </h3>
<form runat="server">
<input runat="server" id="mytext" type="text" />
<input runat="server" id="button1" type="submit"
value="Enter..." OnServerClick="convertoupper"/>
<hr />
<h3> Results: </h3>
<span runat="server" id="changed_text" />
</form>
</body>
</html>
将此文件复制到 Web 服务器根目录。通常为 c:\iNETput\wwwroot。从浏览器中打开文件以执行它,它会生成以下结果:
Using Visual Studio IDE
让我们使用 Visual Studio IDE 开发同一示例。您可以将控件拖到设计视图中,而不是键入代码:
内容文件会自动开发。您需要添加的就是 Button1_Click 例程,如下所示:
protected void Button1_Click(object sender, EventArgs e)
{
string buf = TextBox1.Text;
changed_text.InnerHtml = buf.ToUpper();
}
给出的内容文件代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="firstexample._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>
Untitled Page
</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server" style="width:224px">
</asp:TextBox>
<br />
<br />
<asp:Button ID="Button1" runat="server" Text="Enter..."
style="width:85px" onclick="Button1_Click" />
<hr />
<h3> Results: </h3>
<span runat="server" id="changed_text" />
</div>
</form>
</body>
</html>
右键单击设计视图并从弹出菜单中选择“在浏览器中查看”来执行示例。这会生成以下结果:
ASP.NET - Event Handling
What is an Event?
事件是可以操作或发生的事件,比如鼠标点击、按键、鼠标移动或任何系统生成的通知。进程是通过事件来通信的。例如,中断是由系统生成的事件。当事件发生时,应用程序应该能够响应并管理它。
在 ASP.NET 中,事件在客户端计算机中引发,而在服务器计算机中处理。例如,用户点击了在浏览器中显示的一个按钮。这样会引发 Click 事件。浏览器会通过将其发布到服务器来处理这个客户端事件。
服务器有一个子例程,用来描述在引发事件后应该做什么;它被称为事件处理程序。因此,当事件消息传输到服务器时,它会检查 Click 事件是否具有关联的事件处理程序。如果有,则会执行事件处理程序。
Event Arguments
ASP.NET 事件处理程序通常采用两个参数,并返回 void。第一个参数表示引发事件的对象,第二个参数是事件参数。
一个事件的一般语法是:
private void EventName (object sender, EventArgs e);
Application and Session Events
最重要的应用程序事件是:
-
Application_Start - 当应用程序/网站启动时引发。
-
Application_End - 当应用程序/网站停止时引发。
类似地,最常用的会话事件如下:
-
Session_Start - 当用户首次从应用程序请求页面时引发。
-
Session_End - 当会话结束时引发。
Page and Control Events
常见的页面和控件事件如下:
-
DataBinding - 当控件绑定到数据源时引发。
-
Disposed - 当页面或控件释放时引发。
-
Error - 这是一个页面事件,在引发未处理异常时发生。
-
Init - 当页面或控件初始化时引发。
-
Load - 当页面或控件加载时引发。
-
PreRender - 当页面或控件即将呈现时引发。
-
Unload - 当页面或控件从内存中卸载时引发。
Event Handling Using Controls
所有 ASP.NET 控件均作为类实现,并且当用户对控件执行某些操作时,会触发控件的事件。例如,当用户单击按钮时,将生成“单击”事件。为处理事件,提供了内置的属性和事件处理程序。事件处理程序经过编码以响应事件,并对其采取适当的操作。
默认情况下,Visual Studio 通过在 Sub 过程中包含 Handles 子句来创建事件处理程序。此子句命名该过程处理的控件和事件。
按钮控件的 ASP 标记:
<asp:Button ID="btnCancel" runat="server" Text="Cancel" />
单击事件的事件处理程序:
Protected Sub btnCancel_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Handles btnCancel.Click
End Sub
也可以在不带 Handles 子句的情况下对事件进行编码。然后,该处理程序必须根据控件的适当事件属性来命名。
按钮控件的 ASP 标记:
<asp:Button ID="btnCancel" runat="server" Text="Cancel"
Onclick="btnCancel_Click" />
单击事件的事件处理程序:
Protected Sub btnCancel_Click(ByVal sender As Object, ByVal e As System.EventArgs)
End Sub
常见的控件事件有:
Event |
Attribute |
Controls |
Click |
OnClick |
按钮、图像按钮、链接按钮、图像映射 |
Command |
OnCommand |
按钮、图像按钮、链接按钮 |
TextChanged |
OnTextChanged |
Text box |
SelectedIndexChanged |
OnSelectedIndexChanged |
下拉列表、列表框、单选按钮列表、复选按钮列表。 |
CheckedChanged |
OnCheckedChanged |
Check box, radio button |
某些事件会立即导致表单传回服务器,这些事件称为回传事件。例如,单击事件,例如 Button.Click。
有些事件不会立即传回服务器,这些事件称为非回传事件。
例如,更改事件或选择事件,例如 TextBox.TextChanged 或 CheckBox.CheckedChanged。非回传事件可以通过将它们的 AutoPostBack 属性设置为 true 来立即回传。
Default Events
Page 对象的默认事件是 Load 事件。同样,每个控件都有一个默认事件。例如,按钮控件的默认事件是 Click 事件。
可以在 Visual Studio 中创建默认事件处理程序,只需在设计视图中双击该控件。下表显示了常用控件的一些默认事件:
Control |
Default Event |
AdRotator |
AdCreated |
BulletedList |
Click |
Button |
Click |
Calender |
SelectionChanged |
CheckBox |
CheckedChanged |
CheckBoxList |
SelectedIndexChanged |
DataGrid |
SelectedIndexChanged |
DataList |
SelectedIndexChanged |
DropDownList |
SelectedIndexChanged |
HyperLink |
Click |
ImageButton |
Click |
ImageMap |
Click |
LinkButton |
Click |
ListBox |
SelectedIndexChanged |
Menu |
MenuItemClick |
RadioButton |
CheckedChanged |
RadioButtonList |
SelectedIndexChanged |
Example
本示例包含一个包含标签控件和按钮控件的简单页面。由于页面事件,例如 Page_Load、Page_Init、Page_PreRender 等的发生,它会发送一条由标签控件显示的消息。单击按钮时,会引发 Button_Click 事件,并且该事件也会发送一条要显示在标签上的消息。
创建一个新网站,然后从控件工具箱中将一个标签控件和一个按钮控件拖到该网站上。使用属性窗口将控件的 ID 分别设置为 .lblmessage. 和 .btnclick. 分别。将按钮控件的 Text 属性设置为“Click”。
标记文件 (.aspx):
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="eventdemo._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="lblmessage" runat="server" >
</asp:Label>
<br />
<br />
<br />
<asp:Button ID="btnclick" runat="server" Text="Click"
onclick="btnclick_Click" />
</div>
</form>
</body>
</html>
双击设计视图以转到代码隐藏文件。Page_Load 事件将自动创建,其中不包含任何代码。写下以下自解释的代码行:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
namespace eventdemo
{
public partial class _Default : System.Web.UI.Page{
protected void Page_Load(object sender, EventArgs e)
{
lblmessage.Text += "Page load event handled. <br />";
if (Page.IsPostBack)
{
lblmessage.Text += "Page post back event handled.<br/>";
}
}
protected void Page_Init(object sender, EventArgs e){
lblmessage.Text += "Page initialization event handled.<br/>";
}
protected void Page_PreRender(object sender, EventArgs e)
{
lblmessage.Text += "Page prerender event handled. <br/>";
}
protected void btnclick_Click(object sender, EventArgs e)
{
lblmessage.Text += "Button click event handled. <br/>";
}
}
}
执行此页面。标签显示页面加载、页面初始化和页面预渲染事件。单击按钮以查看效果:
ASP.NET - Server Side
我们已经研究了页面生命周期,以及如何将控件包含在页面中。页面本身被实例化作为一个控件对象。所有 Web 表单基本上都是 ASP.NET 页面类的实例。页面类具有以下极其有用的属性,它们对应于固有对象:
-
Session
-
Application
-
Cache
-
Request
-
Response
-
Server
-
User
-
Trace
我们将在适当的时候讨论这些对象。在本教程中,我们将探讨 Server 对象、Request 对象和 Response 对象。
Server Object
Asp.NET 中的 Server 对象是 System.Web.HttpServerUtility 类的实例。HttpServerUtility 类提供了大量属性和方法来执行各种作业。
Properties and Methods of the Server object
该 Server 对象通过 ASP.NET 提供的固有 HttpServerUtility 类来公开其方法和属性。
下表提供了属性列表:
Property |
Description |
MachineName |
Name of server computer |
ScriptTimeOut |
获取并设置请求超时值,单位为秒。 |
下表提供了一些重要方法的列表:
Method |
Description |
CreateObject(String) |
创建由其 ProgID(编程 ID)标识的 COM 对象的实例。 |
CreateObject(Type) |
创建由其类型标识的 COM 对象的实例。 |
Equals(Object) |
确定指定的对象是否等于当前对象。 |
Execute(String) |
在当前请求的上下文中执行指定虚拟路径的处理程序。 |
Execute(String, Boolean) |
在当前请求的上下文中执行指定虚拟路径的处理程序,并指定是清除 QueryString 和 Form 集合。 |
GetLastError |
Returns the previous exception. |
GetType |
获取当前实例的类型。 |
HtmlEncode |
将普通字符串更改为具有合法 HTML 字符的字符串。 |
HtmlDecode |
将 Html 字符串转换为普通字符串。 |
ToString |
返回表示当前对象的字符串。 |
Transfer(String) |
对于当前请求,终止当前页面的执行,并使用页面的指定 URL 路径启动新页面的执行。 |
UrlDecode |
将 URL 字符串转换为普通字符串。 |
UrlEncodeToken |
与 UrlEncode 相同,但在包含 Base64 编码数据的字节数组上使用。 |
UrlDecodeToken |
与 UrlDecode 相同,但在包含 Base64 编码数据的字节数组上使用。 |
MapPath |
返回与服务器上指定虚拟文件路径相对应的物理路径。 |
Transfer |
将执行传输到当前应用程序中的另一个网页。 |
Request Object
请求对象是 System.Web.HttpRequest 类的一个实例。它表示让页面加载到浏览器中所生成的 HTTP 请求的值和属性。
此对象所展示的信息被更高级别的抽象(Web 控件模型)所封装。然而,此对象有助于检查某些信息,例如客户端浏览器和 cookie。
Properties and Methods of the Request Object
下表提供了请求对象的几个值得注意的属性:
Property |
Description |
AcceptTypes |
获取客户端支持的 MIME 接受类型字符串数组。 |
ApplicationPath |
获取服务器上 ASP.NET 应用程序的虚拟应用程序根路径。 |
Browser |
获取或设置有关请求客户端浏览器功能的信息。 |
ContentEncoding |
获取或设置实体正文的字符集。 |
ContentLength |
指定客户端发送的内容的长度(以字节计)。 |
ContentType |
获取或设置传入请求的 MIME 内容类型。 |
Cookies |
获取客户端发送的 cookie 集合。 |
FilePath |
获取当前请求的虚拟路径。 |
Files |
获取客户端上传的文件集合(多部分 MIME 格式)。 |
Form |
获取表单变量集合。 |
Headers |
获取 HTTP 标头集合。 |
HttpMethod |
获取客户端使用的 HTTP 数据传输方法(如 GET、POST 或 HEAD)。 |
InputStream |
获取传入的 HTTP 实体正文的内容。 |
IsSecureConnection |
获取一个值,指示 HTTP 连接是否使用安全套接字(即 HTTPS)。 |
QueryString |
获取 HTTP 查询字符串变量的集合。 |
RawUrl |
获取当前请求的原始 URL。 |
RequestType |
获取或设置客户端使用的 HTTP 数据传输方法(GET 或 POST)。 |
ServerVariables |
获取 Web 服务器变量的集合。 |
TotalBytes |
获取当前输入流中的字节数。 |
Url |
获取当前请求的 URL 信息。 |
UrlReferrer |
获取与当前 URL 链接的客户端先前请求的 URL 信息。 |
UserAgent |
获取客户端浏览器的原始用户代理字符串。 |
UserHostAddress |
获取远程客户端的 IP 主机地址。 |
UserHostName |
获取远程客户端的 DNS 名称。 |
UserLanguages |
获取按优先顺序排列的客户端语言偏好的字符串数组。 |
下表提供了一些重要方法的列表:
Method |
Description |
BinaryRead |
从当前输入流中二进制读取指定数量的字节。 |
Equals(Object) |
判断指定的对象是否等于当前的对象。(从 object 继承。) |
GetType |
获取当前实例的类型。 |
MapImageCoordinates |
将输入图像字段表单参数映射到适当的 x 坐标和 y 坐标值。 |
MapPath(String) |
将指定的虚拟路径映射到物理路径。 |
SaveAs |
将 HTTP 请求保存到磁盘。 |
ToString |
返回一个表示当前对象的 String。 |
ValidateInput |
强制验证通过 Cookies、Form 和 QueryString 属性访问的集合。 |
Response Object
Response 对象表示服务器对客户端请求的响应。它是 System.Web.HttpResponse 类的实例。
在 ASP.NET 中,Response 对象在向客户端发送 HTML 文本时不会发挥任何重要作用,因为服务器端控件具有嵌套的面向对象的呈现自身的方法。
不过,HttpResponse 对象仍然提供一些重要功能,比如 cookie 功能和 Redirect() 方法。Response.Redirect() 方法允许将用户转移到另一个页面,这个页面可以在应用程序内也可以在外部。它需要一个往返过程。
Properties and Methods of the Response Object
下表提供了一些 Response 对象值得注意的属性:
Property |
Description |
Buffer |
获取或设置一个值,指示是否要缓冲输出,并在完整的响应完成处理后发送。 |
BufferOutput |
获取或设置一个值,指示是否要缓冲输出,并在整个页面完成处理后发送。 |
Charset |
获取或设置输出流的 HTTP 字符集。 |
ContentEncoding |
获取或设置输出流的 HTTP 字符集。 |
ContentType |
获取或设置输出流的 HTTP MIME 类型。 |
Cookies |
获取响应 Cookie 集合。 |
Expires |
获取或设置页面在浏览器上缓存过期前的分钟数。 |
ExpiresAbsolute |
获取或设置从缓存中移除缓存信息的绝对日期和时间。 |
HeaderEncoding |
获取或设置一个编码对象,该对象表示当前标头输出流的编码。 |
Headers |
获取响应头集合。 |
IsClientConnected |
获取一个值,指示客户端是否仍连接到服务器。 |
Output |
启用对出站 HTTP 响应流的文本输出。 |
OutputStream |
启用对出站 HTTP 内容正文的二进制输出。 |
RedirectLocation |
获取或设置 Http Location 标头的值。 |
Status |
设置将返回给客户端的状态行。 |
StatusCode |
获取或设置返回给客户端的输出的 HTTP 状态代码。 |
StatusDescription |
获取或设置返回给客户端的输出的 HTTP 状态字符串。 |
SubStatusCode |
获取或设置限定响应状态代码的值。 |
SuppressContent |
获取或设置一个值,指示是否向客户端发送 HTTP 内容。 |
下表提供了一些重要方法的列表:
Method |
Description |
AddHeader |
将 HTTP 标头添加到输出流。AddHeader 适用于兼容早期版本的 ASP。 |
AppendCookie |
基础设施将 HTTP cookie 添加到固有 cookie 集合。 |
AppendHeader |
将 HTTP 标头添加到输出流。 |
AppendToLog |
将自定义日志信息添加到 Internet 信息服务 (IIS) 日志文件。 |
BinaryWrite |
将一串二进制字符写入到 HTTP 输出流。 |
ClearContent |
清除缓冲区流中的所有内容输出。 |
Close |
关闭与客户端的套接字连接。 |
End |
将所有当前缓冲的输出发送到客户端,停止页面的执行,并引发 EndRequest 事件。 |
Equals(Object) |
确定指定的对象是否等于当前对象。 |
Flush |
将所有当前缓冲的输出发送到客户端。 |
GetType |
获取当前实例的类型。 |
Pics |
将一个 HTTP PICS-Label 头追加到输出流中。 |
Redirect(String) |
将一个请求重定向到一个新的 URL,并指定这个新的 URL。 |
Redirect(String, Boolean) |
将客户端重定向到一个新的 URL,指定一个新的 URL,并指定当前页面执行是否终止。 |
SetCookie |
更新 cookie 集合中一个已经存在的 cookie。 |
ToString |
返回表示当前对象的字符串。 |
TransmitFile(String) |
直接将指定的文件写入一个 HTTP 响应输出流,而不将其保存在内存中。 |
Write(Char) |
将一个字符写入一个 HTTP 响应输出流。 |
Write(Object) |
将一个对象写入一个 HTTP 响应流中。 |
Write(String) |
将一个字符写入 HTTP 响应输出流中。 |
WriteFile(String) |
将指定文件的直接内容以文件块的形式写入一个 HTTP 响应输出流中。 |
WriteFile(String, Boolean) |
将指定文件的直接内容以内存块的形式写入一个 HTTP 响应输出流中。 |
Example
下面这个简单的例子有一个文本框控件,用户可以在其中输入姓名;一个将其信息发送到服务器的按钮;一个显示客户端计算机 URL 的标签控件。
内容文件:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="server_side._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
Enter your name:<br />
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server"
OnClick="Button1_Click" Text="Submit" />
<br />
<asp:Label ID="Label1" runat="server"/>
</div>
</form>
</body>
</html>
Button1_Click 后面的代码:
protected void Button1_Click(object sender, EventArgs e)
{
if (!String.IsNullOrEmpty(TextBox1.Text))
{
// Access the HttpServerUtility methods through
// the intrinsic Server object.
Label1.Text = "Welcome, " + Server.HtmlEncode(TextBox1.Text) +
".<br/> The url is " + Server.UrlEncode(Request.Url.ToString())
}
}
运行该页面可查看以下结果:
ASP.NET - Server Controls
控件是图形用户界面中的小的构造模块,包括文本框、按钮、复选框、列表框、标签和众多其他工具。使用这些工具,用户可以输入数据、做出选择并指示他们的偏好。
控件还用于结构性工作,如验证、数据访问、安全性、创建母版页和数据处理。
ASP.NET 使用五种类型的 Web 控件,它们是:
-
HTML controls
-
HTML Server controls
-
ASP.NET Server controls
-
ASP.NET Ajax Server controls
-
用户控件和自定义控件
ASP.NET 服务器控件是 ASP.NET 中使用的一级控件。这些控件可以归类为以下类别:
-
* Validation controls * - 这些用于验证用户输入,它们通过运行客户端脚本工作。
-
* Data source controls * - 这些控件提供到不同数据源的数据绑定。
-
* Data view controls * - 这些是各种列表和表格,可以绑定到数据源的数据以供显示。
-
* Personalization controls * - 这些用于根据用户偏好对页面进行个性化设置,基于用户信息。
-
* Login and security controls * - 这些控件提供了用户身份验证。
-
* Master pages * - 这些控件在整个应用程序中提供了一致的布局和界面。
-
* Navigation controls * - 这些控件有助于导航。例如,菜单、树视图等。
-
* Rich controls * - 这些控件实现特殊功能。例如,AdRotator、FileUpload 和 Calendar 控件。
使用服务器控件的语法如下:
<asp:controlType ID ="ControlID" runat="server"
Property1=value1 [Property2=value2] />
此外,Visual Studio 具有以下特性,帮助生成无错误编码:
-
设计视图中控件的拖放
-
显示和自动完成属性的 IntelliSense 特性
-
用于直接设置属性值的属性窗口
Properties of the Server Controls
具有可视外观的 ASP.NET 服务器控件派生自 WebControl 类,并继承该类的所有属性、事件和方法。
WebControl 类本身以及一些未以可视方式呈现的其他服务器控件派生自 System.Web.UI.Control 类。例如,PlaceHolder 控件或 XML 控件。
ASP.Net 服务器控件继承了 WebControl 和 System.Web.UI.Control 类的所有属性、事件和方法。
下表显示了所有服务器控件共有的继承属性:
Property |
Description |
AccessKey |
按此键和 Alt 键可将焦点移动到控件。 |
Attributes |
这是任意属性的集合(仅用于呈现),它们不对应控件的属性。 |
BackColor |
Background color. |
BindingContainer |
包含此控件的数据绑定的控件。 |
BorderColor |
Border color. |
BorderStyle |
Border style. |
BorderWidth |
Border width. |
CausesValidation |
指示是否引起验证。 |
ChildControlCreated |
指示服务器控件的子控件是否已创建。 |
ClientID |
用于 HTML 标记的控件 ID。 |
Context |
与服务器控件关联的 HttpContext 对象。 |
Controls |
控件中原有所有控件的集合。 |
ControlStyle |
Web 服务器控件的样式。 |
CssClass |
CSS class |
DataItemContainer |
如果命名容器实现 IDataItemContainer,则获取对命名容器的引用。 |
DataKeysContainer |
如果命名容器实现 IDataKeysControl,则获取对命名容器的引用。 |
DesignMode |
指示控件是否正在设计界面上使用。 |
DisabledCssClass |
在禁用控件时,获取或设置将应用于所呈现 HTML 元素的 CSS 类。 |
Enabled |
指示控件是否呈灰色。 |
EnableTheming |
指示主题是否应用于控件。 |
EnableViewState |
指示是否维护控件的视图状态。 |
Events |
获取控件的事件处理程序委托的列表。 |
Font |
Font. |
Forecolor |
Foreground color. |
HasAttributes |
指示控件是否具有设置的属性。 |
HasChildViewState |
指示当前服务器控件的子控件是否具有任何已保存的视图状态设置。 |
Height |
高度以像素或百分比为单位。 |
ID |
Identifier for the control. |
IsChildControlStateCleared |
指示此控件中包含的控件是否具有控件状态。 |
IsEnabled |
获取一个值,指出控件是否已启用。 |
IsTrackingViewState |
指示服务器控件是否在将更改保存至其视图状态。 |
IsViewStateEnabled |
指示此控件的视图状态是否已启用。 |
LoadViewStateById |
指示控件是否参与通过 ID(而不是索引)加载其视图状态。 |
Page |
Page containing the control. |
Parent |
Parent control. |
RenderingCompatibility |
指定呈现的 HTML 将与之兼容的 ASP.NET 版本。 |
Site |
在设计界面上呈现时,承载当前控件的容器。 |
SkinID |
获取或设置应用于控件的皮肤。 |
Style |
获取将作为 Web 服务器控件的外部标记上的样式属性呈现的文本属性集合。 |
TabIndex |
获取或设置 Web 服务器控件的 tab 索引。 |
TagKey |
获取与 Web 服务器控件相对应的 HtmlTextWriterTag 值。 |
TagName |
获取控件标记的名称。 |
TemplateControl |
包含此控件的模板。 |
TemplateSourceDirectory |
获取包含此控件的页面或控件的虚拟目录。 |
ToolTip |
获取或设置当鼠标指针悬停在 Web 服务器控件上时显示的文本。 |
UniqueID |
Unique identifier. |
ViewState |
获取保存和还原同一页面对服务器控件视图状态的多项请求的状态信息字典。 |
ViewStateIgnoreCase |
表示 StateBag 对象是否不区分大小写。 |
ViewStateMode |
获取或设置此控件的视图状态模式。 |
Visible |
指示服务器控件是否可见。 |
Width |
获取或设置 Web 服务器控件的宽度。 |
Methods of the Server Controls
下表提供了服务器控件的方法:
Method |
Description |
AddAttributesToRender |
将需要渲染到指定的 HtmlTextWriterTag 的 HTML 属性和样式添加到其中。 |
AddedControl |
在子控件添加到控件对象的 Controls 集合之后调用。 |
AddParsedSubObject |
通知服务器控件某个元素(XML 或 HTML)已解析,并将该元素添加到服务器控件的控件集合中。 |
ApplyStyleSheetSkin |
将页面样式表定义的样式属性应用到控件中。 |
ClearCachedClientID |
基础设施。将缓存的 ClientID 值设置为 null。 |
ClearChildControlState |
删除服务器控件子控件的控件状态信息。 |
ClearChildState |
删除服务器控件所有子控件的视图状态和控件状态信息。 |
ClearChildViewState |
删除服务器控件所有子控件的视图状态信息。 |
CreateChildControls |
用于创建子控件。 |
CreateControlCollection |
创建新的 ControlCollection 对象来保存子控件。 |
CreateControlStyle |
创建用来实现所有样式相关属性的样式对象。 |
DataBind |
将数据源绑定到服务器控件及其所有子控件。 |
DataBind(Boolean) |
将数据源绑定到服务器控件及其所有子控件,同时可以选择引发 DataBinding 事件。 |
DataBindChildren |
将数据源绑定到服务器控件的子控件。 |
Dispose |
让服务器控件在其从内存中释放之前执行最终清理。 |
EnsureChildControls |
确定服务器控件是否包含子控件。如果没有,则创建子控件。 |
EnsureID |
为没有标识符的控件创建一个标识符。 |
Equals(Object) |
确定指定的对象是否等于当前对象。 |
Finalize |
允许一个对象尝试释放资源和执行其他清理操作,在该对象被垃圾回收回收之前。 |
FindControl(String) |
使用指定的 id 参数搜索当前命名容器中的服务器控件。 |
FindControl(String, Int32) |
使用指定的 id 和一个整数搜索当前命名容器中的服务器控件。 |
Focus |
将输入焦点设置为一个控件。 |
GetDesignModeState |
获取控件的设计时数据。 |
GetType |
获取当前实例的类型。 |
GetUniqueIDRelativeTo |
返回指定控件的 UniqueID 特性的前缀部分。 |
HasControls |
确定服务器控件是否包含任何子控件。 |
HasEvents |
指示控件或任何子控件是否已注册了事件。 |
IsLiteralContent |
确定服务器控件是否仅包含文字内容。 |
LoadControlState |
Restores control-state information. |
LoadViewState |
Restores view-state information. |
MapPathSecure |
检索一个虚拟路径(绝对或相对)所映射到的物理路径。 |
MemberwiseClone |
创建当前对象的浅表副本。 |
MergeStyle |
将指定样式的所有非空白元素复制到 Web 控件中,但不覆盖控件的任何现有样式元素。 |
OnBubbleEvent |
确定服务器控件的事件是否传递到页面的 UI 服务器控件层次结构中。 |
OnDataBinding |
引发数据绑定事件。 |
OnInit |
Raises the Init event. |
OnLoad |
Raises the Load event. |
OnPreRender |
Raises the PreRender event. |
OnUnload |
Raises the Unload event. |
OpenFile |
获取一个用于读取文件的 Stream。 |
RemovedControl |
在子控件从控件对象的控件集合中被删除后调用。 |
Render |
将控件呈现到指定的 HTML 写入器。 |
RenderBeginTag |
将控件的 HTML 开头标记呈现到指定写入器。 |
RenderChildren |
将服务器控件子项的内容输出到提供的 HtmlTextWriter 对象,由该对象编写需在客户端呈现的内容。 |
RenderContents |
向指定的编写器呈现控件内容。 |
RenderControl(HtmlTextWriter) |
将服务器控件内容输出到提供的 HtmlTextWriter 对象,如果启用了跟踪,则存储控件的跟踪信息。 |
RenderEndTag |
向指定的编写器呈现控件的 HTML 结束标记。 |
ResolveAdapter |
获取负责呈现指定控件的控件适配器。 |
SaveControlState |
保存自页面回发至服务器后出现的任何服务器控件状态更改。 |
SaveViewState |
保存跟踪视图状态方法调用后修改的任何状态。 |
SetDesignModeState |
设置控件的设计时数据。 |
ToString |
返回一个表示当前对象的字符串。 |
TrackViewState |
导致控件跟踪其视图状态的更改,以便可将这些更改存储在对象的视图状态属性中。 |
Example
让我们看一个特定的服务器控件——树形视图控件。树形视图控件属于导航控件。其他导航控件:菜单控件和站点映射路径控件。
在页面上添加一个树形视图控件。从任务中选择编辑节点…。使用树形视图节点编辑器编辑各个节点,如图所示:
创建节点后,设计视图中的效果如下所示:
自动格式…任务允许您格式化树形视图,如图所示:
在页面上添加一个标签控件和一个文本框控件并分别将它们命名为 lblmessage 和 txtmessage。
编写几行代码,确保选中特定节点时,标签控件显示节点文本和文本框显示该节点下的所有子节点(如有)。该文件后面的代码应如下所示:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
namespace eventdemo
{
public partial class treeviewdemo : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
txtmessage.Text = " ";
}
protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
{
txtmessage.Text = " ";
lblmessage.Text = "Selected node changed to: " +
TreeView1.SelectedNode.Text;
TreeNodeCollection childnodes = TreeView1.SelectedNode.ChildNodes;
if(childnodes != null)
{
txtmessage.Text = " ";
foreach (TreeNode t in childnodes)
{
txtmessage.Text += t.Value;
}
}
}
}
}
执行该页面以查看效果。您将能够展开和折叠这些节点。
ASP.NET - HTML Server
HTML 服务器控件本质上是标准 HTML 控件,增强了这些控件以启用服务器端处理。诸如标题标记、锚点标记和输入元素之类的 HTML 控件不由服务器处理,而是会被发送到浏览器显示。
它们通过添加 runat="server" 属性并添加 id 属性来专门转换为服务器控件,以便能够对它们进行服务器端处理。
例如,考虑 HTML 输入控件:
<input type="text" size="40">
可以通过添加 runat 和 id 属性将它转换为服务器控件:
<input type="text" id="testtext" size="40" runat="server">
Advantages of using HTML Server Controls
虽然 ASP.NET 服务器控件可以执行 HTML 服务器控件完成的所有工作,但这些控件在以下情况下很有用:
-
使用静态表格进行布局。
-
转换 HTML 页面,使其可以在 ASP.NET 下运行
下表描述了 HTML 服务器控件:
Control Name |
HTML tag |
HtmlHead |
<head>element |
HtmlInputButton |
<input type=button |
submit |
reset> |
HtmlInputCheckbox |
<input type=checkbox> |
HtmlInputFile |
<input type = file> |
HtmlInputHidden |
<input type = hidden> |
HtmlInputImage |
<input type = image> |
HtmlInputPassword |
<input type = password> |
HtmlInputRadioButton |
<input type = radio> |
HtmlInputReset |
<input type = reset> |
HtmlText |
<input type = text |
password> |
HtmlImage |
<img> element |
HtmlLink |
<link> element |
HtmlAnchor |
<a> element |
HtmlButton |
<button> element |
HtmlButton |
<button> element |
HtmlForm |
<form> element |
HtmlTable |
<table> element |
HtmlTableCell |
<td> and <th> |
HtmlTableRow |
<tr> element |
HtmlTitle |
<title> element |
HtmlSelect |
<select&t; element |
HtmlGenericControl |
Example
以下示例使用基本 HTML 表格进行布局。它使用一些框来从用户处获取姓名、地址、城市、州等输入。它还具有一个按钮控件,单击该按钮可在表格的最后一行中显示用户数据。
页面应在设计视图中呈现如下:
内容页的代码显示了如何使用 HTML 表格元素进行布局。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="htmlserver._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
<style type="text/css">
.style1
{
width: 156px;
}
.style2
{
width: 332px;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div>
<table style="width: 54%;">
<tr>
<td class="style1">Name:</td>
<td class="style2">
<asp:TextBox ID="txtname" runat="server" style="width:230px">
</asp:TextBox>
</td>
</tr>
<tr>
<td class="style1">Street</td>
<td class="style2">
<asp:TextBox ID="txtstreet" runat="server" style="width:230px">
</asp:TextBox>
</td>
</tr>
<tr>
<td class="style1">City</td>
<td class="style2">
<asp:TextBox ID="txtcity" runat="server" style="width:230px">
</asp:TextBox>
</td>
</tr>
<tr>
<td class="style1">State</td>
<td class="style2">
<asp:TextBox ID="txtstate" runat="server" style="width:230px">
</asp:TextBox>
</td>
</tr>
<tr>
<td class="style1"> </td>
<td class="style2"></td>
</tr>
<tr>
<td class="style1"></td>
<td ID="displayrow" runat ="server" class="style2">
</td>
</tr>
</table>
</div>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Click" />
</form>
</body>
</html>
按钮控件背后的代码:
protected void Button1_Click(object sender, EventArgs e)
{
string str = "";
str += txtname.Text + "<br />";
str += txtstreet.Text + "<br />";
str += txtcity.Text + "<br />";
str += txtstate.Text + "<br />";
displayrow.InnerHtml = str;
}
注意以下内容:
-
已对页面布局使用了标准 HTML 标记。
-
HTML 表格的最后一行用于数据显示。它需要服务器端处理,因此向其添加了 ID 属性和 runat 属性。
ASP.NET - Client Side
ASP.NET 客户端代码编制有两个方面:
-
Client side scripts :它在浏览器上运行,并依次加快页面的执行速度。例如,客户端数据验证可以捕获无效数据并相应地警告用户,而无需往返于服务器。
-
Client side source code :ASP.NET 页面生成此代码。例如,ASP.NET 页面的 HTML 源代码包含许多隐藏字段和自动注入的 JavaScript 代码块,这些代码块保持视图状态等信息或执行其他作业以使页面正常工作。
Client Side Scripts
所有 ASP.NET 服务器控件均允许对使用 JavaScript 或 VBScript 编写的客户端代码进行调用。一些 ASP.NET 服务器控件使用客户端脚本向用户提供响应而无需回发给服务器。例如,验证控件。
除了这些脚本以外,按钮控件有一个 OnClientClick 属性,当单击按钮时允许执行客户端脚本。
传统的服务器 HTML 控件具有在引发时可以执行脚本的以下事件:
Event |
Description |
onblur |
当控件失去焦点时 |
onfocus |
当控件收到焦点时 |
onclick |
当控件被单击时 |
onchange |
当控件的值发生变化时 |
onkeydown |
当用户按下某个键时 |
onkeypress |
当用户按下某个字母数字键时 |
onkeyup |
当用户释放某个键时 |
onmouseover |
当用户将鼠标指针移到控件上时 |
onserverclick |
当单击控件时,会引发控件的 ServerClick 事件 |
Client Side Source Code
我们已经讨论了,通常情况下,ASP.NET 页面会写入两个文件中:
-
内容文件或标记文件 (.aspx)
-
The code-behind file
内容文件包含 HTML 或 ASP.NET 控件标记和文本,以形成页面的结构。代码位于文件中包含类定义。在运行时,将对内容文件进行解析并将其转换为页面类。
此类与代码文件中的类定义以及系统生成的代码一起,组成了可处理所有已发布数据、生成响应并将其发回给客户端的可执行代码(程序集)。
考虑简单的页面:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="clientside._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>
Untitled Page
</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Click" />
</div>
<hr />
<h3><asp:Label ID="Msg" runat="server" Text=""></asp:Label>
</h3>
</form>
</body>
</html>
当在浏览器上运行此页面时,查看源代码选项会显示 ASP.NET 运行时发送到浏览器的 HTML 页面:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>
Untitled Page
</title>
</head>
<body>
<form name="form1" method="post" action="Default.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"
value="/wEPDwUKMTU5MTA2ODYwOWRk31NudGDgvhhA7joJum9Qn5RxU2M=" />
</div>
<div>
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION"
value="/wEWAwKpjZj0DALs0bLrBgKM54rGBhHsyM61rraxE+KnBTCS8cd1QDJ/"/>
</div>
<div>
<input name="TextBox1" type="text" id="TextBox1" />
<input type="submit" name="Button1" value="Click" id="Button1" />
</div>
<hr />
<h3><span id="Msg"></span></h3>
</form>
</body>
</html>
如果您正确浏览代码,您会看到前两个 <div> 标记包含存储视图状态和验证信息的隐藏字段。
ASP.NET - Basic Controls
在本章中,将讨论 ASP.NET 中可用的基本控件。
Button Controls
ASP.NET 提供了三种类型的按钮控件:
-
Button :它在矩形区域内显示文本。
-
Link Button :显示看起来像超链接的文本。
-
Image Button :它显示一张图片。
当用户单击按钮时,会触发两个事件:单击和命令。
按钮控件的基本语法:
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Click" / >
按钮控件的公用属性:
Property |
Description |
Text |
按钮上显示的文本。这仅适用于按钮和链接按钮控件。 |
ImageUrl |
仅适用于图像按钮控件。要为按钮显示的图像。 |
AlternateText |
仅适用于图像按钮控件。如果浏览器无法显示图像,则要显示的文本。 |
CausesValidation |
确定当用户单击按钮时是否发生页面验证。默认值为 true。 |
CommandName |
当用户单击按钮时传给命令事件的字符串值。 |
CommandArgument |
当用户单击按钮时传给命令事件的字符串值。 |
PostBackUrl |
当用户单击按钮时请求的页面的 URL。 |
Text Boxes and Labels
文本框控件通常用于接收来自用户的输入。文本框控件可以根据 TextMode 特性的设置接受一行或多行文本。
标签控件提供了一种简单的方式来显示文本,这些文本可以从一页的执行更改到另一页。如果你想显示不更改的文本,你可以使用文字文本。
文本控件的基本语法:
<asp:TextBox ID="txtstate" runat="server" ></asp:TextBox>
文本框和标签的常见属性:
Property |
Description |
TextMode |
指定文本框类型。SingleLine 创建一个标准文本框,MultiLIne 创建一个接受一行以上文本的文本框,Password 导致输入的字符被屏蔽。默认值为 SingleLine。 |
Text |
文本框的文本内容。 |
MaxLength |
可以输入文本框的最大字符数。 |
Wrap |
它确定多行文本框是否自动换行;默认值为 true。 |
ReadOnly |
确定用户是否可以更改框中的文本;默认值为 false,即用户无法更改文本。 |
Columns |
文本框的宽度(以字符为单位)。实际宽度基于用于文本输入的字体而定。 |
Rows |
多行文本框的高度(以行为单位)。默认值是 0,表示单行文本框。 |
标签控件最常用的特性是“Text”,它表示在标签上显示的文本。
Check Boxes and Radio Buttons
复选框显示用户可以选中或取消选中的一个选项,而单选按钮提供一组选项,用户只能从中选择一个选项。
要创建一组单选按钮,你需要为组中每个单选按钮的 GroupName 特性指定相同名称。如果单个表单中需要多个组,则为每个组指定不同的组名。
如果你想在最初显示表单时选中复选框或单选按钮,请将其 Checked 特性设置为 true。如果组中多个单选按钮的 Checked 特性设置为 true,则只有最后一个被视为 true。
复选框的基本语法:
<asp:CheckBox ID= "chkoption" runat= "Server">
</asp:CheckBox>
单选按钮的基本语法:
<asp:RadioButton ID= "rdboption" runat= "Server">
</asp: RadioButton>
复选框和单选按钮的常见属性:
Property |
Description |
Text |
复选框或单选按钮旁边显示的文本。 |
Checked |
指定是否已选中,默认情况下为 false。 |
GroupName |
控件所属组的名称。 |
List Controls
ASP.NET 提供以下控件
-
Drop-down list,
-
List box,
-
Radio button list,
-
Check box list,
-
Bulleted list.
这些控件允许用户从列表中选择一个或多个项目。列表框和下拉列表包含一个或多个列表项目。这些列表可以通过代码或 ListItemCollection 编辑器加载。
列表框控件的基本语法:
<asp:ListBox ID="ListBox1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="ListBox1_SelectedIndexChanged">
</asp:ListBox>
下拉列表控件的基本语法:
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
</asp:DropDownList>
列表框和下拉列表的公共属性:
Property |
Description |
Items |
表示控件中项目的 ListItem 对象的集合。该属性返回类型为 ListItemCollection 的对象。 |
Rows |
指定框中显示的项目数。如果实际列表包含多于显示的行,则会添加滚动条。 |
SelectedIndex |
当前所选项目的索引。如果已选择多项,则为第一个所选项目的索引。如果没有选择项目,则该属性的值为 -1。 |
SelectedValue |
当前所选项目的价值。如果已选择多项,则为第一个所选项目的价值。如果没有选择项目,则该属性的值为空字符串(“”)。 |
SelectionMode |
指示列表框允许单选还是多选。 |
每个列表项对象公用的属性:
Property |
Description |
Text |
针对该项目显示的文本。 |
Selected |
表示该项目是否已选择。 |
Value |
与该项目关联的字符串值。 |
需要注意的重要事项为:
-
若要使用下拉列表或列表框中的项目,请使用控件的 Items 属性。此属性返回一个包含列表中所有项目的 ListItemCollection 对象。
-
当用户从下拉列表或列表框中选择其它项目时,SelectedIndexChanged 事件会被激发。
The ListItemCollection
ListItemCollection 对象是 ListItem 对象的集合。每个 ListItem 对象代表了列表中的一个项目。ListItemCollection 中的项目从 0 开始编号。
如果使用字符串(如 lstcolor.Items.Add("Blue"))加载列表框中的项目,则列表项目的 Text 和 Value 属性都将被设置为您指定的字符串值。为了设置不同项目,您必须创建一个列表项目对象,然后将该项目添加到集合中。
ListItemCollection 编辑器用于向下拉列表或列表框中添加项目。这用于创建静态项目列表。若要显示集合编辑器,请从智能标记菜单中选择编辑项目,或选择控件,然后单击属性窗口中 Item 属性中的省略号按钮。
ListItemCollection 的常见属性:
Property |
Description |
Item(integer) |
表示指定索引处项目的 ListItem 对象。 |
Count |
集合中项目的数量。 |
ListItemCollection 的常见方法:
Methods |
Description |
Add(string) |
在集合末尾添加一个新项目,并将字符串参数分配给项目的 Text 属性。 |
Add(ListItem) |
在集合末尾添加一个新项目。 |
Insert(integer, string) |
在集合中指定索引位置插入一个项目,并将字符串参数分配给项目的文本属性。 |
Insert(integer, ListItem) |
在集合中指定索引位置插入该项目。 |
Remove(string) |
移除文本值与字符串相同的项目。 |
Remove(ListItem) |
Removes the specified item. |
RemoveAt(integer) |
移除指定索引(整数)处的项目。 |
Clear |
移除该集合的所有项目。 |
FindByValue(string) |
返回其值与字符串相同的项目。 |
FindByValue(Text) |
返回其文本与字符串相同的项目。 |
Radio Button list and Check Box list
单选按钮列表显示了一组互斥的选项。复选框列表显示了一组独立的选项。这些控件包含一个 ListItem 集合,可以通过控件的 Items 属性对其进行引用。
单选按钮列表的基本语法:
<asp:RadioButtonList ID="RadioButtonList1" runat="server" AutoPostBack="True"
OnSelectedIndexChanged="RadioButtonList1_SelectedIndexChanged">
</asp:RadioButtonList>
复选框列表的基本语法:
<asp:CheckBoxList ID="CheckBoxList1" runat="server" AutoPostBack="True"
OnSelectedIndexChanged="CheckBoxList1_SelectedIndexChanged">
</asp:CheckBoxList>
复选框和单选按钮列表的常用属性:
Property |
Description |
RepeatLayout |
此属性指定在呈现列表时,是使用表标签还是常规 html 流程来设置格式。默认值为 Table。 |
RepeatDirection |
它指定要重复控件的方向。可用的值有水平和垂直。默认为垂直。 |
RepeatColumns |
它指定重复控件时要使用的列数;默认为 0。 |
Bulleted lists and Numbered lists
项目符号列表控件创建项目符号列表或编号列表。这些控件包含一个 ListItem 对象集合,可以通过控件的 Items 属性引用这些对象。
项目符号列表的基本语法:
<asp:BulletedList ID="BulletedList1" runat="server">
</asp:BulletedList>
项目符号列表的常用属性:
Property |
Description |
BulletStyle |
此属性指定项目符号或数字的样式和外观。 |
RepeatDirection |
它指定要重复控件的方向。可用的值有水平和垂直。默认为垂直。 |
RepeatColumns |
它指定重复控件时要使用的列数;默认为 0。 |
ASP.NET - Directives
ASP.NET 指令是用于指定可选设置(如注册自定义控件和页面语言)的指令。这些设置描述了.Net 框架如何处理 Web 窗体(.aspx)或用户控件(.ascx)页面。
声明指令的语法:
<%@ directive_name attribute=value [attribute=value] %>
在本节中,我们将只介绍 ASP.NET 指令,并在整个教程中使用这些指令的大部分。
The Application Directive
Application 指令定义特定于应用程序的属性。它在 global.aspx 文件的顶部提供。
Application 指令的基本语法为:
<%@ Application Language="C#" %>
Application 指令的属性为:
Attributes |
Description |
Inherits |
要从中继承的类的名称。 |
Description |
应用程序的文本描述。解析器和编译器忽略此属性。 |
Language |
代码块中使用的语言。 |
The Assembly Directive
Assembly 指令在解析时将程序集链接到页面或应用程序。这可能会显示在用于应用程序范围链接的 global.asax 文件中、页面文件中、用户控件文件中(用于链接到页面或用户控件)。
Assembly 指令的基本语法为:
<%@ Assembly Name ="myassembly" %>
Assembly 指令的属性为:
Attributes |
Description |
Name |
要链接的程序集的名称。 |
Src |
要链接并动态编译的源文件的路径。 |
The Control Directive
Control 指令与用户控件一起使用,并显示在用户控件 (.ascx) 文件中。
Control 指令的基本语法为:
<%@ Control Language="C#" EnableViewState="false" %>
Control 指令的属性为:
Attributes |
Description |
AutoEventWireup |
布尔值,用于启用或禁用自动将事件与处理程序相关联。 |
ClassName |
控件的文件名。 |
Debug |
布尔值,用于启用或禁用使用调试符号进行编译。 |
Description |
控件页面的文本描述,由编译器忽略。 |
EnableViewState |
布尔值,用于指示是否跨页请求维护视图状态。 |
Explicit |
对于 VB 语言,指示编译器使用显式选项模式。 |
Inherits |
控件页面从中继承的类。 |
Language |
用于代码和脚本的语言。 |
Src |
代码隐藏类使用文件名。 |
Strict |
对于 VB 语言,告诉编译器使用严格模式选项。 |
The Implements Directive
Implement 指令表示 Web 页面、母版页或用户控件页面必须实现指定的 .Net 框架接口。
implements 指令的基本语法为:
<%@ Implements Interface="interface_name" %>
The Import Directive
Import 指令将命名空间导入 Web 页面、应用程序的用户控件页面。如果在 global.asax 文件中指定 Import 指令,则将其应用于整个应用程序。如果将其包含在用户控件页面中,则将其应用于该页面或控件。
import 指令的基本语法为:
<%@ namespace="System.Drawing" %>
The Master Directive
Master 指令指定一个页面文件作为母版页。
范例 MasterPage 指令的基本语法为:
<%@ MasterPage Language="C#" AutoEventWireup="true" CodeFile="SiteMater.master.cs" Inherits="SiteMaster" %>
The MasterType Directive
MasterType 指令将类名称分配给页面的 Master 属性,以使其强类型化。
MasterType 指令的基本语法为:
<%@ MasterType attribute="value"[attribute="value" ...] %>
The OutputCache Directive
OutputCache 指令控制某个 Web 页面或用户控件的输出缓存策略。
OutputCache 指令的基本语法为:
<%@ OutputCache Duration="15" VaryByParam="None" %>
The Page Directive
Page 指令为页面解析器和编译器定义页面文件特有的属性。
Page 指令的基本语法为:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Trace="true" %>
Page 指令的属性:
Attributes |
Description |
AutoEventWireup |
用于启用或禁用与方法自动绑定的页面事件(例如 Page_Load)的布尔值。 |
Buffer |
用于启用或禁用 HTTP 响应缓冲的布尔值。 |
ClassName |
页面的类名称。 |
ClientTarget |
服务器控件应该为其呈现内容的浏览器。 |
CodeFile |
代码隐藏文件的文件名。 |
Debug |
启用或禁用带调试符号的编译的布尔值。 |
Description |
页面文本描述,被解析器忽略。 |
EnableSessionState |
启用、禁用或使会话状态只读。 |
EnableViewState |
在页面请求中启用或禁用视图状态的布尔值。 |
ErrorPage |
如果发生未处理的页面异常的重新定向 URL。 |
Inherits |
代码隐藏或其他类的名称。 |
Language |
代码的编程语言。 |
Src |
代码隐藏类的文件名。 |
Trace |
启用或禁用跟踪。 |
TraceMode |
它指示如何显示跟踪消息,以及按时间或类别排序。 |
Transaction |
指示是否支持交易。 |
ValidateRequest |
指示是否针对硬编码的值列表验证所有输入数据的布尔值。 |
The PreviousPageType Directive
PreviousPageType 指令为页面分配一个类,以便该页面强类型化。
示例 PreviousPagetype 指令的基本语法为:
<%@ PreviousPageType attribute="value"[attribute="value" ...] %>
ASP.NET - Managing State
超文本传输协议 (HTTP) 是一个无状态协议。当客户端与服务器断开连接时,ASP.NET 引擎将放弃页面对象。通过这种方式,每个 Web 应用程序可以扩展为同时处理大量请求,而不会耗尽服务器内存。
但是,需要有一些技术在请求之间存储信息并在需要时检索它。此信息,即当前用户在当前会话中所有控件和变量的当前值,称为状态。
ASP.NET 管理四种类型的状态:
-
View State
-
Control State
-
Session State
-
Application State
View State
视图状态是页面及其所有控件的状态。它由 ASP.NET 框架在提交后自动维护。
当页面发送回客户端时,确定页面及其控件的属性中的更改并存储在名为 _VIEWSTATE 的隐藏输入字段的值中。当再次提交页面时,_VIEWSTATE 字段会与 HTTP 请求一同发送到服务器。
可以通过以下方式启用或禁用视图状态:
-
The entire application 通过在 web.config 文件的 <pages> 部分中设置 EnableViewState 属性。
-
A page 通过设置 Page 指令的 EnableViewState 属性,如 <%@ Page Language="C#" EnableViewState="false" %>
-
A control 通过设置 Control.EnableViewState 属性。
它使用由 StateBag 类定义的视图状态对象实现,该类定义了一系列视图状态项。状态包是一种包含属性值对的数据结构,这些对存储为与对象关联的字符串。
StateBag 类具有以下属性:
Properties |
Description |
Item(name) |
具有指定名称的视图状态项的值。这是 StateBag 类的默认属性。 |
Count |
视图状态集合中的项数。 |
Keys |
集合中所有项的键的集合。 |
Values |
集合中所有项的值的集合。 |
StateBag 类具有以下方法:
Methods |
Description |
Add(name, value) |
将项添加到视图状态集合中并更新现有项。 |
Clear |
移除集合中的所有项。 |
Equals(Object) |
确定指定的对象是否等于当前对象。 |
Finalize |
允许它释放资源并执行其他清理操作。 |
GetEnumerator |
返回一个枚举器,用于迭代 StateBag 对象中存储的 StateItem 对象的所有键/值对。 |
GetType |
获取当前实例的类型。 |
IsItemDirty |
检查存储在 StateBag 对象中的 StateItem 对象以评估它是否已修改。 |
Remove(name) |
Removes the specified item. |
SetDirty |
设置 StateBag 对象的状态以及它所包含的每个 StateItem 对象的 Dirty 属性。 |
SetItemDirty |
设置 StateBag 对象中指定 StateItem 对象的 Dirty 属性。 |
ToString |
返回表示状态信息包对象的字符串。 |
Example
以下示例演示了存储视图状态的概念。让我们保留一个计数器,该计数器会在每次通过单击页面上的按钮发回页面时递增。一个标签控件会显示计数器中的值。
标记文件代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="statedemo._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>
Untitled Page
</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h3>View State demo</h3>
Page Counter:
<asp:Label ID="lblCounter" runat="server" />
<asp:Button ID="btnIncrement" runat="server" Text="Add Count"
onclick="btnIncrement_Click" />
</div>
</form>
</body>
</html>
此示例的代码位于下面:
public partial class _Default : System.Web.UI.Page
{
public int counter
{
get
{
if (ViewState["pcounter"] != null)
{
return ((int)ViewState["pcounter"]);
}
else
{
return 0;
}
}
set
{
ViewState["pcounter"] = value;
}
}
protected void Page_Load(object sender, EventArgs e)
{
lblCounter.Text = counter.ToString();
counter++;
}
}
它将产生以下结果:
Session State
当用户连接到 ASP.NET 网站时,将创建一个新的会话对象。打开会话状态后,将为每次新请求创建新的会话状态对象。此会话状态对象成为上下文的组成部分,并且可通过页面使用。
会话状态通常用于存储应用程序数据,例如库存、供应商列表、客户记录或购物车。它还可以保留有关用户及其偏好的信息,并跟踪正在进行的操作。
会话使用 120 位的 SessionID 进行标识和跟踪,该 SessionID 从客户端传递到服务器,并返回作为 cookie 或修改的 URL。SessionID 是全局唯一且随机的。
会话状态对象从 HttpSessionState 类创建,该类定义了一组会话状态项。
HttpSessionState 类具有以下属性:
Properties |
Description |
SessionID |
The unique session identifier. |
Item(name) |
指定名称所对应的会话状态项的值。这是 HttpSessionState 类的默认属性。 |
Count |
会话状态集合中的项目数量。 |
TimeOut |
获取并设置会话状态提供程序终止会话前允许请求之间经过的时间(分钟)。 |
HttpSessionState 类具有如下的方法:
Methods |
Description |
Add(name, value) |
向会话状态集合中添加一个项目。 |
Clear |
从会话状态集合中删除所有项目。 |
Remove(name) |
从会话状态集合中删除指定的项目。 |
RemoveAll |
从会话状态集合中删除所有键和值。 |
RemoveAt |
从会话状态集合中删除指定索引处的项。 |
会话状态对象是一个键值对,用于存储和检索会话状态对象中的某些信息。您可以针对相同的对象使用如下的代码:
void StoreSessionInfo()
{
String fromuser = TextBox1.Text;
Session["fromuser"] = fromuser;
}
void RetrieveSessionInfo()
{
String fromuser = Session["fromuser"];
Label1.Text = fromuser;
}
上述代码仅在会话字典对象中存储字符串,然而,它可以存储由基本数据类型组成的所有基本数据类型和数组,以及 DataSet、DataTable、HashTable 和 Image 对象,以及继承自 ISerializable 对象的任何用户定义的类。
Example
以下示例展示了存储会话状态的概念。页面上有两个按钮、一个输入字符串的文本框和一个显示上一个会话中存储的文本的标签。
标记文件代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs"
Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>
Untitled Page
</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table style="width: 568px; height: 103px">
<tr>
<td style="width: 209px">
<asp:Label ID="lblstr" runat="server" Text="Enter a String" style="width:94px">
</asp:Label>
</td>
<td style="width: 317px">
<asp:TextBox ID="txtstr" runat="server" style="width:227px">
</asp:TextBox>
</td>
</tr>
<tr>
<td style="width: 209px"></td>
<td style="width: 317px"></td>
</tr>
<tr>
<td style="width: 209px">
<asp:Button ID="btnnrm" runat="server"
Text="No action button" style="width:128px" />
</td>
<td style="width: 317px">
<asp:Button ID="btnstr" runat="server"
OnClick="btnstr_Click" Text="Submit the String" />
</td>
</tr>
<tr>
<td style="width: 209px">
</td>
<td style="width: 317px">
</td>
</tr>
<tr>
<td style="width: 209px">
<asp:Label ID="lblsession" runat="server" style="width:231px" >
</asp:Label>
</td>
<td style="width: 317px">
</td>
</tr>
<tr>
<td style="width: 209px">
<asp:Label ID="lblshstr" runat="server">
</asp:Label>
</td>
<td style="width: 317px">
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
在设计视图中,它应该如下所示:
代码文件如下:
public partial class _Default : System.Web.UI.Page
{
String mystr;
protected void Page_Load(object sender, EventArgs e)
{
this.lblshstr.Text = this.mystr;
this.lblsession.Text = (String)this.Session["str"];
}
protected void btnstr_Click(object sender, EventArgs e)
{
this.mystr = this.txtstr.Text;
this.Session["str"] = this.txtstr.Text;
this.lblshstr.Text = this.mystr;
this.lblsession.Text = (String)this.Session["str"];
}
}
执行该文件并观察其工作方式:
Application State
ASP.NET 应用程序是一个集合,其中包含 Web 服务器上一个虚拟目录中的所有网页、代码和其他文件。如果信息存储在应用程序状态中,所有用户都可以访问。
为了使用应用程序状态,ASP.NET 会针对每个应用程序创建一个应用程序状态对象(来自 HTTPApplicationState 类),并将该对象存储在服务器内存中。此对象由类文件 global.asax 表示。
应用程序状态通常用于存储点击量计数器和其它统计数据、税率、折扣率等全局应用程序数据,以及对访问该网站的用户进行跟踪。
HttpApplicationState 类具有以下属性:
Properties |
Description |
Item(name) |
具有指定名称的应用程序状态项的值。这是 HttpApplicationState 类中的默认属性。 |
Count |
应用程序状态集合中条目的数量。 |
HttpApplicationState 类具有以下方法:
Methods |
Description |
Add(name, value) |
向应用程序状态集合添加一项。 |
Clear |
从应用程序状态集合中删除所有项。 |
Remove(name) |
从应用程序状态集合中删除指定项。 |
RemoveAll |
从 HttpApplicationState 集合中删除所有对象。 |
RemoveAt |
通过索引从集合中删除一个 HttpApplicationState 对象。 |
Lock() |
锁定应用程序状态集合,以便只有当前用户可以访问它。 |
Unlock() |
解锁应用程序状态集合,以便所有用户都可以访问它。 |
通常通过针对以下事件编写处理程序来维护应用程序状态数据:
-
Application_Start
-
Application_End
-
Application_Error
-
Session_Start
-
Session_End
以下代码片段显示了存储应用程序状态信息的基本语法:
Void Application_Start(object sender, EventArgs e)
{
Application["startMessage"] = "The application has started.";
}
Void Application_End(object sender, EventArgs e)
{
Application["endtMessage"] = "The application has ended.";
}
ASP.NET - Validators
ASP.NET 验证控件验证用户输入数据,以确保不会存储无用、未经身份验证或矛盾的数据。
ASP.NET 提供以下验证控件:
-
RequiredFieldValidator
-
RangeValidator
-
CompareValidator
-
RegularExpressionValidator
-
CustomValidator
-
ValidationSummary
BaseValidator Class
验证控件类继承自 BaseValidator 类,因此继承了它的属性和方法。因此,了解这个所有验证控件共有的基类的属性和方法会有帮助:
Members |
Description |
ControlToValidate |
指示要验证的输入控件。 |
Display |
指示如何显示错误消息。 |
EnableClientScript |
指示是否进行客户端验证。 |
Enabled |
启用或禁用验证器。 |
ErrorMessage |
Indicates error string. |
Text |
如果验证失败时要显示的错误文本。 |
IsValid |
指示控件的值是否有效。 |
SetFocusOnError |
指示在控件无效的情况下,焦点是否应切换到相关的输入控件。 |
ValidationGroup |
此控件所属的多个验证器的逻辑组。 |
Validate() |
此方法重新验证控件并更新 IsValid 属性。 |
RequiredFieldValidator Control
RequiredFieldValidator 控件确保必填字段不为空。通常将其绑定到文本框,以强制用户在文本框中输入内容。
控件的语法如下所示:
<asp:RequiredFieldValidator ID="rfvcandidate"
runat="server" ControlToValidate ="ddlcandidate"
ErrorMessage="Please choose a candidate"
InitialValue="Please choose a candidate">
</asp:RequiredFieldValidator>
RangeValidator Control
RangeValidator 控件验证输入值是否在预定范围内。
它具有三个特定属性:
Properties |
Description |
Type |
它定义了数据的类型。可用值为:货币、日期、双精度、整数和字符串。 |
MinimumValue |
它指定范围的最小值。 |
MaximumValue |
它指定范围的最大值。 |
控件的语法如下所示:
<asp:RangeValidator ID="rvclass" runat="server" ControlToValidate="txtclass"
ErrorMessage="Enter your class (6 - 12)" MaximumValue="12"
MinimumValue="6" Type="Integer">
</asp:RangeValidator>
CompareValidator Control
CompareValidator 控件将一个控件中的值与另一个控件中的固定值或值进行比较。
它具有下列特定属性:
Properties |
Description |
Type |
它指定数据类型。 |
ControlToCompare |
它指定要与其进行比较的输入控件的值。 |
ValueToCompare |
它指定要与其进行比较的常量值。 |
Operator |
它指定比较运算符,可用值为:等于、不等于、大于、大于等于、小于、小于等于和 DataTypeCheck。 |
该控件的基本语法如下:
<asp:CompareValidator ID="CompareValidator1" runat="server"
ErrorMessage="CompareValidator">
</asp:CompareValidator>
RegularExpressionValidator
RegularExpressionValidator 允许通过与正则表达式的模式匹配来验证输入文本。正则表达式在 ValidationExpression 属性中设置。
下表总结了正则表达式中常用的语法结构:
Character Escapes |
Description |
\b |
Matches a backspace. |
\t |
Matches a tab. |
\r |
Matches a carriage return. |
\v |
Matches a vertical tab. |
\f |
Matches a form feed. |
\n |
Matches a new line. |
除了匹配单个字符,还可以指定一类可以匹配的字符,称为元字符。
Metacharacters |
Description |
. |
匹配除 \n 之外的任何字符。 |
[abcd] |
匹配集合中的任何字符。 |
[^abcd] |
排除集合中的任何字符。 |
[2-7a-mA-M] |
匹配范围内指定的任何字符。 |
\w |
匹配任何字母数字字符和下划线。 |
\W |
Matches any non-word character. |
\s |
匹配空格字符,如空格、制表符、换行符等。 |
\S |
Matches any non-whitespace character. |
\d |
Matches any decimal character. |
\D |
Matches any non-decimal character. |
可以通过量词来指定字符可能出现的次数。
Quantifier |
Description |
* |
Zero or more matches. |
+ |
One or more matches. |
? |
Zero or one matches. |
{N} |
N matches. |
{N,} |
N or more matches. |
{N,M} |
在 N 和 M 次匹配之间。 |
控件的语法如下所示:
<asp:RegularExpressionValidator ID="string" runat="server" ErrorMessage="string"
ValidationExpression="string" ValidationGroup="string">
</asp:RegularExpressionValidator>
CustomValidator
CustomValidator 控件允许为客户端和服务器端验证编写应用程序特有的自定义验证例程。
通过 ClientValidationFunction 属性来完成客户端验证。客户端验证例程应以浏览器可以理解的脚本语言(例如 JavaScript 或 VBScript)编写。
必须从控件的 ServerValidate 事件处理程序调用服务端验证例程。服务端验证例程应以任何 .Net 语言(如 C# 或 VB.Net)编写。
控件的基本语法如下:
<asp:CustomValidator ID="CustomValidator1" runat="server"
ClientValidationFunction=.cvf_func. ErrorMessage="CustomValidator">
</asp:CustomValidator>
ValidationSummary
ValidationSummary 控件不会执行任何验证,但会显示页面中所有错误的摘要。摘要显示验证失败的所有验证控件的 ErrorMessage 属性值。
以下两个互斥的属性列出错误消息:
-
ShowSummary :以指定格式显示错误消息。
-
ShowMessageBox :在单独窗口中显示错误消息。
控件的语法如下:
<asp:ValidationSummary ID="ValidationSummary1" runat="server"
DisplayMode = "BulletList" ShowSummary = "true" HeaderText="Errors:" />
Validation Groups
复杂的页面在不同的面板中提供不同组的信息。在这种情况下,可能需要分别对不同的组执行验证。使用验证组可以处理这种类型的状况。
若要创建验证组,应将输入控件和验证控件放入同一逻辑组,方法是设置其 ValidationGroup 属性。
Example
以下示例描述了由一所学校的全部学生填写的一份表格,这些学生划分为四个组,用于选举学校主席。在这里,我们使用验证控件来验证用户输入。
这是表单的设计视图:
给出的内容文件代码如下:
<form id="form1" runat="server">
<table style="width: 66%;">
<tr>
<td class="style1" colspan="3" align="center">
<asp:Label ID="lblmsg"
Text="President Election Form : Choose your president"
runat="server" />
</td>
</tr>
<tr>
<td class="style3">
Candidate:
</td>
<td class="style2">
<asp:DropDownList ID="ddlcandidate" runat="server" style="width:239px">
<asp:ListItem>Please Choose a Candidate</asp:ListItem>
<asp:ListItem>M H Kabir</asp:ListItem>
<asp:ListItem>Steve Taylor</asp:ListItem>
<asp:ListItem>John Abraham</asp:ListItem>
<asp:ListItem>Venus Williams</asp:ListItem>
</asp:DropDownList>
</td>
<td>
<asp:RequiredFieldValidator ID="rfvcandidate"
runat="server" ControlToValidate ="ddlcandidate"
ErrorMessage="Please choose a candidate"
InitialValue="Please choose a candidate">
</asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td class="style3">
House:
</td>
<td class="style2">
<asp:RadioButtonList ID="rblhouse" runat="server" RepeatLayout="Flow">
<asp:ListItem>Red</asp:ListItem>
<asp:ListItem>Blue</asp:ListItem>
<asp:ListItem>Yellow</asp:ListItem>
<asp:ListItem>Green</asp:ListItem>
</asp:RadioButtonList>
</td>
<td>
<asp:RequiredFieldValidator ID="rfvhouse" runat="server"
ControlToValidate="rblhouse" ErrorMessage="Enter your house name" >
</asp:RequiredFieldValidator>
<br />
</td>
</tr>
<tr>
<td class="style3">
Class:
</td>
<td class="style2">
<asp:TextBox ID="txtclass" runat="server"></asp:TextBox>
</td>
<td>
<asp:RangeValidator ID="rvclass"
runat="server" ControlToValidate="txtclass"
ErrorMessage="Enter your class (6 - 12)" MaximumValue="12"
MinimumValue="6" Type="Integer">
</asp:RangeValidator>
</td>
</tr>
<tr>
<td class="style3">
Email:
</td>
<td class="style2">
<asp:TextBox ID="txtemail" runat="server" style="width:250px">
</asp:TextBox>
</td>
<td>
<asp:RegularExpressionValidator ID="remail" runat="server"
ControlToValidate="txtemail" ErrorMessage="Enter your email"
ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*">
</asp:RegularExpressionValidator>
</td>
</tr>
<tr>
<td class="style3" align="center" colspan="3">
<asp:Button ID="btnsubmit" runat="server" onclick="btnsubmit_Click"
style="text-align: center" Text="Submit" style="width:140px" />
</td>
</tr>
</table>
<asp:ValidationSummary ID="ValidationSummary1" runat="server"
DisplayMode ="BulletList" ShowSummary ="true" HeaderText="Errors:" />
</form>
提交按钮后面的代码:
protected void btnsubmit_Click(object sender, EventArgs e)
{
if (Page.IsValid)
{
lblmsg.Text = "Thank You";
}
else
{
lblmsg.Text = "Fill up all the fields";
}
}
ASP.NET - Database Access
ASP.NET 允许访问和使用以下数据源:
-
数据库(例如,Access、SQL Server、Oracle、MySQL)
-
XML documents
-
Business Objects
-
Flat files
ASP.NET 隐藏了复杂的数据访问过程,并提供了更高级别的类和对象,通过这些类和对象可以轻松访问数据。这些类隐藏了所有有关连接、数据检索、数据查询和数据操作的复杂编码。
ADO.NET 是一种在各种 ASP.NET 控件对象和后端数据源之间建立桥梁的技术。在本教程中,我们将简要探讨数据访问以及使用数据。
Retrieve and display data
需要两种类型的数据控件才能在 ASP.NET 中检索和显示数据:
-
A data source control - 它管理与数据、所选数据和其他任务(例如数据分页和缓存等)的连接。
-
A data view control - 它绑定并显示数据,并允许数据操作。
我们将在稍后详细讨论数据绑定和数据源控件。在本部分中,我们将使用 SqlDataSource 控件来访问数据,并使用 GridView 控件来显示和操作数据。
我们还将使用 Access 数据库,该数据库包含市场上可用的 .Net 书籍的详细信息。我们的数据库的名称是 ASPDotNetStepByStep.mdb,我们将使用数据表 DotNetReferences。
该表具有以下列:ID、Title、AuthorFirstName、AuthorLastName、Topic 和 Publisher。
以下是数据表的快照:
让我们直接采取行动,执行以下步骤:
(1) 创建一个网站并在 Web 窗体上添加一个 SqlDataSourceControl。
(2) 单击“配置数据源”选项。
(3) 单击“新建连接”按钮,以建立与数据库的连接。
(4) 一旦建立连接,您可以将其保存以便将来使用。在下一步中,系统会要求您配置 select 语句:
(5) 选择列并单击“下一步”以完成步骤。观察 WHERE、ORDER BY 和“高级”按钮。这些按钮允许您提供 where 从句、order by 从句,并分别指定 SQL 的 insert、update 和 delete 命令。这样,您可以操作数据。
(6) 在窗体上添加 GridView 控件。使用自动格式选项选择数据源并设置控件的格式。
(7) 在此之后,设置格式的 GridView 控件显示列标题,并且应用程序已准备就绪可执行。
(8) 最后执行该应用程序。
给出的内容文件代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="dataaccess.aspx.cs"
Inherits="datacaching.WebForm1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>
Untitled Page
</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString= "<%$ ConnectionStrings:ASPDotNetStepByStepConnectionString%>"
ProviderName= "<%$ ConnectionStrings:
ASPDotNetStepByStepConnectionString.ProviderName %>"
SelectCommand="SELECT [Title], [AuthorLastName],
[AuthorFirstName], [Topic] FROM [DotNetReferences]">
</asp:SqlDataSource>
<asp:GridView ID="GridView1" runat="server"
AutoGenerateColumns="False" CellPadding="4"
DataSourceID="SqlDataSource1" ForeColor="#333333"
GridLines="None">
<RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
<Columns>
<asp:BoundField DataField="Title" HeaderText="Title"
SortExpression="Title" />
<asp:BoundField DataField="AuthorLastName"
HeaderText="AuthorLastName" SortExpression="AuthorLastName" />
<asp:BoundField DataField="AuthorFirstName"
HeaderText="AuthorFirstName" SortExpression="AuthorFirstName" />
<asp:BoundField DataField="Topic"
HeaderText="Topic" SortExpression="Topic" />
</Columns>
<FooterStyle BackColor="#5D7B9D"
Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#284775"
ForeColor="White" HorizontalAlign="Center" />
<SelectedRowStyle BackColor="#E2DED6"
Font-Bold="True" ForeColor="#333333" />
<HeaderStyle BackColor="#5D7B9D" Font-Bold="True"
ForeColor="White" />
<EditRowStyle BackColor="#999999" />
<AlternatingRowStyle BackColor="White" ForeColor="#284775" />
</asp:GridView>
</div>
</form>
</body>
</html>
ADO.NET
ADO.NET 在前端控件和后端数据库之间提供了桥梁。ADO.NET 对象封装了所有数据访问操作,而控件与这些对象交互,以显示数据,从而隐藏了数据移动的详细信息。
下图一目了然地显示了 ADO.NET 对象:
The DataSet Class
数据集表示数据库的一个子集。它与数据库没有连续的连接。若要更新数据库,则需要重新连接。DataSet 包含 DataTable 对象和 DataRelation 对象。DataRelation 对象表示两个表之间的关系。
下表显示了 DataSet 类的若干重要属性:
Properties |
Description |
CaseSensitive |
指示数据表内的字符串比较是否区分大小写。 |
Container |
获取组件容器。 |
DataSetName |
获取或设置当前数据集的名称。 |
DefaultViewManager |
返回数据集中数据的视图。 |
DesignMode |
指示组件是否当前处于设计模式。 |
EnforceConstraints |
指示在尝试任何更新操作时是否遵循约束规则。 |
Events |
获取附加到此组件的事件处理程序列表。 |
ExtendedProperties |
获取与 DataSet 关联的自定义用户信息集合。 |
HasErrors |
指示是否有任何错误。 |
IsInitialized |
指示 DataSet 是否已初始化。 |
Locale |
获取或设置用于比较表内字符串的区域设置信息。 |
Namespace |
获取或设置 DataSet 的命名空间。 |
Prefix |
获取或设置别名 DataSet 命名空间的 XML 前缀。 |
Relations |
返回 DataRelation 对象集合。 |
Tables |
返回 DataTable 对象集合。 |
下表显示了 DataSet 类的若干重要方法:
Methods |
Description |
AcceptChanges |
接受自 DataSet 加载或此方法被调用以来所做的所有更改。 |
BeginInit |
开始初始化 DataSet。初始化将在运行时发生。 |
Clear |
Clears data. |
Clone |
复制 DataSet 的结构,包括所有 DataTable 架构、关系和约束。不复制任何数据。 |
Copy |
复制结构和数据。 |
CreateDataReader() |
返回一个 DataTableReader,每个 DataTable 有一个结果集,顺序与表出现在 Tables 集合中的顺序相同。 |
CreateDataReader(DataTable[]) |
返回一个 DataTableReader,每个 DataTable 有一个结果集。 |
EndInit |
结束数据集的初始化。 |
Equals(Object) |
确定指定的对象是否等于当前对象。 |
Finalize |
释放资源并执行其他清理。 |
GetChanges |
返回一个 DataSet 的副本,其中包含自加载或调用 AcceptChanges 方法以来所做的所有更改。 |
GetChanges(DataRowState) |
获取一个 DataSet 的副本,其中包含自加载或调用 AcceptChanges 方法以来所做的所有更改,按 DataRowState 筛选。 |
GetDataSetSchema |
获取 DataSet 的 XmlSchemaSet 副本。 |
GetObjectData |
使用序列化 DataSet 所需的数据填充序列化信息对象。 |
GetType |
获取当前实例的类型。 |
GetXML |
返回数据的 XML 表示形式。 |
GetXMLSchema |
返回数据的 XML 表示形式的 XSD 架构。 |
HasChanges() |
获取一个值,该值指示 DataSet 是否有更改,包括新建、已删除或已修改的行。 |
HasChanges(DataRowState) |
获取一个值,该值指示 DataSet 是否有更改,包括新建、已删除或已修改的行,按 DataRowState 筛选。 |
IsBinarySerialized |
检查 DataSet 序列表示的格式。 |
Load(IDataReader, LoadOption, DataTable[]) |
使用提供的 IDataReader 用数据源中的值填充 DataSet,使用 DataTable 实例的数组来提供架构和命名空间信息。 |
Load(IDataReader, LoadOption, String[]) |
使用提供的 IDataReader 用数据源中的值填充 DataSet,使用字符串数组来提供 DataSet 中表的名称。 |
Merge() |
使用其他 DataSet 中的数据合并数据。此方法有不同的重载形式。 |
ReadXML() |
将 XML 架构和数据读入 DataSet。此方法有不同的重载形式。 |
ReadXMLSchema(0) |
将 XML 架构读入 DataSet。此方法有不同的重载形式。 |
RejectChanges |
回滚自最后一次调用 AcceptChanges 以来所做的所有更改。 |
WriteXML() |
写入 XML 架构和数据以从 DataSet 中。此方法有不同的重载形式。 |
WriteXMLSchema() |
以 XML 架构的形式写入 DataSet 的结构。此方法有不同的重载形式。 |
The DataTable Class
DataTable 类表示数据库中的表。它有以下重要属性;这些属性大多是只读属性,除了 PrimaryKey 属性:
Properties |
Description |
ChildRelations |
返回子关系集合。 |
Columns |
Returns the Columns collection. |
Constraints |
Returns the Constraints collection. |
DataSet |
Returns the parent DataSet. |
DefaultView |
返回表视图。 |
ParentRelations |
Returns the ParentRelations collection. |
PrimaryKey |
获取或设置一组列作为表的唯一键。 |
Rows |
Returns the Rows collection. |
下表显示了 DataTable 类的部分重要方法:
Methods |
Description |
AcceptChanges |
提交自最后一次 AcceptChanges 以来所做的所有更改。 |
Clear |
清除表中的所有数据。 |
GetChanges |
返回一个 DataTable 副本,其中包含自调用 AcceptChanges 方法以来所做的所有更改。 |
GetErrors |
返回一个带有错误的行数组。 |
ImportRows |
将新行复制到表中。 |
LoadDataRow |
查找并更新特定行,或创建新行,如果找不到。 |
Merge |
将表与其他 DataTable 合并。 |
NewRow |
Creates a new DataRow. |
RejectChanges |
回滚自最后一次调用 AcceptChanges 以来所做的所有更改。 |
Reset |
将表重置为其原始状态。 |
Select |
返回一个 DataRow 对象数组。 |
The DataRow Class
DataRow 对象表示表中的一行。它具有以下重要属性:
Properties |
Description |
HasErrors |
指示是否有任何错误。 |
Items |
获取或设置存储在特定列中的数据。 |
ItemArrays |
获取或设置行的所有值。 |
Table |
Returns the parent table. |
下表显示了 DataRow 类的部分重要方法:
Methods |
Description |
AcceptChanges |
接受此方法调用后做出的所有更改。 |
BeginEdit |
Begins edit operation. |
CancelEdit |
Cancels edit operation. |
Delete |
Deletes the DataRow. |
EndEdit |
Ends the edit operation. |
GetChildRows |
获取此行的子行。 |
GetParentRow |
Gets the parent row. |
GetParentRows |
获取 DataRow 对象的父行。 |
RejectChanges |
回滚自最后一次调用 AcceptChanges 以来所做的所有更改。 |
The DataReader Object
DataReader 对象是 DataSet 和 DataAdapter 组合的备选方案。此对象提供面向连接的数据库中数据记录的访问。这些对象适合于只读访问,比如填充一个列表然后断开连接。
DbCommand and DbConnection Objects
DbConnection 对象表示与数据源的连接。该连接可由不同的命令对象共享。
DbCommand 对象表示发送至数据库的命令或存储过程,用于检索或处理数据。
Example
到目前为止,我们已经使用了计算机中已存在的表和数据库。在本例中,我们将创建表、向其中添加列、行和数据,并使用 GridView 对象显示该表。
源文件代码如下所示:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="createdatabase._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>
Untitled Page
</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
</div>
</form>
</body>
</html>
如下所示的文件背后的代码:
namespace createdatabase
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataSet ds = CreateDataSet();
GridView1.DataSource = ds.Tables["Student"];
GridView1.DataBind();
}
}
private DataSet CreateDataSet()
{
//creating a DataSet object for tables
DataSet dataset = new DataSet();
// creating the student table
DataTable Students = CreateStudentTable();
dataset.Tables.Add(Students);
return dataset;
}
private DataTable CreateStudentTable()
{
DataTable Students = new DataTable("Student");
// adding columns
AddNewColumn(Students, "System.Int32", "StudentID");
AddNewColumn(Students, "System.String", "StudentName");
AddNewColumn(Students, "System.String", "StudentCity");
// adding rows
AddNewRow(Students, 1, "M H Kabir", "Kolkata");
AddNewRow(Students, 1, "Shreya Sharma", "Delhi");
AddNewRow(Students, 1, "Rini Mukherjee", "Hyderabad");
AddNewRow(Students, 1, "Sunil Dubey", "Bikaner");
AddNewRow(Students, 1, "Rajat Mishra", "Patna");
return Students;
}
private void AddNewColumn(DataTable table, string columnType, string columnName)
{
DataColumn column = table.Columns.Add(columnName, Type.GetType(columnType));
}
//adding data into the table
private void AddNewRow(DataTable table, int id, string name, string city)
{
DataRow newrow = table.NewRow();
newrow["StudentID"] = id;
newrow["StudentName"] = name;
newrow["StudentCity"] = city;
table.Rows.Add(newrow);
}
}
}
执行程序时,观察以下内容:
-
该应用程序首先创建一个数据集,并使用 GridView 控件的 DataBind() 方法将其绑定到网格视图控件。
-
Createdataset() 方法是一个用户自定义函数,它创建一个新的 DataSet 对象,然后调用另一个用户自定义方法 CreateStudentTable() 来创建表并将其添加到数据集的 Tables 集合。
-
CreateStudentTable() 方法调用用户自定义方法 AddNewColumn() 和 AddNewRow() 来创建表的列和行,以及向行中添加数据。
执行该页面时,它返回如下图所示的表的行:
ASP.NET - File Uploading
ASP.NET 有两个控件允许用户将文件上传到 Web 服务器。一旦服务器接收到已发布的文件数据,应用程序可以保存它、检查它或忽略它。以下控件允许上传文件:
-
HtmlInputFile - HTML 服务器控件
-
FileUpload - 和 ASP.NET Web 控件
两个控件都允许上传文件,但 FileUpload 控件会自动设置表单的编码,而 HtmlInputFile 控件不会。
在本教程中,我们使用 FileUpload 控件。FileUpload 控件允许用户浏览并选择要上传的文件,它提供了一个浏览按钮和一个文本框,用于输入文件名。
一旦用户通过键入名称或浏览在文本框中输入了文件名,就可以调用 FileUpload 控件的 SaveAs 方法来将文件保存到磁盘中。
FileUpload 的基本语法如下:
<asp:FileUpload ID= "Uploader" runat = "server" />
FileUpload 类派生自 WebControl 类,并继承其所有成员。除此之外,FileUpload 类有以下只读属性:
Properties |
Description |
FileBytes |
返回要上传的文件中的字节数组。 |
FileContent |
返回指向要上传的文件的流对象。 |
FileName |
返回要上传的文件名。 |
HasFile |
指定控件是否具有要上传的文件。 |
PostedFile |
返回对已上传文件的引用。 |
过期的文件封装在 HttpPostedFile 类型的对象中,可以通过 FileUpload 类的 PostedFile 属性对其进行访问。
HttpPostedFile 类有以下常用属性:
Properties |
Description |
ContentLength |
返回已上传文件的大小(以字节为单位)。 |
ContentType |
返回已上传文件的 MIME 类型。 |
FileName |
Returns the full filename. |
InputStream |
返回指向已上传文件的流对象。 |
Example
以下示例演示了 FileUpload 控件及其属性。该表单包含一个 FileUpload 控件,以及一个保存按钮和一个标签控件,用于显示文件名、文件类型和文件长度。
在设计视图中,表单如下所示:
给出的内容文件代码如下:
<body>
<form id="form1" runat="server">
<div>
<h3> File Upload:</h3>
<br />
<asp:FileUpload ID="FileUpload1" runat="server" />
<br /><br />
<asp:Button ID="btnsave" runat="server" onclick="btnsave_Click" Text="Save" style="width:85px" />
<br /><br />
<asp:Label ID="lblmessage" runat="server" />
</div>
</form>
</body>
保存按钮后面的代码如下:
protected void btnsave_Click(object sender, EventArgs e)
{
StringBuilder sb = new StringBuilder();
if (FileUpload1.HasFile)
{
try
{
sb.AppendFormat(" Uploading file: {0}", FileUpload1.FileName);
//saving the file
FileUpload1.SaveAs("<c:\\SaveDirectory>" + FileUpload1.FileName);
//Showing the file information
sb.AppendFormat("<br/> Save As: {0}", FileUpload1.PostedFile.FileName);
sb.AppendFormat("<br/> File type: {0}", FileUpload1.PostedFile.ContentType);
sb.AppendFormat("<br/> File length: {0}", FileUpload1.PostedFile.ContentLength);
sb.AppendFormat("<br/> File name: {0}", FileUpload1.PostedFile.FileName);
}
catch (Exception ex)
{
sb.Append("<br/> Error <br/>");
sb.AppendFormat("Unable to save file <br/> {0}", ex.Message);
}
}
else
{
lblmessage.Text = sb.ToString();
}
}
注意以下事项:
-
StringBuilder 类派生自 System.IO 命名空间,因此需要包含它。
-
try 和 catch 块用于捕获错误,并显示错误消息。
ASP.NET - Ad Rotator
AdRotator 控件从一个列表中随机选择标语图形,列表在外部 XML 调度文件中指定。该外部 XML 调度文件称为广告文件。
AdRotator 控件允许你分别在 AdvertisementFile 和 Target 属性中指定广告文件和链接应遵循的窗口类型。
添加 AdRotator 的基本语法如下:
<asp:AdRotator runat = "server" AdvertisementFile = "adfile.xml" Target = "_blank" />
在深入了解 AdRotator 控件及其属性之前,让我们深入了解广告文件的构造。
The Advertisement File
广告文件是一个 XML 文件,其中包含要显示的广告信息。
可扩展标记语言 (XML) 是 W3C 为文本文档标记制定的一个标准。它是一种基于文本的标记语言,使你能够通过使用有意义的标签以结构化的格式存储数据。术语“可扩展”意味着你可以通过为应用程序定义有意义的标签来扩展描述文档的能力。
XML 本身不是一种语言(例如 HTML),而是用于创建新标记语言的一组规则。它是一种元标记语言。它允许开发者为特殊用途创建自定义标签集。它对信息进行结构化、存储并传输。
以下是一个 XML 文件范例:
<BOOK>
<NAME> Learn XML </NAME>
<AUTHOR> Samuel Peterson </AUTHOR>
<PUBLISHER> NSS Publications </PUBLISHER>
<PRICE> $30.00</PRICE>
</BOOK>
与所有 XML 文件一样,广告文件需要是一个结构化的文本文件,由明确的标签描述数据。以下是在广告文件中常用的标准 XML 元素:
Element |
Description |
Advertisements |
Encloses the advertisement file. |
Ad |
Delineates separate ad. |
ImageUrl |
将显示的图片的路径。 |
NavigateUrl |
当用户点击广告时将遵循的链接。 |
AlternateText |
如果图片无法显示,将显示的文本代替图片。 |
Keyword |
标识一组广告的关键字。这用于过滤。 |
Impressions |
指示广告将显示的频率的数字。 |
Height |
要显示的图片的高度。 |
Width |
要显示的图片的宽度。 |
除了这些标签以外,还可以包括具有自定义属性的自定义标签。以下代码演示了广告文件 ads.xml:
<Advertisements>
<Ad>
<ImageUrl>rose1.jpg</ImageUrl>
<NavigateUrl>http://www.1800flowers.com</NavigateUrl>
<AlternateText>
Order flowers, roses, gifts and more
</AlternateText>
<Impressions>20</Impressions>
<Keyword>flowers</Keyword>
</Ad>
<Ad>
<ImageUrl>rose2.jpg</ImageUrl>
<NavigateUrl>http://www.babybouquets.com.au</NavigateUrl>
<AlternateText>Order roses and flowers</AlternateText>
<Impressions>20</Impressions>
<Keyword>gifts</Keyword>
</Ad>
<Ad>
<ImageUrl>rose3.jpg</ImageUrl>
<NavigateUrl>http://www.flowers2moscow.com</NavigateUrl>
<AlternateText>Send flowers to Russia</AlternateText>
<Impressions>20</Impressions>
<Keyword>russia</Keyword>
</Ad>
<Ad>
<ImageUrl>rose4.jpg</ImageUrl>
<NavigateUrl>http://www.edibleblooms.com</NavigateUrl>
<AlternateText>Edible Blooms</AlternateText>
<Impressions>20</Impressions>
<Keyword>gifts</Keyword>
</Ad>
</Advertisements>
Properties and Events of the AdRotator Class
AdRotator 类从 WebControl 类派生,并继承了其属性。除了这些属性外,AdRotator 类还有以下属性:
Properties |
Description |
AdvertisementFile |
指向广告文件的路径。 |
AlternateTextFeild |
当提供备选文本时,该字段的元素名称。默认值为 AlternateText。 |
DataMember |
当未使用广告文件时,要绑定的特定数据列表的名称。 |
DataSource |
从哪里检索数据的控件。 |
DataSourceID |
要检索数据的控件 ID。 |
Font |
指定与广告横幅控件关联的字体属性。 |
ImageUrlField |
提供图像 URL 的字段的元素名称。默认值为 ImageUrl。 |
KeywordFilter |
仅用于显示基于关键字的广告。 |
NavigateUrlField |
提供导航 URL 的字段的元素名称。默认值为 NavigateUrl。 |
Target |
显示页面的内容的浏览器窗口或框架。 |
UniqueID |
获取 AdRotator 控件的唯一分层限定标识符。 |
AdRotator 类的重要事件如下:
Events |
Description |
AdCreated |
在控件创建后但页面呈现之前,每个往返服务器都会引发一次。 |
DataBinding |
当服务器控件绑定到数据源时,发生此事件。 |
DataBound |
当服务器控件绑定到数据源后,发生此事件。 |
Disposed |
服务器控件从内存中释放时发生此事件,这是在请求 ASP.NET 页面时的服务器控件生命周期的最后阶段。 |
Init |
初始化服务器控件时发生,这是其生命周期中的第一步。 |
Load |
服务器控件加载到 Page 对象时发生。 |
PreRender |
加载控件对象后,但在呈现前发生。 |
Unload |
当服务器控件从内存中卸载时发生。 |
ASP.NET - Calendars
日历控件是一种功能丰富的 Web 控件,提供以下功能:
-
一次显示一个月
-
选择一天、一周或一个月
-
选择一天的范围
-
逐月移动
-
通过编程控制日期的显示
日历控件的基本语法:
<asp:Calender ID = "Calendar1" runat = "server">
</asp:Calender>
Properties and Events of the Calendar Control
日历控件具有很多属性和事件,您可以使用它们来定制控件的动作和显示。下表提供了日历控件的一些重要属性:
Properties |
Description |
Caption |
获取或设置日历控件的标题。 |
CaptionAlign |
获取或设置标题的对齐方式。 |
CellPadding |
获取或设置数据和单元格边框之间的空格数。 |
CellSpacing |
获取或设置单元格之间的空格。 |
DayHeaderStyle |
获取显示星期的那一节的样式属性。 |
DayNameFormat |
获取或设置星期几的格式。 |
DayStyle |
获取显示月中的日期的样式属性。 |
FirstDayOfWeek |
获取或设置要显示在第一列中的星期几。 |
NextMonthText |
获取或设置下一个月导航控件的文本。默认值为 >。 |
NextPrevFormat |
获取或设置上个月和下个月导航控件的格式。 |
OtherMonthDayStyle |
获取日历控件中不是显示月份的日期的样式属性。 |
PrevMonthText |
获取或设置上个月导航控件的文本。默认值为 <。 |
SelectedDate |
获取或设置选定的日期。 |
SelectedDates |
获取表示所选日期的日期时间对象集合。 |
SelectedDayStyle |
获取所选日期的样式属性。 |
SelectionMode |
获取或设置选择模式,该模式指定用户是能选择单个日期、一个星期还是整个月。 |
SelectMonthText |
获取或设置选择器栏中月份选择元素的文本。 |
SelectorStyle |
获取星期和月份选择器栏的样式属性。 |
SelectWeekText |
获取或设置选择器栏中星期选择元素显示的文本。 |
ShowDayHeader |
获取或设置指示是否显示星期日期标题的值。 |
ShowGridLines |
获取或设置指示是否显示网格线的值。 |
ShowNextPrevMonth |
获取或设置一个值,该值指示是否在标题部分显示下一个月和前一个月导航元素。 |
ShowTitle |
获取或设置一个值,该值指示是否显示标题部分。 |
TitleFormat |
获取或设置标题部分的格式。 |
Titlestyle |
获取日历控件的标题标题的样式属性。 |
TodayDayStyle |
获取日历控件中今天日期的样式属性。 |
TodaysDate |
获取或设置今天日期的值。 |
UseAccessibleHeader |
获取或设置一个值,该值指示是否为日期标题呈现表格头 <th> HTML 元素,而不是表格数据 <td> HTML 元素。 |
VisibleDate |
获取指定要显示的月份的日期。 |
WeekendDayStyle |
获取日历控件中周末日期的样式属性。 |
日历控件具有以下三个最重要的事件,允许开发人员对日历控件进行编程。它们是:
Events |
Description |
SelectionChanged |
当选择一天、一个星期或整个月时触发。 |
DayRender |
在日历控件中的每一个数据单元格里进行渲染时会触发这个事件。 |
VisibleMonthChanged |
此事件会在用户更改月份时触发。 |
Working with the Calendar Control
放置一个没有任何代码文件为基础的基本日历控件到一个站点上,可以给此站点提供一个可用的日历,显示该年的月份和天数。同时,它还允许导航到上一个和下一个月。
日历控件允许用户选择一个单日、一个星期或者整个月。这可以通过 SelectionMode
属性来实现。这个属性有以下值:
Properties |
Description |
Day |
要选择一个单日。 |
DayWeek |
要选择一个单日或一个整个星期。 |
DayWeekMonth |
要选择一个单日、一个星期或整个一个月。 |
None |
Nothing can be selected. |
选择天数的语法:
<asp:Calender ID = "Calendar1" runat = "server" SelectionMode="DayWeekMonth">
</asp:Calender>
当选择模式被设置成 DayWeekMonth
值,将出现一个带有 > 符号的额外列,用于选择星期;另外,天数名称的左边会出现一个 >> 符号,用于选择月份。
Example
以下示例展示了如何选择日期并在一个标签上显示该日期:
内容文件代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="calendardemo._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>
Untitled Page
</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h3> Your Birthday:</h3>
<asp:Calendar ID="Calendar1" runat="server SelectionMode="DayWeekMonth" onselectionchanged="Calendar1_SelectionChanged">
</asp:Calendar>
</div>
<p>Todays date is:
<asp:Label ID="lblday" runat="server"></asp:Label>
</p>
<p>Your Birday is:
<asp:Label ID="lblbday" runat="server"></asp:Label>
</p>
</form>
</body>
</html>
SelectionChanged
事件的事件处理程序:
protected void Calendar1_SelectionChanged(object sender, EventArgs e)
{
lblday.Text = Calendar1.TodaysDate.ToShortDateString();
lblbday.Text = Calendar1.SelectedDate.ToShortDateString();
}
运行该文件,它应该会产生如下输出:
ASP.NET - Multi Views
MultiView 和 View 控件允许您将页面的内容划分为不同的组,一次仅显示一组。每个 View 控件管理一组内容,并且所有 View 控件都保存在 MultiView 控件中。
MultiView 控件负责一次显示一个 View 控件。显示的 View 称为活动视图。
MultiView 控件的语法为:
<asp:MultView ID= "MultiView1" runat= "server">
</asp:MultiView>
View 控件的语法为:
<asp:View ID= "View1" runat= "server">
</asp:View>
但是,View 控件无法独立存在。如果您尝试独立使用它,它将呈现错误。它始终与 MultiView 控件配合使用,如下所示:
<asp:MultView ID= "MultiView1" runat= "server">
<asp:View ID= "View1" runat= "server"> </asp:View>
</asp:MultiView>
Properties of View and MultiView Controls
View 和 MultiView 控件都派生自 Control 类,并且继承其所有属性、方法和事件。View 控件最重要的属性是布尔类型 Visible 属性,它设置视图的可见性。
MultiView 控件具有以下重要属性:
Properties |
Description |
Views |
MultiView 中的视图控件集合。 |
ActiveViewIndex |
表示活动视图的从零开始的索引。如果没有活动视图,则索引为 -1。 |
与 MultiView 控件导航相关的按钮控件的 CommandName 属性与 MultiView 控件的一些相关字段相关联。
例如,如果具有 CommandName 值为 NextView 的按钮控件与多视图导航相关联,则单击该按钮时会自动导航到下一个视图。
下表显示了上述属性的默认命令名:
Properties |
Description |
NextViewCommandName |
NextView |
PreviousViewCommandName |
PrevView |
SwitchViewByIDCommandName |
SwitchViewByID |
SwitchViewByIndexCommandName |
SwitchViewByIndex |
多视图控件的重要方法有:
Methods |
Description |
SetActiveview |
Sets the active view |
GetActiveview |
Retrieves the active view |
每次更改视图时,页面都会回发到服务器,并会引发许多事件。一些重要事件:
Events |
Description |
ActiveViewChanged |
当视图发生更改时引发 |
Activate |
由活动视图引发 |
Deactivate |
由非活动视图引发 |
除了上述属性、方法和事件之外,多视图控件还继承了控件和对象类的成员。
Example
示例页有三个视图。每个视图都有两个按钮,用于在视图中导航。
内容文件代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="multiviewdemo._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>
Untitled Page
</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h2>MultiView and View Controls</h2>
<asp:DropDownList ID="DropDownList1" runat="server"
onselectedindexchanged="DropDownList1_SelectedIndexChanged">
</asp:DropDownList>
<hr />
<asp:MultiView ID="MultiView1" runat="server" ActiveViewIndex="2"
onactiveviewchanged="MultiView1_ActiveViewChanged" >
<asp:View ID="View1" runat="server">
<h3>This is view 1</h3>
<br />
<asp:Button CommandName="NextView" ID="btnnext1"
runat="server" Text = "Go To Next" />
<asp:Button CommandArgument="View3"
CommandName="SwitchViewByID" ID="btnlast" runat="server" Text ="Go To Last" />
</asp:View>
<asp:View ID="View2" runat="server">
<h3>This is view 2</h3>
<asp:Button CommandName="NextView" ID="btnnext2"
runat="server" Text = "Go To Next" />
<asp:Button CommandName="PrevView" ID="btnprevious2"
runat="server" Text = "Go To Previous View" />
</asp:View>
<asp:View ID="View3" runat="server">
<h3> This is view 3</h3>
<br />
<asp:Calendar ID="Calender1" runat="server"></asp:Calendar>
<br />
<asp:Button CommandArgument="0"
CommandName="SwitchViewByIndex" ID="btnfirst" runat="server" Text = "Go To Next" />
<asp:Button CommandName="PrevView" ID="btnprevious"
runat="server" Text = "Go To Previous View" />
</asp:View>
</asp:MultiView>
</div>
</form>
</body>
</html>
注意以下内容:
MultiView.ActiveViewIndex 确定要显示哪个视图。这是页面上唯一呈现的视图。当没有任何视图显示时,ActiveViewIndex 的默认值为 -1。由于示例中将 ActiveViewIndex 定义为 2,因此在执行时显示第三个视图。
ASP.NET - Panel Controls
面板控件用作页面上其他控件的容器。它控制其包含的控件的外观和可见性。它还允许以编程方式生成控件。
面板控件的基本语法如下所示:
<asp:Panel ID= "Panel1" runat = "server">
</asp:Panel>
面板控件衍生自 WebControl 类。因此,它继承了代码中的所有属性、方法和事件。它没有自己的任何方法或事件。但它有自己的以下属性:
Properties |
Description |
BackImageUrl |
面板的背景图像的 URL。 |
DefaultButton |
获取或设置包含在面板控件中的默认按钮的标识符。 |
Direction |
面板中文本的方向。 |
GroupingText |
允许分组文本作为字段。 |
HorizontalAlign |
面板中内容的水平对齐方式。 |
ScrollBars |
指定面板内滚动条的可见性和位置。 |
Wrap |
Allows text wrapping. |
Working with the Panel Control
让我们从一个特定高度和宽度以及边框样式的简单可滚动面板开始。将 ScrollBars 属性设置为两个滚动条,因此将呈现两个滚动条。
源文件为面板标记使用了以下代码:
<asp:Panel ID="Panel1" runat="server" BorderColor="#990000" BorderStyle="Solid"
Borderstyle="width:1px" Height="116px" ScrollBars="Both" style="width:278px">
This is a scrollable panel.
<br />
<br />
<asp:Button ID="btnpanel" runat="server" Text="Button" style="width:82px" />
</asp:Panel>
面板的呈现方式如下:
Example
以下示例演示动态内容生成。用户提供要生成的标签控件和文本框的数量。控件以编程方式生成。
使用属性窗口更改面板的属性。当您在设计视图上选择一个控件时,属性窗口会显示该特定控件的属性并允许您进行更改而不进行输入。
示例源文件如下:
<form id="form1" runat="server">
<div>
<asp:Panel ID="pnldynamic" runat="server" BorderColor="#990000"
BorderStyle="Solid" Borderstyle="width:1px" Height="150px" ScrollBars="Auto" style="width:60%" BackColor="#CCCCFF" Font-Names="Courier" HorizontalAlign="Center">
This panel shows dynamic control generation:
<br />
<br />
</asp:Panel>
</div>
<table style="width: 51%;">
<tr>
<td class="style2">No of Labels:</td>
<td class="style1">
<asp:DropDownList ID="ddllabels" runat="server">
<asp:ListItem>0</asp:ListItem>
<asp:ListItem>1</asp:ListItem>
<asp:ListItem>2</asp:ListItem>
<asp:ListItem>3</asp:ListItem>
<asp:ListItem>4</asp:ListItem>
</asp:DropDownList>
</td>
</tr>
<tr>
<td class="style2"> </td>
<td class="style1"> </td>
</tr>
<tr>
<td class="style2">No of Text Boxes :</td>
<td class="style1">
<asp:DropDownList ID="ddltextbox" runat="server">
<asp:ListItem>0</asp:ListItem>
<asp:ListItem Value="1"></asp:ListItem>
<asp:ListItem>2</asp:ListItem>
<asp:ListItem>3</asp:ListItem>
<asp:ListItem Value="4"></asp:ListItem>
</asp:DropDownList>
</td>
</tr>
<tr>
<td class="style2"> </td>
<td class="style1"> </td>
</tr>
<tr>
<td class="style2">
<asp:CheckBox ID="chkvisible" runat="server"
Text="Make the Panel Visible" />
</td>
<td class="style1">
<asp:Button ID="btnrefresh" runat="server" Text="Refresh Panel"
style="width:129px" />
</td>
</tr>
</table>
</form>
Page_Load 事件背后的代码负责动态生成控件:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//make the panel visible
pnldynamic.Visible = chkvisible.Checked;
//generating the lable controls:
int n = Int32.Parse(ddllabels.SelectedItem.Value);
for (int i = 1; i <= n; i++)
{
Label lbl = new Label();
lbl.Text = "Label" + (i).ToString();
pnldynamic.Controls.Add(lbl);
pnldynamic.Controls.Add(new LiteralControl("<br />"));
}
//generating the text box controls:
int m = Int32.Parse(ddltextbox.SelectedItem.Value);
for (int i = 1; i <= m; i++)
{
TextBox txt = new TextBox();
txt.Text = "Text Box" + (i).ToString();
pnldynamic.Controls.Add(txt);
pnldynamic.Controls.Add(new LiteralControl("<br />"));
}
}
}
执行之后,面板将呈现为:
ASP.NET - Ajax Control
AJAX 代表异步 JavaScript 和 XML。这是一种跨平台技术,可以加快响应时间。 AJAX 服务器控件向页面添加将在浏览器中执行和处理的脚本。
然而,与其他 ASP.NET 服务器控件一样,这些 AJAX 服务器控件也可能具有与之关联的方法和事件处理程序,它们在服务器端处理。
Visual Studio IDE 中的控件工具箱包含一组称为“AJAX 扩展”的控件。
The ScriptManager Control
ScriptManager 控件是最重要的控件,必须在页面上存在才能使其他控件工作。
它具有基本语法:
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
如果从“添加项”对话框创建“启用 Ajax 的站点”或添加“AJAX Web 窗体”,则 Web 窗体自动包含脚本管理器控件。 ScriptManager 控件处理所有服务器端控件的客户端脚本。
The UpdatePanel Control
UpdatePanel 控件是一个容器控件,派生自 Control 类。它充当容器,用于容纳其中的子控件,并且没有自己的接口。当其中的控件触发回发时,UpdatePanel 会进行干预以异步启动回发并仅更新页面的那部分。
例如,如果按钮控件在更新面板内并且被单击,则只会影响更新面板内的控件,页面其他部分的控件不会受到影响。这称为部分回发或异步回发。
Example
在应用程序中添加一个 AJAX Web 窗体。它默认包含脚本管理器控件。插入一个更新面板。在更新面板控件内放置一个按钮控件和一个标签控件。在面板外放置另一组按钮和标签。
设计视图如下所示:
源文件如下:
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server" />
</div>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Button ID="btnpartial" runat="server"
onclick="btnpartial_Click" Text="Partial PostBack"/>
<br />
<br />
<asp:Label ID="lblpartial" runat="server"></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
<p> </p>
<p>Outside the Update Panel</p>
<p>
<asp:Button ID="btntotal" runat="server"
onclick="btntotal_Click" Text="Total PostBack" />
</p>
<asp:Label ID="lbltotal" runat="server"></asp:Label>
</form>
两个按钮控件对事件处理程序具有相同代码:
string time = DateTime.Now.ToLongTimeString();
lblpartial.Text = "Showing time from panel" + time;
lbltotal.Text = "Showing time from outside" + time;
注意,当执行页面时,如果单击总回发按钮,它将同时更新两个标签中的时间,但是如果单击部分回发按钮,它只会更新更新面板内的标签。
一个页面可以包含多个更新面板,每个面板都包含其他控件,如网格,并显示数据的不同部分。
当发生总回发时,更新面板内容默认更新。可以通过更改控件的 UpdateMode 属性更改此默认模式。让我们看看更新面板的其他属性。
Properties of the UpdatePanel Control
下表显示了更新面板控件的属性:
Properties |
Description |
ChildrenAsTriggers |
此属性指示回发是否来自子控件,从而导致更新面板刷新。 |
ContentTemplate |
它是内容模板,定义了呈现更新面板时在更新面板中显示的内容。 |
ContentTemplateContainer |
检索动态创建的模板容器对象,并用于以编程方式添加子控件。 |
IsInPartialRendering |
指示面板是否正在作为部分回发的一部分进行更新。 |
RenderMode |
显示呈现模式。可用模式包括块和内联。 |
UpdateMode |
通过确定某些条件来获取或设置呈现模式。 |
Triggers |
定义集合触发对象,每个对象对应于一个事件,导致面板自动刷新。 |
Methods of the UpdatePanel Control
下表显示了更新面板控件的方法:
Methods |
Description |
CreateContentTemplateContainer |
创建充当子控件容器的控件对象,这些控件定义了 UpdatePanel 控件的内容。 |
CreateControlCollection |
返回 UpdatePanel 控件中包含的所有控件的集合。 |
Initialize |
如果已启用局部页面呈现,则初始化 UpdatePanel 控件触发器集合。 |
Update |
导致 UpdatePanel 控件的内容更新。 |
更新面板的行为取决于 UpdateMode 属性和 ChildrenAsTriggers 属性的值。
UpdateMode |
ChildrenAsTriggers |
Effect |
Always |
False |
Illegal parameters. |
Always |
True |
如果整个页面刷新或其子控件回发,则 UpdatePanel 将刷新。 |
Conditional |
False |
如果整个页面刷新或其外部的触发控件启动刷新,则 UpdatePanel 将刷新。 |
Conditional |
True |
如果整个页面刷新或其子控件回发,或其外部的触发控件启动刷新,则 UpdatePanel 将刷新。 |
The UpdateProgress Control
在更新一个或多个更新面板控件时,UpdateProgress 控件对浏览器提供了一种反馈。例如,当用户登录或在执行某些面向数据库的任务时等待服务器响应时。
它提供“正在加载页面…”之类的视觉确认,指示工作正在进行中。
UpdateProgress 控件的语法如下:
<asp:UpdateProgress ID="UpdateProgress1" runat="server" DynamicLayout="true"
AssociatedUpdatePanelID="UpdatePanel1" >
<ProgressTemplate>
Loading...
</ProgressTemplate>
</asp:UpdateProgress>
上述代码段在 ProgressTemplate 标记内显示一条简单消息。但是,它可以是图像或其他相关控件。UpdateProgress 控件在每次异步回发时都会显示,除非使用 AssociatedUpdatePanelID 属性将其分配给单个更新面板。
Properties of the UpdateProgress Control
下表显示了更新进度控件的属性:
Properties |
Description |
AssociatedUpdatePanelID |
获取并设置与此控件关联的更新面板的 ID。 |
Attributes |
获取或设置 UpdateProgress 控件的层叠样式表 (CSS) 属性。 |
DisplayAfter |
获取和设置在显示进度模板后以毫秒为单位的时间。默认值为 500。 |
DynamicLayout |
指示是否动态呈现进度模板。 |
ProgressTemplate |
指在异步回发中显示的模板,该回发的时间超过 DisplayAfter 时间。 |
The Timer Control
计时器控件用于自动启动回发。这可以通过两种方式来完成:
(1) 设置 UpdatePanel 控件的 Triggers 属性:
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnpanel2" EventName="Click" />
</Triggers>
(2) 将计时器控件直接放在 UpdatePanel 内作为子控件触发器。单个计时器可以作为多个 UpdatePanel 的触发器。
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Always">
<ContentTemplate>
<asp:Timer ID="Timer1" runat="server" Interval="1000">
</asp:Timer>
<asp:Label ID="Label1" runat="server" Height="101px" style="width:304px" >
</asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
ASP.NET - Data Sources
数据源控件与数据绑定控件交互并隐藏了复杂的数据绑定进程。这些是向数据绑定控件提供数据的工具,并支持执行插入、删除、排序和更新等操作。
每个数据源控件都封装了一个特定的数据提供程序——关系数据库、XML 文档或自定义类,并帮助进行以下操作:
-
Managing connection
-
Selecting data
-
管理分页、缓存等展示方面。
-
Manipulating data
ASP.NET 中有许多数据源控件可用于从 SQL Server、ODBC 或 OLE DB 服务器、XML 文件和业务对象访问数据。
根据数据类型,这些控件可以分为两类:
-
Hierarchical data source controls
-
Table-based data source controls
用于分级数据的数据源控件:
-
XMLDataSource - 它允许绑定到 XML 文件和有或没有架构信息的字符串。
-
SiteMapDataSource - 它允许绑定到提供站点地图信息的提供程序。
用于表格数据的数据源控件:
Data source controls |
Description |
SqlDataSource |
它表示与 ADO.NET 数据提供程序的连接,该提供程序返回 SQL 数据,包括可通过 OLEDB 和 ODBC 访问的数据源。 |
ObjectDataSource |
它允许绑定到返回数据的自定义 .Net 业务对象。 |
LinqdataSource |
它允许绑定到 Linq-to-SQL 查询(仅受 ASP.NET 3.5 支持)的结果。 |
AccessDataSource |
它表示与 Microsoft Access 数据库的连接。 |
Data Source Views
数据源视图是 DataSourceView 类的对象。它表示针对不同数据操作(如排序、筛选等)对数据进行自定义的视图。
DataSourceView 类作为所有数据源视图类的基类,而这些类定义了数据源控件的功能。
下表提供了 DataSourceView 类的属性:
Properties |
Description |
CanDelete |
指示是否允许在底层数据源上进行删除。 |
CanInsert |
指示是否允许在底层数据源上进行插入。 |
CanPage |
指示是否允许在底层数据源上进行分页。 |
CanRetrieveTotalRowCount |
指示是否提供总行数信息。 |
CanSort |
指示数据是否可以排序。 |
CanUpdate |
指示是否允许在底层数据源上进行更新。 |
Events |
获取数据源视图的事件处理程序委托列表。 |
Name |
Name of the view. |
下表提供了 DataSourceView 类的作用:
Methods |
Description |
CanExecute |
确定是否可以执行指定命令。 |
ExecuteCommand |
Executes the specific command. |
ExecuteDelete |
对 DataSourceView 对象表示的数据列表执行删除操作。 |
ExecuteInsert |
对 DataSourceView 对象表示的数据列表执行插入操作。 |
ExecuteSelect |
从底层数据存储中获取数据列表。 |
ExecuteUpdate |
对 DataSourceView 对象表示的数据列表执行更新操作。 |
Delete |
对与视图关联的数据执行删除操作。 |
Insert |
对与视图关联的数据执行插入操作。 |
Select |
Returns the queried data. |
Update |
对与视图关联的数据执行更新操作。 |
OnDataSourceViewChanged |
Raises the DataSourceViewChanged event. |
RaiseUnsupportedCapabilitiesError |
通过 RaiseUnsupportedCapabilitiesError 方法调用以比较为 ExecuteSelect 操作请求的功能和视图所支持的功能。 |
The SqlDataSource Control
SqlDataSource 控件表示与关系数据库(如 SQL Server 或 Oracle 数据库)的连接,或通过 OLEDB 或开放式数据库连接 (ODBC) 可访问的数据。通过两个重要属性 ConnectionString 和 ProviderName 与数据建立连接。
以下代码段提供了此控件的基本语法:
<asp:SqlDataSource runat="server" ID="MySqlSource"
ProviderName='<%$ ConnectionStrings:LocalNWind.ProviderName %>'
ConnectionString='<%$ ConnectionStrings:LocalNWind %>'
SelectionCommand= "SELECT * FROM EMPLOYEES" />
<asp:GridView ID="GridView1" runat="server" DataSourceID="MySqlSource" />
对基础数据的各种数据操作的配置取决于数据源控件的各种属性(属性组)。
下表提供了 SqlDataSource 控件的相关属性集,它提供了控件的编程接口:
Property Group |
Description |
DeleteCommand, DeleteParameters, DeleteCommandType |
获取或设置用于删除基础数据中行的 SQL 语句、参数和类型。 |
FilterExpression, FilterParameters |
获取或设置数据筛选字符串和参数。 |
InsertCommand, InsertParameters, InsertCommandType |
获取或设置用于向基础数据库中插入行的 SQL 语句、参数和类型。 |
SelectCommand, SelectParameters, SelectCommandType |
获取或设置用于从基础数据库中检索行的 SQL 语句、参数和类型。 |
SortParameterName |
获取或设置命令存储过程将用于对数据排序的输入参数的名称。 |
UpdateCommand, UpdateParameters, UpdateCommandType |
获取或设置用于更新基础数据存储中的行的 SQL 语句、参数和类型。 |
以下代码片段显示了已启用用于数据处理的数据源控件:
<asp:SqlDataSource runat="server" ID= "MySqlSource"
ProviderName='<%$ ConnectionStrings:LocalNWind.ProviderName %>'
ConnectionString=' <%$ ConnectionStrings:LocalNWind %>'
SelectCommand= "SELECT * FROM EMPLOYEES"
UpdateCommand= "UPDATE EMPLOYEES SET LASTNAME=@lame"
DeleteCommand= "DELETE FROM EMPLOYEES WHERE EMPLOYEEID=@eid"
FilterExpression= "EMPLOYEEID > 10">
.....
.....
</asp:SqlDataSource>
The ObjectDataSource Control
ObjectDataSource 控件使用户定义的类能够将自身方法的输出与数据绑定控件关联。此类的编程接口几乎与 SqlDataSource 控件相同。
以下是有约束业务对象绑定的两个重要方面:
-
可绑定的类应具有默认构造函数,应无状态,并应具有可映射到选择、更新、插入和删除语义的方法。
-
该对象必须一次更新一个项目,不支持批量操作。
让我们直接进入一个示例,使用该控件。Student 类是与对象数据源一起使用的类。此类有三个属性:学生 ID、姓名和城市。它有一个默认构造函数和用于检索数据 GetStudents 方法。
Student 类:
public class Student
{
public int StudentID { get; set; }
public string Name { get; set; }
public string City { get; set; }
public Student()
{ }
public DataSet GetStudents()
{
DataSet ds = new DataSet();
DataTable dt = new DataTable("Students");
dt.Columns.Add("StudentID", typeof(System.Int32));
dt.Columns.Add("StudentName", typeof(System.String));
dt.Columns.Add("StudentCity", typeof(System.String));
dt.Rows.Add(new object[] { 1, "M. H. Kabir", "Calcutta" });
dt.Rows.Add(new object[] { 2, "Ayan J. Sarkar", "Calcutta" });
ds.Tables.Add(dt);
return ds;
}
}
按以下步骤将对象与对象数据源绑定并检索数据:
-
创建一个新网站。
-
通过右键单击解决方案资源管理器中的项目、添加类模板并将上述代码置于其中,为其添加一个类 (Students.cs)。
-
构建解决方案,以便应用程序可以使用对类的引用。
-
在 Web 窗体中放置一个对象数据源控件。
-
通过选择对象来配置数据源。
-
为数据上的不同操作选择一个数据方法。在此示例中,只有一种方法。
-
在页面上放置一个数据绑定控件(如网格视图),并将其底层数据源选择为对象数据源。
-
在此阶段,设计视图应如下所示:
-
运行项目,它从 students 类中检索硬编码元组。
The AccessDataSource Control
AccessDataSource 控件表示与 Access 数据库的连接。它基于 SqlDataSource 控件,并提供了更简单的编程接口。以下代码段提供了数据源的基本语法:
<asp:AccessDataSource ID="AccessDataSource1 runat="server"
DataFile="~/App_Data/ASPDotNetStepByStep.mdb" SelectCommand="SELECT * FROM [DotNetReferences]">
</asp:AccessDataSource>
AccessDataSource 控件在只读模式下打开数据库。但是,它也可用于执行插入、更新或删除操作。这是使用 ADO.NET 命令和参数集合完成的。
对于 ASP.NET 应用程序而言,对 Access 数据库进行更新存在问题,因为 Access 数据库是一个纯文本文件,而 ASP.NET 应用程序的默认帐户可能没有权限写入数据库文件。
ASP.NET - Data Binding
每个 ASP.NET Web 窗体控件均从其父控件类继承 DataBind 方法,它为其提供绑定数据到其至少一个属性的内在功能。这称为 simple data binding 或 inline data binding 。
简单的 data binding 涉及将实现 IEnumerable 界面或 DataSet 和 DataTable 类附加到控件的 DataSource 属性。
另一方面,一些控件可以通过 DataSource 控件将数据记录、列表或列绑定到其结构中。这些控件派生自 BaseDataBoundControl 类。这称为 declarative data binding 。
数据源控件帮助 data bound 控件实现诸如排序、分页和编辑数据集合之类的功能。
BaseDataBoundControl 是一个抽象类,它被另外两个抽象类继承:
-
DataBoundControl
-
HierarchicalDataBoundControl
抽象类 DataBoundControl 又被另外两个抽象类继承:
-
ListControl
-
CompositeDataBoundControl
能够进行简单 data binding 的控件派生自 ListControl 抽象类,这些控件为:
-
BulletedList
-
CheckBoxList
-
DropDownList
-
ListBox
-
RadioButtonList
能够进行声明式数据绑定(更加复杂的数据绑定)的控件派生自抽象类 CompositeDataBoundControl。这些控件为:
-
DetailsView
-
FormView
-
GridView
-
RecordList
Simple Data Binding
简单的数据绑定涉及只读的选择列表。这些控件可以绑定到数据库中的阵列列表或字段。选择列表从数据库或数据源中获取两个值;列表显示一个值,另一个值被认为是对应于显示的值。
让我们举一个小的示例来理解这个概念。创建一个包含项目符号列表和 SqlDataSource 控件的网站。将数据源控件配置为从数据库中检索两个值(我们在这个示例中使用与前一章相同的 DotNetReferences 表)。
为项目符号列表控件选择一个数据源涉及:
-
选择数据源控件
-
选择要显示的字段,称为数据字段
-
选择一个值的字段
在应用程序执行时,检查整个标题列是否绑定到项目符号列表并显示。
Declarative Data Binding
我们在上一个教程中已经使用 GridView 控件使用了声明性数据绑定。其他能够以表格方式显示和操作数据的复合数据绑定控件为 DetailsView、FormView 和 RecordList 控件。
在下一个教程中,我们将研究处理数据库(即、ADO.NET)的技术。
然而,数据绑定涉及以下对象:
-
存储从数据库检索的数据集。
-
数据提供程序,它通过对连接执行命令从数据库检索数据。
-
数据适配器,它发布存储在命令对象中的选择语句;它还能够通过发布插入、删除和更新语句更新数据库中的数据。
数据绑定对象之间的关联:
Example
让我们执行以下步骤:
Step (1) :创建一个新的网站。通过右键单击“解决方案资源管理器”中的解决方案名称并从“添加项目”对话框中选择“类”项,添加名为 booklist 的类。将其命名为 booklist.cs。
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
namespace databinding
{
public class booklist
{
protected String bookname;
protected String authorname;
public booklist(String bname, String aname)
{
this.bookname = bname;
this.authorname = aname;
}
public String Book
{
get
{
return this.bookname;
}
set
{
this.bookname = value;
}
}
public String Author
{
get
{
return this.authorname;
}
set
{
this.authorname = value;
}
}
}
}
Step (2) :在页面上添加四个列表控件(一个列表框控件、一个单选按钮列表、一个复选框列表和一个下拉列表)以及这些列表控件旁边的四个标签。该页面在设计视图中应如下所示:
源文件应该如下所示:
<form id="form1" runat="server">
<div>
<table style="width: 559px">
<tr>
<td style="width: 228px; height: 157px;">
<asp:ListBox ID="ListBox1" runat="server" AutoPostBack="True"
OnSelectedIndexChanged="ListBox1_SelectedIndexChanged">
</asp:ListBox>
</td>
<td style="height: 157px">
<asp:DropDownList ID="DropDownList1" runat="server"
AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
</asp:DropDownList>
</td>
</tr>
<tr>
<td style="width: 228px; height: 40px;">
<asp:Label ID="lbllistbox" runat="server"></asp:Label>
</td>
<td style="height: 40px">
<asp:Label ID="lbldrpdown" runat="server">
</asp:Label>
</td>
</tr>
<tr>
<td style="width: 228px; height: 21px">
</td>
<td style="height: 21px">
</td>
</tr>
<tr>
<td style="width: 228px; height: 21px">
<asp:RadioButtonList ID="RadioButtonList1" runat="server"
AutoPostBack="True" OnSelectedIndexChanged="RadioButtonList1_SelectedIndexChanged">
</asp:RadioButtonList>
</td>
<td style="height: 21px">
<asp:CheckBoxList ID="CheckBoxList1" runat="server"
AutoPostBack="True" OnSelectedIndexChanged="CheckBoxList1_SelectedIndexChanged">
</asp:CheckBoxList>
</td>
</tr>
<tr>
<td style="width: 228px; height: 21px">
<asp:Label ID="lblrdlist" runat="server">
</asp:Label>
</td>
<td style="height: 21px">
<asp:Label ID="lblchklist" runat="server">
</asp:Label>
</td>
</tr>
</table>
</div>
</form>
Step (3) :最后,编写应用程序的下列后台例程:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
IList bklist = createbooklist();
if (!this.IsPostBack)
{
this.ListBox1.DataSource = bklist;
this.ListBox1.DataTextField = "Book";
this.ListBox1.DataValueField = "Author";
this.DropDownList1.DataSource = bklist;
this.DropDownList1.DataTextField = "Book";
this.DropDownList1.DataValueField = "Author";
this.RadioButtonList1.DataSource = bklist;
this.RadioButtonList1.DataTextField = "Book";
this.RadioButtonList1.DataValueField = "Author";
this.CheckBoxList1.DataSource = bklist;
this.CheckBoxList1.DataTextField = "Book";
this.CheckBoxList1.DataValueField = "Author";
this.DataBind();
}
}
protected IList createbooklist()
{
ArrayList allbooks = new ArrayList();
booklist bl;
bl = new booklist("UNIX CONCEPTS", "SUMITABHA DAS");
allbooks.Add(bl);
bl = new booklist("PROGRAMMING IN C", "RICHI KERNIGHAN");
allbooks.Add(bl);
bl = new booklist("DATA STRUCTURE", "TANENBAUM");
allbooks.Add(bl);
bl = new booklist("NETWORKING CONCEPTS", "FOROUZAN");
allbooks.Add(bl);
bl = new booklist("PROGRAMMING IN C++", "B. STROUSTROUP");
allbooks.Add(bl);
bl = new booklist("ADVANCED JAVA", "SUMITABHA DAS");
allbooks.Add(bl);
return allbooks;
}
protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
{
this.lbllistbox.Text = this.ListBox1.SelectedValue;
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
this.lbldrpdown.Text = this.DropDownList1.SelectedValue;
}
protected void RadioButtonList1_SelectedIndexChanged(object sender, EventArgs e)
{
this.lblrdlist.Text = this.RadioButtonList1.SelectedValue;
}
protected void CheckBoxList1_SelectedIndexChanged(object sender, EventArgs e)
{
this.lblchklist.Text = this.CheckBoxList1.SelectedValue;
}
}
注意以下内容:
-
booklist 类有两个属性:bookname 和 authorname。
-
createbooklist 方法是创建一个名为 allbooks 的 booklist 对象数组的用户定义方法。
-
Page_Load 事件处理程序确保创建书籍列表。该列表为 IList 类型,其实现了 IEnumerable 接口,并且能够绑定到列表控件。页面加载事件处理程序将 IList 对象“bklist”绑定到列表控件。bookname 属性将显示,而 authorname 属性被视为该值。
-
在运行页面时,如果用户选择一本书,则其名称将由列表控件选中并显示,而相应的标签将显示作者名称,即所选列表控件索引的相应值。
ASP.NET - Custom Controls
User Controls
用户控件的行为像微型的 ASP.NET 页面或 Web 窗体,可以用做许多其他页面。这些控件源自 System.Web.UI.UserControl 类。这些控件有以下特性:
-
它们拥有 .ascx 扩展名。
-
它们可能不包含任何 <html>、<body> 或 <form> 标签。
-
它们拥有 Control 指令,而不是 Page 指令。
为了理解概念,让我们创建一个简单的用户控件,它将作为网页页脚。要创建并使用用户控件,请执行以下步骤:
-
创建新的 Web 应用程序。
-
在解决方案资源管理器中右键单击项目文件夹,然后选择“添加新项”。
-
从“添加新项”对话框中选择 Web 用户控件,并将其命名为 footer.ascx。最初,footer.ascx 只包含一个控件指令。<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="footer.ascx.cs" Inherits="customcontroldemo.footer" %>
-
向文件添加以下代码:<table> <tr> <td align="center"> Copyright ©2010 TutorialPoints Ltd.</td> </tr> <tr> <td align="center"> Location: Hyderabad, A.P </td> </tr> </table>
若要将用户控件添加到网页中,你必须将 Register 指令以及用户控件实例添加到页面。以下代码显示了内容文件:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="customcontroldemo._Default" %>
<%@ Register Src="~/footer.ascx" TagName="footer" TagPrefix="Tfooter" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>
Untitled Page
</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server"
Text="Welcome to ASP.Net Tutorials "></asp:Label>
<br />
<br />
<asp:Button ID="Button1" runat="server"
onclick="Button1_Click" Text="Copyright Info" />
</div>
<Tfooter:footer ID="footer1" runat="server" />
</form>
</body>
</html>
在执行后,页面会显示页脚,而且此控件可用于网站的所有页面中。
注意以下内容:
(1) Register 指令指定控件的标记名称以及标记前缀。
<%@ Register Src="~/footer.ascx" TagName="footer" TagPrefix="Tfooter" %>
(2) 在页面上添加用户控件时,应当使用以下标记名称和前缀:
<Tfooter:footer ID="footer1" runat="server" />
Custom Controls
自定义控件作为独立程序集进行部署。它们被编译到动态链接库 (DLL) 中,并用作任何其他 ASP.NET 服务器控件。它们可以通过以下方式之一创建:
-
通过从现有控件派生自定义控件
-
通过组合两个或更多现有控件构成本自定义控件。
-
通过从基本控件类派生。
为了理解概念,让我们创建一个自定义控件,它将简单地在浏览器中呈现文本消息。要创建此控件,请执行以下步骤:
创建一个新网站。在解决方案资源管理器中右键单击树顶的解决方案(而不是项目)。
在“新建项目”对话框中,从项目模板中选择 ASP.NET 服务器控件。
上述步骤添加了一个新项目,并为解决方案创建了一个完整的自定义控件,名为 ServerControl1。在此示例中,让我们将项目命名为 CustomControls。为使用此控件,必须将其添加为对网站的引用,然后再在页面上注册它。若要向现有项目添加引用,请右键单击项目(而非解决方案),然后单击“添加引用”。
从“添加引用”对话框的“项目”选项卡中选择 CustomControls 项目。解决方案资源管理器应当显示引用。
要在页面中使用控件,请在 @Page 指令下方添加 Register 指令:
<%@ Register Assembly="CustomControls" Namespace="CustomControls" TagPrefix="ccs" %>
此外,您可以使用控件,它与任何其他控件类似。
<form id="form1" runat="server">
<div>
<ccs:ServerControl1 runat="server"
Text = "I am a Custom Server Control" />
</div>
</form>
执行时,控件的 Text 属性将显示在浏览器中,如下所示:
Working with Custom Controls
在前一个示例中,设置了自定义控件的 Text 属性值。ASP.NET 在创建控件时默认添加了此属性。控件的后端代码显示这一点。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace CustomControls
{
[DefaultProperty("Text")]
[ToolboxData("<{0}:ServerControl1 runat=server></{0}:ServerControl1 >")]
public class ServerControl1 : WebControl
{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
public string Text
{
get
{
String s = (String)ViewState["Text"];
return ((s == null) ? "[" + this.ID + "]" : s);
}
set
{
ViewState["Text"] = value;
}
}
protected override void RenderContents(HtmlTextWriter output)
{
output.Write(Text);
}
}
}
上述代码会自动为自定义控件生成。可以向自定义控件类中添加事件和方法。
Example
让我们扩展名为 SeverControl1 的前一个自定义控件。让我们给它一个名为 checkpalindrome 的方法,它赋予它检查回文的权力。
回文是反转后拼写相同的单词/字面量。例如,Malayalam、madam、saras 等。
扩展自定义控件的代码,如下所示:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace CustomControls
{
[DefaultProperty("Text")]
[ToolboxData("<{0}:ServerControl1 runat=server></{0}:ServerControl1 >")]
public class ServerControl1 : WebControl
{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
public string Text
{
get
{
String s = (String)ViewState["Text"];
return ((s == null) ? "[" + this.ID + "]" : s);
}
set
{
ViewState["Text"] = value;
}
}
protected override void RenderContents(HtmlTextWriter output)
{
if (this.checkpanlindrome())
{
output.Write("This is a palindrome: <br />");
output.Write("<FONT size=5 color=Blue>");
output.Write("<B>");
output.Write(Text);
output.Write("</B>");
output.Write("</FONT>");
}
else
{
output.Write("This is not a palindrome: <br />");
output.Write("<FONT size=5 color=red>");
output.Write("<B>");
output.Write(Text);
output.Write("</B>");
output.Write("</FONT>");
}
}
protected bool checkpanlindrome()
{
if (this.Text != null)
{
String str = this.Text;
String strtoupper = Text.ToUpper();
char[] rev = strtoupper.ToCharArray();
Array.Reverse(rev);
String strrev = new String(rev);
if (strtoupper == strrev)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
}
}
当您更改控件的代码时,必须点击 Build -→ Build Solution 构建解决方案,这样更改才会反映在项目中。向页面添加一个文本框和一个按钮控件,以便用户可以提供文本,在单击按钮时检查它是否是回文。
<form id="form1" runat="server">
<div>
Enter a word:
<br />
<asp:TextBox ID="TextBox1" runat="server" style="width:198px">
</asp:TextBox>
<br />
<br />
<asp:Button ID="Button1" runat="server onclick="Button1_Click"
Text="Check Palindrome" style="width:132px" />
<br />
<br />
<ccs:ServerControl1 ID="ServerControl11" runat="server" Text = "" />
</div>
</form>
按钮的 Click 事件处理程序只将文本框中的文本复制到自定义控件的文本属性。
protected void Button1_Click(object sender, EventArgs e)
{
this.ServerControl11.Text = this.TextBox1.Text;
}
执行时,控件成功检查回文。
注意以下内容:
(1) 当您向自定义控件添加引用时,它将添加到工具箱中,您可以直接从工具箱使用它,就像其他控件一样。
(2) 此处覆盖了自定义控件类的 RenderContents 方法,因为您可以添加自己的方法和事件。
(3) RenderContents 方法采用 HtmlTextWriter 类型的参数,负责在浏览器中呈现。
ASP.NET - Personalization
网站设计为让用户多次访问。个性化允许网站记住用户身份及其它信息详细信息,它向每个用户提供个性化的环境。
ASP.NET 提供个性化网站的服务,以适应特定客户端的口味和偏好。
Understanding Profiles
ASP.NET 个性化服务基于用户配置文件。用户配置文件定义网站所需的关于用户的信息类型。例如,姓名、年龄、地址、出生日期和电话号码。
此信息在应用程序的 web.config 文件中定义,并且 ASP.NET 运行时会读取并使用它。这项工作由个性化提供程序完成。
从用户数据中获取的用户配置文件存储在由 ASP.NET 创建的默认数据库中。您可以创建自己的数据库来存储配置文件。配置文件数据定义存储在配置文件 web.config 中。
Example
我们创建一个示例网站,其中我们希望我们的应用程序记住用户详细信息,如姓名、地址、出生日期等。在 <system.web> 元素中的 web.config 文件中添加配置文件详细信息。
<configuration>
<system.web>
<profile>
<properties>
<add name="Name" type ="String"/>
<add name="Birthday" type ="System.DateTime"/>
<group name="Address">
<add name="Street"/>
<add name="City"/>
<add name="State"/>
<add name="Zipcode"/>
</group>
</properties>
</profile>
</system.web>
</configuration>
当配置文件在 web.config 文件中定义时,可以通过在当前 HttpContext 中找到的 Profile 属性以及通过 page 使用配置文件。
添加文本框以获取如配置文件中所定义的用户输入,并添加一个按钮以提交数据:
更新 Page_load 以显示配置文件信息:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
ProfileCommon pc=this.Profile.GetProfile(Profile.UserName);
if (pc != null)
{
this.txtname.Text = pc.Name;
this.txtaddr.Text = pc.Address.Street;
this.txtcity.Text = pc.Address.City;
this.txtstate.Text = pc.Address.State;
this.txtzip.Text = pc.Address.Zipcode;
this.Calendar1.SelectedDate = pc.Birthday;
}
}
}
}
为提交按钮编写以下处理程序,以便将用户数据保存到配置文件中:
protected void btnsubmit_Click(object sender, EventArgs e)
{
ProfileCommon pc=this.Profile.GetProfile(Profile.UserName);
if (pc != null)
{
pc.Name = this.txtname.Text;
pc.Address.Street = this.txtaddr.Text;
pc.Address.City = this.txtcity.Text;
pc.Address.State = this.txtstate.Text;
pc.Address.Zipcode = this.txtzip.Text;
pc.Birthday = this.Calendar1.SelectedDate;
pc.Save();
}
}
当页面第一次执行时,用户需要输入信息。但是,下一次用户详细信息会自动加载。
Attributes for the <add> Element
除了我们已使用的 name 和 type 属性外,<add> 元素还有其他属性。下表说明了其中一些属性:
Attributes |
Description |
name |
属性的名称。 |
type |
默认类型为字符串,但它允许任何完全限定的类名作为数据类型。 |
serializeAs |
序列化此值时要使用的格式。 |
readOnly |
只读个人资料值无法更改,默认情况下此属性为 false。 |
defaultValue |
个人资料不存在或没有信息时使用的默认值。 |
allowAnonymous |
一个布尔值,指示此属性是否可与匿名个人资料一起使用。 |
Provider |
个人资料提供程序应该用来管理此属性。 |
Anonymous Personalization
匿名个性化允许用户在识别自己之前个性化网站。例如,Amazon.com 允许用户在登录之前将商品添加到购物车中。若要启用此功能,web.config 文件可以配置为:
<anonymousIdentification enabled ="true" cookieName=".ASPXANONYMOUSUSER"
cookieTimeout="120000" cookiePath="/" cookieRequiresSSL="false"
cookieSlidingExpiration="true" cookieprotection="Encryption"
coolieless="UseDeviceProfile"/>
ASP.NET - Error Handling
ASP.NET 中的错误处理包含三个方面:
-
Tracing - 跟踪页面或应用程序级别的程序执行。
-
Error handling - 处理页面或应用程序级别的标准错误或自定义错误。
-
Debugging - 单步执行程序,设置断点来分析代码。
在本章节中,我们将讨论跟踪和错误处理,在本章节中,我们将讨论调试。
要了解这些概念,请创建以下示例应用程序。它有一个标签控件、一个下拉列表和一个链接。下拉列表加载一个包含名言的数组列表,所选的名言会显示在下面的标签中。它还有一个指向不存在链接的超链接。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="errorhandling._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>
Tracing, debugging and error handling
</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="lblheading" runat="server" Text="Tracing, Debuggin and Error Handling">
</asp:Label>
<br />
<br />
<asp:DropDownList ID="ddlquotes" runat="server" AutoPostBack="True"
onselectedindexchanged="ddlquotes_SelectedIndexChanged">
</asp:DropDownList>
<br />
<br />
<asp:Label ID="lblquotes" runat="server">
</asp:Label>
<br />
<br />
<asp:HyperLink ID="HyperLink1" runat="server"
NavigateUrl="mylink.htm">Link to:</asp:HyperLink>
</div>
</form>
</body>
</html>
文件背后的代码:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string[,] quotes =
{
{"Imagination is more important than Knowledge.", "Albert Einsten"},
{"Assume a virtue, if you have it not" "Shakespeare"},
{"A man cannot be comfortable without his own approval", "Mark Twain"},
{"Beware the young doctor and the old barber", "Benjamin Franklin"},
{"Whatever begun in anger ends in shame", "Benjamin Franklin"}
};
for (int i=0; i<quotes.GetLength(0); i++)
ddlquotes.Items.Add(new ListItem(quotes[i,0], quotes[i,1]));
}
}
protected void ddlquotes_SelectedIndexChanged(object sender, EventArgs e)
{
if (ddlquotes.SelectedIndex != -1)
{
lblquotes.Text = String.Format("{0}, Quote: {1}",
ddlquotes.SelectedItem.Text, ddlquotes.SelectedValue);
}
}
}
Tracing
要启用页面级跟踪,需要修改页面指令并添加 Trace 属性,如下所示:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="errorhandling._Default" Trace ="true" %>
现在,当你执行文件时,你将获得跟踪信息:
它在顶部提供以下信息:
-
Session ID
-
Status Code
-
Time of Request
-
Type of Request
-
Request and Response Encoding
每次请求页面时,服务器返回的状态代码,如有错误,将显示错误名称和时间。下表显示了常见的 HTTP 状态代码:
Number |
Description |
Informational (100 - 199) |
100 |
Continue |
101 |
Switching protocols |
Successful (200 - 299) |
200 |
OK |
204 |
No content |
Redirection (300 - 399) |
301 |
Moved permanently |
305 |
Use proxy |
307 |
Temporary redirect |
Client Errors (400 - 499) |
400 |
Bad request |
402 |
Payment required |
404 |
Not found |
408 |
Request timeout |
417 |
Expectation failed |
Server Errors (500 - 599) |
500 |
Internal server error |
503 |
Service unavailable |
505 |
在顶级信息下方,有跟踪日志,提供页面生命周期的详细信息。它提供自页面初始化以来经过的秒数。
下一部分是控件树,它以分层方式列出页面上的所有控件:
最后是会话和应用程序状态汇总、Cookie 和标头集合,后跟所有服务器变量的列表。
跟踪对象允许你在追踪输出中添加自定义信息。它有两种方法来完成此操作:Write 方法和 Warn 方法。
将 Page_Load 事件处理程序更改为检查 Write 方法:
protected void Page_Load(object sender, EventArgs e)
{
Trace.Write("Page Load");
if (!IsPostBack)
{
Trace.Write("Not Post Back, Page Load");
string[,] quotes =
.......................
}
}
运行以观察效果:
要检查 Warn 方法,让我们强制在所选索引更改事件处理程序中输入一些错误代码:
try
{
int a = 0;
int b = 9 / a;
}
catch (Exception e)
{
Trace.Warn("UserAction", "processing 9/a", e);
}
Try-Catch 是一个 C# 编程结构。try 块容纳可能产生错误或可能不产生错误的任何代码,而 catch 块捕获错误。当程序运行时,它会在跟踪日志中发送警告。
应用程序级跟踪适用于网站中的所有页面。它通过在 web.config 文件中添加以下代码行来实现:
<system.web>
<trace enabled="true" />
</system.web>
Error Handling
虽然 ASP.NET 可以检测所有运行时错误,但一些细微的错误可能仍然存在。通过跟踪观察错误是为开发人员准备的,而不是用户。
因此,为了拦截这种事件,可以在应用程序的 web.config 文件中添加错误处理设置。这是应用程序范围的错误处理。例如,可以在 web.config 文件中添加以下行:
<configuration>
<system.web>
<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
</system.web>
<configuration>
<customErrors> 部分具有可能出现的属性:
-
Mode :它启用或禁用自定义错误页面。它有三个可能的值: On :显示自定义页面。 Off :显示 ASP.NET 错误页面(黄色页面) remoteOnly :它向客户端显示自定义错误,并在本地显示 ASP.NET 错误。
-
defaultRedirect :它包含在出现未处理错误时要显示的页面的 URL。
要为不同类型的错误放置不同的自定义错误页面,将使用 <error> 子标记,其中根据错误的状态代码指定不同的错误页面。
要实现页面级别错误处理,可以修改 Page 指令:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="errorhandling._Default" Trace ="true" ErrorPage="PageError.htm" %>
因为 ASP.NET 调试是一个重要主题,因此我们将在下一章单独进行讨论。
ASP.NET - Debugging
调试允许开发人员逐个步骤地查看代码如何工作、变量的值如何更改、如何创建和销毁对象等。
在该网站首次执行时,Visual Studio 将显示一个提示,询问是否应启用它进行调试:
启用调试时,将在 web.config 中显示以下代码行:
<system.web>
<compilation debug="true">
<assemblies>
..............
</assemblies>
</compilation>
</system.web>
Debug 工具栏提供了所有可用于调试的工具:
Breakpoints
断点指定运行时以运行特定代码行,然后停止执行,以便检查代码并执行各种调试作业,例如更改变量的值、逐步执行代码、进出函数和方法等。
若要设置断点,请右键单击代码并选择插入断点。在左边界上会出现一个红点,并且代码行将突出显示,如下所示:
接下来,在执行代码时,您可以观察其行为。
在此阶段,您可以逐步执行代码,观察执行流并且检查变量、属性、对象等的值。
您可通过右键单击断点字形所获取的“属性”菜单修改断点的属性:
位置对话框显示所选代码的文件位置、行号和字符号。条件菜单项允许您输入有效表达式,该表达式将在程序执行到达断点时进行评估:
命中计数菜单项显示一个对话框,该对话框显示断点被执行的次数。
单击下拉列表显示的任意选项将打开一个编辑字段,在此字段中输入目标命中计数。这在代码中分析循环结构时特别有用。
筛选菜单项允许设置筛选器,以指定机器、进程或线程或任意组合,断点将对此生效。
命中时菜单项允许您指定命中断点后执行的操作。
ASP.NET - LINQ
大多数应用程序以数据为中心,但是大多数数据存储库都是关系数据库。多年来,设计人员和开发人员已经基于对象模型设计应用程序。
这些对象负责连接到数据访问组件 - 称为数据访问层 (DAL)。我们在此处需考虑三点:
-
应用程序中所需的所有数据不会存储在同一来源中。该来源可以是关系数据库、某些业务对象、XML 文件或 web 服务。
-
访问内存中对象比访问数据库或 XML 文件中的数据更简单、更经济。
-
访问的数据不会直接使用,但需要对其进行排序、排序、分组、更改等操作。
因此,如果有一种工具可以简化各种数据访问,允许连接来自此类不同数据源的数据并在几行代码中执行标准数据处理操作,那将会有很大帮助。
LINQ 或语言集成查询就是这样一种工具。LINQ 是 .Net Framework 3.5 及其托管语言的一组扩展,它们将查询设置为了一个对象。它定义了一个通用语法和一个编程模型,用于使用通用语言查询不同类型的数据。
关系运算符(如 Select、Project、Join、Group、Partition、Set 运算等)在 LINQ 和 .Net Framework 3.5 中的 C# 和 VB 编译器中实现,支持 LINQ 语法,使得无需使用 ADO.NET 即可处理已配置的数据存储。
例如,使用 C# 中的 LINQ 查询查询 Northwind 数据库中的 Customer 表,代码将是:
var data = from c in dataContext.Customers
where c.Country == "Spain"
select c;
其中:
-
“from” 关键字在逻辑上循环遍历集合的内容。
-
对于集合中的每个对象,都会对带有 “where” 关键字的表达式进行求值。
-
“select” 语句会选择要添加到作为返回值的列表中的已求值对象。
-
“var” 关键字用于变量声明。由于无法已知已返回对象的具体类型,因此,它指示将动态地推断这些信息。
LINQ 查询可以应用到从 IEnumerable<T> 继承的任何承载数据的类,此处 T 是任何数据类型,例如 List<Book>。
我们来看一个示例以理解这个概念。本示例使用以下类:Books.cs
public class Books
{
public string ID {get; set;}
public string Title { get; set; }
public decimal Price { get; set; }
public DateTime DateOfRelease { get; set; }
public static List<Books> GetBooks()
{
List<Books> list = new List<Books>();
list.Add(new Books { ID = "001",
Title = "Programming in C#",
Price = 634.76m,
DateOfRelease = Convert.ToDateTime("2010-02-05") });
list.Add(new Books { ID = "002",
Title = "Learn Java in 30 days",
Price = 250.76m,
DateOfRelease = Convert.ToDateTime("2011-08-15") });
list.Add(new Books { ID = "003",
Title = "Programming in ASP.Net 4.0",
Price = 700.00m,
DateOfRelease = Convert.ToDateTime("2011-02-05") });
list.Add(new Books { ID = "004",
Title = "VB.Net Made Easy",
Price = 500.99m,
DateOfRelease = Convert.ToDateTime("2011-12-31") });
list.Add(new Books { ID = "005",
Title = "Programming in C",
Price = 314.76m,
DateOfRelease = Convert.ToDateTime("2010-02-05") });
list.Add(new Books { ID = "006",
Title = "Programming in C++",
Price = 456.76m,
DateOfRelease = Convert.ToDateTime("2010-02-05") });
list.Add(new Books { ID = "007",
Title = "Datebase Developement",
Price = 1000.76m,
DateOfRelease = Convert.ToDateTime("2010-02-05") });
return list;
}
}
使用此类的网页具有一个简单的标签控件,该控件会显示书籍的标题。Page_Load 事件会创建一个书籍列表,并使用 LINQ 查询返回这些标题:
public partial class simplequery : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
List<Books> books = Books.GetBooks();
var booktitles = from b in books select b.Title;
foreach (var title in booktitles)
lblbooks.Text += String.Format("{0} <br />", title);
}
}
当执行该页时,标签会显示查询结果:
上述 LINQ 表达式:
var booktitles =
from b in books
select b.Title;
等效于以下 SQL 查询:
SELECT Title from Books
LINQ Operators
除了迄今使用的运算符外,还有其他多个运算符,这些运算符能够实现所有查询子句。我们来看一些运算符和子句。
The Join clause
SQL 中的 “join 子句” 用于连接两个数据表,并显示包含两个表中的列的数据集。LINQ 也能够执行此操作。为检查这一点,在上一个项目中添加名为 Saledetails.cs 的另一个类:
public class Salesdetails
{
public int sales { get; set; }
public int pages { get; set; }
public string ID {get; set;}
public static IEnumerable<Salesdetails> getsalesdetails()
{
Salesdetails[] sd =
{
new Salesdetails { ID = "001", pages=678, sales = 110000},
new Salesdetails { ID = "002", pages=789, sales = 60000},
new Salesdetails { ID = "003", pages=456, sales = 40000},
new Salesdetails { ID = "004", pages=900, sales = 80000},
new Salesdetails { ID = "005", pages=456, sales = 90000},
new Salesdetails { ID = "006", pages=870, sales = 50000},
new Salesdetails { ID = "007", pages=675, sales = 40000},
};
return sd.OfType<Salesdetails>();
}
}
将代码添加到 Page_Load 事件处理程序中,以便使用 join 子句查询这两个表:
protected void Page_Load(object sender, EventArgs e)
{
IEnumerable<Books> books = Books.GetBooks();
IEnumerable<Salesdetails> sales = Salesdetails.getsalesdetails();
var booktitles = from b in books join s in sales on b.ID equals s.ID
select new { Name = b.Title, Pages = s.pages };
foreach (var title in booktitles)
lblbooks.Text += String.Format("{0} <br />", title);
}
由此产生如下所示的页面:
The Where clause
“where 子句” 允许向查询添加一些条件筛选器。例如,如果您想要查看那些页数超过 500 的书,应将 Page_Load 事件处理程序更改为:
var booktitles = from b in books join s in sales on b.ID equals s.ID
where s.pages > 500 select new { Name = b.Title, Pages = s.pages };
该查询仅返回页数超过 500 的那些行:
Orderby and Orderbydescending Clauses
这些子句允许对查询结果进行排序。若要按价格对书的标题、页数和价格进行查询和排序,请在 Page_Load 事件处理程序中编写以下代码:
var booktitles = from b in books join s in sales on b.ID equals s.ID
orderby b.Price select new { Name = b.Title, Pages = s.pages, Price = b.Price};
返回的元组为:
The Let clause
let 子句允许定义一个变量,并根据数据值计算的值为其赋值。例如,若要计算上述两笔销售的总销售额,您需要计算:
TotalSale = Price of the Book * Sales
为了实现此目标,添加以下代码段在 Page_Load 事件处理程序中:
let 子句允许定义一个变量,并根据数据值计算的值为其赋值。例如,若要计算上述两笔销售的总销售额,您需要计算:
var booktitles = from b in book join s in sales on b.ID equals s.ID
let totalprofit = (b.Price * s.sales)
select new { Name = b.Title, TotalSale = totalprofit};
产生的查询页面如下所示:
ASP.NET - Security
在网站中实施安全性具有以下方面:
-
Authentication :这是一个确保用户身份和真伪的过程。ASP.NET 允许四种类型的验证:Windows 验证窗体验证护照验证自定义验证
-
Authorization :这是一个为特定用户定义和分配特定角色的过程。
-
Confidentiality :它涉及加密客户端浏览器和 Web 服务器之间的通道。
-
Integrity :它涉及维护数据的完整性。例如,实施数字签名。
Forms-Based Authentication
传统上,基于窗体的验证涉及编辑 web.config 文件并添加带有适当验证代码的登录页面。
可以编辑 web.config 文件,并在此文件中写入以下代码:
<configuration>
<system.web>
<authentication mode="Forms">
<forms loginUrl ="login.aspx"/>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
...
...
</configuration>
上面代码片段中提到的 login.aspx 页面可能具有以下代码作为其背后的文件,其中将用于验证的用户名和密码硬编码到其中。
protected bool authenticate(String uname, String pass)
{
if(uname == "Tom")
{
if(pass == "tom123")
return true;
}
if(uname == "Dick")
{
if(pass == "dick123")
return true;
}
if(uname == "Harry")
{
if(pass == "har123")
return true;
}
return false;
}
public void OnLogin(Object src, EventArgs e)
{
if (authenticate(txtuser.Text, txtpwd.Text))
{
FormsAuthentication.RedirectFromLoginPage(txtuser.Text, chkrem.Checked);
}
else
{
Response.Write("Invalid user name or password");
}
}
请注意,FormsAuthentication 类负责验证过程。
但是,Visual Studio 允许你通过网站管理工具无缝轻松实施用户创建、验证和授权,而无需编写任何代码。此工具允许创建用户和角色。
此外,ASP.NET 提供了现成的登录控件集,其中包含为您执行所有任务的控件。
Implementing Forms-Based Security
要设置基于窗体的身份验证,您需要:
-
一个支持身份验证过程的用户数据库
-
使用该数据库的网站
-
User accounts
-
Roles
-
用户和组活动的限制
-
一个默认页面,用于显示用户的登录状态和其他信息。
-
一个登录页面,允许用户登录、找回密码或更改密码
要创建用户,请执行以下步骤:
Step (1) :选择网站 → ASP.NET 配置以打开 Web 应用程序管理工具。
Step (2) :单击安全选项卡。
Step (3) :通过选择“来自 Internet”单选按钮,将身份验证类型选择为“基于窗体的身份验证”。
Step (4) :单击“创建用户”链接来创建一些用户。如果您已创建角色,您可以在此阶段将角色分配给用户。
Step (5) :创建一个网站并添加以下页面:
-
Welcome.aspx
-
Login.aspx
-
CreateAccount.aspx
-
PasswordRecovery.aspx
-
ChangePassword.aspx
Step (6) :从工具箱的登录部分在 Welcome.aspx 上放置 LoginStatus 控件。它有两种模板:LoggedIn 和 LoggedOut。
在 LoggedOut 模板中,控件有一个登录链接;在 LoggedIn 模板中,控件有一个注销链接。您可以在“属性”窗口中更改控件的登录和注销文本属性。
Step (7) :在工具箱中将 LoginView 控件放置在 LoginStatus 控件的下方。在这里,您可以放置文本和其他控件(超链接、按钮等),这些控件根据用户是否登录而显示。
此控件有两种视图模板:匿名模板和已登录模板。选择每个视图并为用户编写一些要显示的文本。文本应放置在标记为红色的区域。
Step (8) :应用程序的用户由开发人员创建。您可能希望允许访问者创建用户帐户。为此,在 LoginView 控件下方添加一个链接,该链接应指向 CreateAccount.aspx 页面。
Step (9) :在创建帐户页面上放置一个 CreateUserWizard 控件。将该控件的 ContinueDestinationPageUrl 属性设置为 Welcome.aspx。
Step (10) :创建登录页。在该页面放置一个登录控件。LoginStatus 控件将自动链接到 Login.aspx。若要更改此默认设置,请在 web.config 文件中进行以下更改。
例如,如果您想将登录页命名为 signup.aspx,请将以下几行添加到 web.config 的 <authentication> 部分:
<configuration>
<system.web>
<authentication mode="Forms">
<forms loginUrl ="signup.aspx" defaultUrl = “Welcome.aspx†/>
</authentication>
</system.web>
</configuration>
Step (11) :用户经常忘记密码。PasswordRecovery 控件可以帮助用户获取对帐户的访问权限。选择登录控件。打开其智能标记,然后单击“转换为模板”。
自定义控件的用户界面以在登录按钮下面放置一个超链接控件,该控件应链接到 PassWordRecovery.aspx。
Step (12) :在密码恢复页面放置一个 PasswordRecovery 控件。此控件需要电子邮件服务器将密码发送给用户。
Step (13) :在 Welcome.aspx 中的 LoginView 控件的 LoggedIn 模板中创建指向 ChangePassword.aspx 页面的链接。
Step (14) :在更改密码页面放置一个 ChangePassword 控件。此控件也有两个视图。
现在运行应用程序并观察各个安全操作。
若要创建角色,请返回 Web 应用程序管理工具并单击“安全”选项卡。单击“创建角色”,并为应用程序创建一些角色。
单击“管理用户”链接,并将角色分配给用户。
IIS Authentication: SSL
安全套接字层 (SSL) 是一种用于确保安全连接的协议。如果已启用 SSL,浏览器将加密发送到服务器的所有数据,并解密从服务器传来的所有数据。与此同时,服务器会对传到浏览器以及从浏览器传来的所有数据进行加解密。
安全连接的 URL 以 HTTPS 而非 HTTP 开头。使用安全连接的浏览器会显示一个小锁。当浏览器尝试通过使用 SSL 的安全连接首次与服务器通信时,服务器通过发送其数字证书来对其自身进行认证。
若要使用 SSL,您需要从受信任的证书颁发机构 (CA) 购买数字安全证书,并将其安装在 Web 服务器中。以下是一些受信任且信誉良好的证书颁发机构:
-
www.verisign.com
-
www.geotrust.com
-
www.thawte.com
SSL 已内置在所有主流浏览器和服务器中。若要启用 SSL,您需要安装数字证书。各个数字证书的强度根据加密过程中生成密钥的长度而异。长度越长,证书也就越安全,因此连接也越安全。
Strength |
Description |
40 bit |
受大多数浏览器支持,但易于破解。 |
56 bit |
Stronger than 40-bit. |
128 bit |
极难破解,但并非所有浏览器都支持它。 |
ASP.NET - Data Caching
What is Caching?
缓存是用来将经常使用的数据/信息存储在内存中的技术,这样,下一次需要相同的数据/信息时,可以从内存中直接检索数据/信息,而不需要由应用程序生成它。
缓存对于提升 ASP.NET 的性能非常重要,因为页面和控件在这里会被动态生成。这对于数据相关事务尤为重要,因为这些事务对于响应时间来说开销很大。
缓存将经常使用的数据放在诸如计算机随机存取内存的快速访问媒体中。ASP.NET 运行时包含称为缓存的 CLR 对象键值映射。这与应用程序同驻,并且可以通过 HttpContext 和 System.Web.UI.Page 获得。
在某些方面,缓存类似于存储状态对象。但是,状态对象中存储信息是确定性的,换句话说,您可以依赖存储在此处的数据,并且数据的缓存是不确定性的。
在以下情况下数据将不可用:
-
If its lifetime expires,
-
如果应用程序释放其内存,
-
如果由于某些原因未发生缓存。
您可以使用索引器访问缓存中的项目,并且可以控制缓存中对象的生存期,以及设置缓存对象及其物理源之间的链接。
Caching in ASP.Net
ASP.NET 提供以下不同类型的缓存:
-
Output Caching : 输出缓存会存储最终渲染的 HTML 页面或发送至客户端的页面的部分的副本。当下一个客户端请求此页面时,将发送页面的缓存副本,而不是重新生成页面,从而节省时间。
-
Data Caching : 数据缓存表示将数据源中的数据缓存起来。只要缓存未过期,请求的数据就会从缓存中获得。当缓存过期时,将由数据源获取新鲜数据,并且缓存将重新填充。
-
Object Caching : 对象缓存是指缓存页面上的对象,例如数据绑定控件。缓存数据存储在服务器内存中。
-
Class Caching :在首次运行时,网页或 Web 服务会编译为程序集中的一个页面类。然后该程序集将缓存在服务器中。下次对页面或服务进行请求时,将引用缓存的程序集。当源代码发生更改时,CLR 将重新编译程序集。
-
Configuration Caching :应用程序范围内的配置信息存储在配置文件中。配置缓存将配置信息存储在服务器内存中。
在本教程中,我们将考虑输出缓存、数据缓存和对象缓存。
Output Caching
呈现页面可能涉及一些复杂的过程,例如数据库访问、呈现复杂控件等。输出缓存通过将数据缓存在内存中来绕过服务器的往返行程。甚至可以缓存整个页面。
OutputCache 指示负责输出缓存。它启用输出缓存并对其行为提供了一定的控制。
OutputCache 指示的语法:
<%@ OutputCache Duration="15" VaryByParam="None" %>
将此指示置于页面指示之下。这会指示环境缓存页面 15 秒。对于页面加载的以下事件处理程序,可帮助测试页面是否确实已缓存。
protected void Page_Load(object sender, EventArgs e)
{
Thread.Sleep(10000);
Response.Write("This page was generated and cache at:" +
DateTime.Now.ToString());
}
Thread.Sleep() 方法会停止进程线程一段时间。在此示例中,线程会停止 10 秒,因此首次加载页面时,需要 10 秒的时间。不过,下次刷新页面时无需任何时间,因为页面可以直接从缓存中检索,无需加载。
OutputCache 指示具有以下特性,有助于控制输出缓存的行为:
Attribute |
Values |
Description |
DiskCacheable |
true/false |
指定可以将输出写入基于磁盘的缓存。 |
NoStore |
true/false |
指定是否要发送“禁止存储”缓存控制标头。 |
CacheProfile |
String name |
一个缓存配置文件的名称(将存储在 web.config 中)。 |
VaryByParam |
None * Param- name |
以分号分隔的字符串列表,指定 GET 请求中的查询字符串值或 POST 请求中的变量。 |
VaryByHeader |
* Header names |
以分号分隔的字符串列表,指定客户端可能提交的标头。 |
VaryByCustom |
Browser Custom string |
指示 ASP.NET 根据浏览器名称和版本或自定义字符串来改变输出缓存。 |
Location |
Any Client Downstream Server None |
Any:页面可以在任何位置进行缓存。Client:缓存在浏览器中的内容。Downstream:缓存在下游和服务器中的内容。Server:仅在服务器上保存缓存在内容。None:禁用缓存。 |
Duration |
Number |
页面或控件缓存的秒数。 |
让我们在上一个示例中添加一个文本框和一个按钮,并为按钮添加此事件处理程序。
protected void btnmagic_Click(object sender, EventArgs e)
{
Response.Write("<br><br>");
Response.Write("<h2> Hello, " + this.txtname.Text + "</h2>");
}
更改 OutputCache 指令:
<%@ OutputCache Duration="60" VaryByParam="txtname" %>
当程序执行时,ASP.NET 会根据文本框中的名称缓存页面。
Data Caching
数据缓存的主要方面是缓存数据源控件。我们已经讨论过,数据源控件表示数据源中的数据,例如数据库或 XML 文件。这些控件源自抽象类 DataSourceControl,并具有以下用于实现缓存的继承属性:
-
CacheDuration - 它设置数据源将缓存数据的秒数。
-
CacheExpirationPolicy - 它在缓存中的数据过期时定义缓存行为。
-
CacheKeyDependency - 它标识控件的键,这些键会在内容从缓存中移除时自动使缓存的内容过期。
-
EnableCaching - 它指定是否缓存数据。
Example
要演示数据缓存,请创建一个新网站并在其中添加一个新 Web 窗体。添加一个 SqlDataSource 控件,该控件使用数据访问教程中已经使用的数据库连接。
对于此示例,向页面添加一个标签,该标签将显示页面的响应时间。
<asp:Label ID="lbltime" runat="server"></asp:Label>
除了标签以外,内容页面与数据访问教程中的相同。添加一个页面加载事件的事件处理程序:
protected void Page_Load(object sender, EventArgs e)
{
lbltime.Text = String.Format("Page posted at: {0}", DateTime.Now.ToLongTimeString());
}
设计好的页面应如下所示:
第一次执行页面时,没有出现不同的情况,标签显示,每当你刷新页面时,页面都会重新加载,并且标签上显示的时间也会随之更改。
接下来,将数据源控件的 EnableCaching 属性设置为“true”,并将 Cacheduration 属性设置为“60”。这将实现缓存,并且缓存将在每 60 秒到期。
时间戳会随着每次刷新而更改,但是如果你在此 60 秒内更改了表中的数据,则在缓存过期之前不会显示。
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:
ASPDotNetStepByStepConnectionString %>"
ProviderName="<%$ ConnectionStrings:
ASPDotNetStepByStepConnectionString.ProviderName %>"
SelectCommand="SELECT * FROM [DotNetReferences]"
EnableCaching="true" CacheDuration = "60">
</asp:SqlDataSource>
Object Caching
对象缓存比其他缓存技术提供了更多的灵活性。你可以使用对象缓存来将任意对象放在缓存中。对象可以是任何类型 - 数据类型、Web 控件、类、数据集对象,等等。简单地通过分配一个新键名,就可以将该项添加到缓存中,如下所示:
Cache["key"] = item;
ASP.NET 也提供了用于向缓存插入对象的 Insert() 方法。此方法有四个重载版本。我们看一下它们:
Overload |
Description |
Cache.Insert((key, value); |
使用默认优先级和过期时间将一项插入到缓存中,并附带键名和值。 |
Cache.Insert(key, value, dependencies); |
使用键、值、默认优先级、过期时间和一个 CacheDependency 名称将一项插入到缓存,该名称链接到其他文件或项,以便当这些文件或项发生更改时,缓存项将不再有效。 |
Cache.Insert(key, value, dependencies, absoluteExpiration, slidingExpiration); |
这表示过期策略以及上述问题。 |
Cache.Insert(键, 值, 依赖项, 绝对过期时间, 滑动过期时间, 优先级, 删除后回调); |
这与参数一起也允许您为缓存项设置优先级,以及在删除项目时需要调用的方法的委托。 |
滑动过期时间用于在缓存项一段时间未使用时将其从缓存中删除。以下代码段使用滑动过期时间存储项,该过期时间为 10 分钟,并且没有依赖项。
Cache.Insert("my_item", obj, null, DateTime.MaxValue, TimeSpan.FromMinutes(10));
Example
只创建一个包含按钮和标签的页面。在页面加载事件中编写以下代码:
protected void Page_Load(object sender, EventArgs e)
{
if (this.IsPostBack)
{
lblinfo.Text += "Page Posted Back.<br/>";
}
else
{
lblinfo.Text += "page Created.<br/>";
}
if (Cache["testitem"] == null)
{
lblinfo.Text += "Creating test item.<br/>";
DateTime testItem = DateTime.Now;
lblinfo.Text += "Storing test item in cache ";
lblinfo.Text += "for 30 seconds.<br/>";
Cache.Insert("testitem", testItem, null,
DateTime.Now.AddSeconds(30), TimeSpan.Zero);
}
else
{
lblinfo.Text += "Retrieving test item.<br/>";
DateTime testItem = (DateTime)Cache["testitem"];
lblinfo.Text += "Test item is: " + testItem.ToString();
lblinfo.Text += "<br/>";
}
lblinfo.Text += "<br/>";
}
当页面第一次加载时,其提示:
Page Created.
Creating test item.
Storing test item in cache for 30 seconds.
如果您在 30 秒内再次单击按钮,页面会返回,但标签控件会从缓存中获取其信息,如下所示:
Page Posted Back.
Retrieving test item.
Test item is: 14-07-2010 01:25:04
ASP.NET - Web Services
Web 服务是基于 Web 的功能,它使用 Web 协议以供 Web 应用程序使用。开发 Web 服务有三个方面:
-
Creating the web service
-
Creating a proxy
-
Consuming the web service
Creating a Web Service
Web 服务是一项 Web 应用程序,它基本上是一个类,该类由可供其他应用程序使用的方法组成。它还遵循代码分离架构,例如 ASP.NET 网页,尽管它没有用户界面。
为了理解此概念,让我们创建一个 Web 服务以提供股票价格信息。客户端可以根据股票代码查询股票的名称和价格。为了使此示例更简单,我们将值硬编码到二维数组中。此 Web 服务有三种方法:
-
A default HelloWorld method
-
A GetName Method
-
A GetPrice Method
执行以下步骤以创建 Web 服务:
Step (1) : 在 Visual Studio 中选择 File → New → Web Site,然后选择 ASP.NET Web Service。
Step (2) : 在该项目的 App_Code 目录中创建名为 Service.asmx 的 Web 服务文件及其背后的代码文件 Service.cs。
Step (3) : 将文件名称更改为 StockService.asmx 和 StockService.cs。
Step (4) : .asmx 文件中仅有一个 WebService 指令:
<%@ WebService Language="C#" CodeBehind="~/App_Code/StockService.cs"
Class="StockService" %>
Step (5) : 打开 StockService.cs 文件,其中生成的基本代码是 Hello World 服务。默认 Web 服务背后的代码文件如下所示:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
namespace StockService
{
// <summary>
// Summary description for Service1
// <summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
// To allow this Web Service to be called from script,
// using ASP.NET AJAX, uncomment the following line.
// [System.Web.Script.Services.ScriptService]
public class Service1 : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
}
}
Step (6) : 更改背后的代码以添加股票代码、名称和价格的二维字符串数组和两个获取股票信息的 Web 方法。
using System;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script,
// using ASP.NET AJAX, uncomment the following line.
// [System.Web.Script.Services.ScriptService]
public class StockService : System.Web.Services.WebService
{
public StockService () {
//Uncomment the following if using designed components
//InitializeComponent();
}
string[,] stocks =
{
{"RELIND", "Reliance Industries", "1060.15"},
{"ICICI", "ICICI Bank", "911.55"},
{"JSW", "JSW Steel", "1201.25"},
{"WIPRO", "Wipro Limited", "1194.65"},
{"SATYAM", "Satyam Computers", "91.10"}
};
[WebMethod]
public string HelloWorld() {
return "Hello World";
}
[WebMethod]
public double GetPrice(string symbol)
{
//it takes the symbol as parameter and returns price
for (int i = 0; i < stocks.GetLength(0); i++)
{
if (String.Compare(symbol, stocks[i, 0], true) == 0)
return Convert.ToDouble(stocks[i, 2]);
}
return 0;
}
[WebMethod]
public string GetName(string symbol)
{
// It takes the symbol as parameter and
// returns name of the stock
for (int i = 0; i < stocks.GetLength(0); i++)
{
if (String.Compare(symbol, stocks[i, 0], true) == 0)
return stocks[i, 1];
}
return "Stock Not Found";
}
}
Step (7) : 运行 Web 服务应用程序会提供一个 Web 服务测试页,允许测试服务方法。
Step (8) : 单击方法名称,并检查它是否正常运行。
Step (9) : 为了测试 GetName 方法,提供一个硬编码的股票代码,它会返回股票名称
Consuming the Web Service
要使用 Web 服务,请在同一解决方案下创建一个 Web 站点。这可以通过在 Solution Explorer 中右键单击 Solution 名称来完成。调用 Web 服务的 Web 页应包含一个标签控件,以显示返回的结果,并且两个按钮控件,分别用于回发和调用服务。
Web 应用程序的内容文件如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="wsclient._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>
Untitled Page
</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h3>Using the Stock Service</h3>
<br />
<br />
<asp:Label ID="lblmessage" runat="server"></asp:Label>
<br />
<br />
<asp:Button ID="btnpostback" runat="server" onclick="Button1_Click"
Text="Post Back" style="width:132px" />
<asp:Button ID="btnservice" runat="server
onclick="btnservice_Click" Text="Get Stock" style="width:99px" />
</div>
</form>
</body>
</html>
Web 应用程序背后的代码文件如下:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
//this is the proxy
using localhost;
namespace wsclient
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
lblmessage.Text = "First Loading Time: " + DateTime.Now.ToLongTimeString
}
else
{
lblmessage.Text = "PostBack at: " + DateTime.Now.ToLongTimeString();
}
}
protected void btnservice_Click(object sender, EventArgs e)
{
StockService proxy = new StockService();
lblmessage.Text = String.Format("Current SATYAM Price:{0}",
proxy.GetPrice("SATYAM").ToString());
}
}
}
Creating the Proxy
代理是 Web 服务代码的替身。在使用 Web 服务之前,必须创建一个代理。该代理会注册到客户端应用程序中。然后,客户端应用程序会进行对 Web 服务的调用,就像在使用本地方法一样。
代理接收调用,将其包装成适当的格式,作为 SOAP 请求发送给服务器。SOAP 代表简单对象访问协议。该协议用于交换 Web 服务数据。
当服务器将 SOAP 包裹返回给客户端时,代理将对其进行解码,并将其显示给客户端应用程序。
在使用 btnservice_Click 调用 Web 服务之前,应向应用程序添加 Web 引用。这将透明地创建一个代理类,该类由 btnservice_Click 事件使用。
protected void btnservice_Click(object sender, EventArgs e)
{
StockService proxy = new StockService();
lblmessage.Text = String.Format("Current SATYAM Price: {0}",
proxy.GetPrice("SATYAM").ToString());
}
执行以下步骤来创建代理:
Step (1) : 在 Solution Explorer 中右键单击 Web 应用程序项,然后单击“Add Web Reference”。
Step (2) : 选择“Web Services in this solution”。它会返回 StockService 引用。
Step (3) : 单击该服务会打开测试 Web 页。默认情况下,创建的代理名为“localhost”,您可以重命名它。单击“Add Reference”以将该代理添加到客户端应用程序。
在代码文件中通过添加以下内容,以包含代理:
using localhost;
ASP.NET - Multi Threading
线程定义为程序执行路径。每个线程定义一个独特的控制流程。如果您的应用程序包含复杂且耗时的操作,如数据库访问或一些密集 I/O 操作,那么通常通过每个线程执行特定任务来设置不同的执行路径或线程非常有用。
线程是轻量级进程。现代操作系统中实现并发编程的一个常见示例就是线程的使用。使用线程可以节省 CPU 周期并且提高应用程序的效率。
到目前为止,我们编译的程序是其中单个线程作为应用程序的运行实例运行单个进程。但是,通过该方式,应用程序可以一次执行一项任务。为了同时执行多个任务,它可以细分为更小的线程。
在 .Net 中,通过 'System.Threading' 命名空间处理线程。创建 System.Threading.Thread 类型的变量允许您创建一个新线程以开始使用。它允许您在程序中创建和访问各个线程。
Creating Thread
通过创建一个 Thread 对象,为其构造函数提供 ThreadStart 引用来创建线程。
ThreadStart childthreat = new ThreadStart(childthreadcall);
Thread Life Cycle
线程的生命周期从创建System.Threading.Thread类的对象时开始,并在线程终止或完成执行时结束。
以下是线程生命周期中的各个状态:
-
The Unstarted State :这是创建线程实例的情况,但未调用 Start 方法。
-
The Ready State :这是线程准备执行并等待 CPU 周期的状况。
-
The Not Runnable State :当:调用了 Sleep 方法时调用了 Wait 方法时I/O 操作阻塞时线程不可运行
-
The Dead State :这是线程完成执行或已中止的情况。
Thread Priority
Thread 类别的 Priority 属性指定一个线程相对于另一个线程的优先级。.Net 运行时选择具有最高优先级的就绪线程。
优先级可以分为:
-
Above normal
-
Below normal
-
Highest
-
Lowest
-
Normal
一旦创建线程,其优先级使用线程类的 Priority 属性进行设置。
NewThread.Priority = ThreadPriority.Highest;
Thread Properties & Methods
Thread 类具有以下重要属性:
Property |
Description |
CurrentContext |
获取线程正在执行的当前上下问。 |
CurrentCulture |
获取或设置当前线程的语言环境。 |
CurrentPrinciple |
获取或设置角色安全性的线程当前主体。 |
CurrentThread |
获取当前运行的线程。 |
CurrentUICulture |
获取或设置 Resource Manager 使用以在运行时查找特定于区域性的资源的当前区域性。 |
ExecutionContext |
获取包含有关当前线程各种上下文的信息的 ExecutionContext 对象。 |
IsAlive |
获取指示当前线程执行状态的值。 |
IsBackground |
获取或设置指示线程是否是后台线程的值。 |
IsThreadPoolThread |
获取指示线程是否属于托管线程池的值。 |
ManagedThreadId |
获取指示当前托管的线程的唯一标识符。 |
Name |
获取或设置线程的名称。 |
Priority |
获取或设置指示线程调度优先级的值。 |
ThreadState |
获取包含当前线程状态的值。 |
Thread 类有以下重要方法
Methods |
Description |
Abort |
在调用该方法的线程中引发 ThreadAbortException,以开始终止线程的过程。调用此方法通常会终止该线程。 |
AllocateDataSlot |
在所有线程上配置一个未命名的 data slot。为了提升性能,请使用标记了 ThreadStaticAttribute 特性的字段。 |
AllocateNamedDataSlot |
在所有线程上配置一个命名的 data slot。为了提升性能,请使用标记了 ThreadStaticAttribute 特性的字段。 |
BeginCriticalRegion |
通知主机,执行将进入该段代码区域,在这种代码区域中,线程中止或未处理的异常的影响可能危及应用程序域中的其他任务。 |
BeginThreadAffinity |
通知主机,托管代码将执行依赖于当前物理操作系统线程标识的指令。 |
EndCriticalRegion |
通知主机,执行将进入该段代码区域,在这种代码区域中,线程中止或未处理的异常的影响仅限于当前任务。 |
EndThreadAffinity |
通知主机,托管代码已完成执行依赖于当前物理操作系统线程标识的指令。 |
FreeNamedDataSlot |
消除进程中所有线程之间名称与 slot 之间的关联。为了提升性能,请使用标记了 ThreadStaticAttribute 特性的字段。 |
GetData |
在当前线程的当前域中,从当前线程的指定 slot 中检索值。为了提升性能,请使用标记了 ThreadStaticAttribute 特性的字段。 |
GetDomain |
返回当前线程正在运行的当前域。 |
GetDomainID |
返回一个唯一的应用程序域标识符。 |
GetNamedDataSlot |
查找已命名的 data 插槽。为了获得更好的性能,改为使用标记有 ThreadStaticAttribute 特性的字段。 |
Interrupt |
中断处于 WaitSleepJoin 线程状态的线程。 |
Join |
阻塞调用线程,直至一个线程终止,同时继续执行标准的 COM 和 SendMessage pump。此方法有不同的重载形式。 |
MemoryBarrier |
按以下方式同步内存访问:执行当前线程的处理器不能重新排序指令,以便在调用 MemoryBarrier 之前的内存访问在调用 MemoryBarrier 之后的内存访问之后执行。 |
ResetAbort |
取消对当前线程请求的已中止的请求。 |
SetData |
为当前正在运行的线程的当前域设定当前线程指定插槽中的数据。为获得更好的性能,改为使用标记有 ThreadStaticAttribute 特性的字段。 |
Start |
Starts a thread. |
Sleep |
使线程暂停一段 timespan。 |
SpinWait |
使线程等待由 iterations 参数定义的次数。 |
VolatileRead() |
读取字段的值。值是计算机中任何处理器最后写入的值,无论处理器数目或处理器缓存的状态如何。此方法有不同的重载形式。 |
VolatileWrite() |
立即向字段写入一个值,以便计算机中的所有处理器都可见该值。此方法有不同的重载形式。 |
Yield |
使调用线程向在当前处理器上准备好运行的另一个线程提交执行。操作系统选择要提交的线程。 |
Example
以下示例说明了 Thread 类的用途。页面有一个标签控件可用于显示来自子线程的消息。使用 Response.Write() 方法直接显示来自主程序的消息。因此,它们显示在页面的顶部。
源文件如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
Inherits="threaddemo._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>
Untitled Page
</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h3>Thread Example</h3>
</div>
<asp:Label ID="lblmessage" runat="server" Text="Label">
</asp:Label>
</form>
</body>
</html>
文件背后的代码如下:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Threading;
namespace threaddemo
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ThreadStart childthreat = new ThreadStart(childthreadcall);
Response.Write("Child Thread Started <br/>");
Thread child = new Thread(childthreat);
child.Start();
Response.Write("Main sleeping for 2 seconds.......<br/>");
Thread.Sleep(2000);
Response.Write("<br/>Main aborting child thread<br/>");
child.Abort();
}
public void childthreadcall()
{
try{
lblmessage.Text = "<br />Child thread started <br/>";
lblmessage.Text += "Child Thread: Coiunting to 10";
for( int i =0; i<10; i++)
{
Thread.Sleep(500);
lblmessage.Text += "<br/> in Child thread </br>";
}
lblmessage.Text += "<br/> child thread finished";
}
catch(ThreadAbortException e)
{
lblmessage.Text += "<br /> child thread - exception";
}
finally{
lblmessage.Text += "<br /> child thread - unable to catch the exception";
}
}
}
}
ASP.NET - Configuration
ASP.NET 应用程序的行为受配置文件中不同设置的影响:
-
machine.config
-
web.config
machine.config 文件包含所有支持设置的默认值和特定于计算机的值。机器设置由系统管理员控制,应用程序通常无权访问此文件。
但是,应用程序可以通过在其根文件夹中创建 web.config 文件来替代默认值。 web.config 文件是 machine.config 文件的一个子集。
如果应用程序包含子目录,则可以为每个文件夹定义一个 web.config 文件。每个配置文件的范围以自上而下的分层方式确定。
任何 web.config 文件在本地都可以扩展、限制或替代上层定义的任何设置。
Visual Studio 为 Web 服务教程中使用的每个示例项目生成一个默认 web.config 文件。应用程序可以在没有 web.config 文件的情况下执行,但是您无法在没有 web.config 文件的情况下调试应用程序。
下图显示 Web 服务教程中用于示例的 Solution Explorer:
在此应用程序中,有对应两个项目的两个 web.config 文件,即 Web 服务和调用 Web 服务的 Web 站点。
web.config 文件的根节点是 configuration 元素。此元素中的信息分为两个主要区域:配置节处理程序声明区域和配置节设置区域。
以下代码段显示配置文件的基本语法:
<configuration>
<!-- Configuration section-handler declaration area. -->
<configSections>
<section name="section1" type="section1Handler" />
<section name="section2" type="section2Handler" />
</configSections>
<!-- Configuration section settings area. -->
<section1>
<s1Setting1 attribute1="attr1" />
</section1>
<section2>
<s2Setting1 attribute1="attr1" />
</section2>
<system.web>
<authentication mode="Windows" />
</system.web>
</configuration>
Configuration Section Handler declarations
配置节处理程序包含在 <configSections> 标签内。每个配置处理程序指定文件中包含的配置节的名称,该节提供了一些配置数据。它具有以下基本语法:
<configSections>
<section />
<sectionGroup />
<remove />
<clear/>
</configSections>
它具有以下元素:
-
Clear - 删除所有对继承节和节组的引用。
-
Remove - 删除对继承节和节组的引用。
-
Section - 定义配置节处理程序和配置元素之间的关联。
-
Section group - 定义了配置节处理程序与配置节之间的关联。
Application Settings
应用程序设置允许存储用于只读访问的应用范围的名称值对。例如,你可以定义如下自定义应用程序设置:
<configuration>
<appSettings>
<add key="Application Name" value="MyApplication" />
</appSettings>
</configuration>
例如,你还可以存储一本书的名称及其 ISBN 号:
<configuration>
<appSettings>
<add key="appISBN" value="0-273-68726-3" />
<add key="appBook" value="Corporate Finance" />
</appSettings>
</configuration>
Connection Strings
连接字符串显示了网站可用的数据库连接字符串。例如:
<connectionStrings>
<add name="ASPDotNetStepByStepConnectionString"
connectionString="Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=E:\\projects\datacaching\ /
datacaching\App_Data\ASPDotNetStepByStep.mdb"
providerName="System.Data.OleDb" />
<add name="booksConnectionString"
connectionString="Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=C:\ \databinding\App_Data\books.mdb"
providerName="System.Data.OleDb" />
</connectionStrings>
System.Web Element
system.web 元素指定 ASP.NET 配置节的根元素,并包含配置 ASP.NET Web 应用程序和控制应用程序行为的配置元素。
它包含大多数在一般应用程序中需要调整的配置元素。该元素的基本语法如下所示:
<system.web>
<anonymousIdentification>
<authentication>
<authorization>
<browserCaps>
<caching>
<clientTarget>
<compilation>
<customErrors>
<deployment>
<deviceFilters>
<globalization>
<healthMonitoring>
<hostingEnvironment>
<httpCookies>
<httpHandlers>
<httpModules>
<httpRuntime>
<identity>
<machineKey>
<membership>
<mobileControls>
<pages>
<processModel>
<profile>
<roleManager>
<securityPolicy>
<sessionPageState>
<sessionState>
<siteMap>
<trace>
<trust>
<urlMappings>
<webControls>
<webParts>
<webServices>
<xhtmlConformance>
</system.web>
下表简要介绍 system.web 元素部分常见子元素:
Authentication
它配置身份验证支持。基本语法如下所示:
<authentication mode="[Windows|Forms|Passport|None]">
<forms>...</forms>
<passport/>
</authentication>
Caching
配置缓存设置。语法如下所示:
<caching>
<cache>...</cache>
<outputCache>...</outputCache>
<outputCacheSettings>...</outputCacheSettings>
<sqlCacheDependency>...</sqlCacheDependency>
</caching>
CustomErrors
定义自定义错误消息。基本语法如下所示:
<customErrors defaultRedirect="url" mode="On|Off|RemoteOnly">
<error. . ./>
</customErrors>
HostingEnvironment
定义用于托管环境的配置设置。基本语法如下:
<hostingEnvironment idleTimeout="HH:MM:SS" shadowCopyBinAssemblies="true|false"
shutdownTimeout="number" urlMetadataSlidingExpiration="HH:MM:SS" />
Identity
配置应用程序标识。基本语法如下所示:
<identity impersonate="true|false" userName="domain\username"
password="<secure password>"/>
MachineKey
配置用于加密和解密 Forms 身份验证 cookie 数据的密钥。
它还允许配置一个验证密钥,用于对视图状态数据和 Forms 身份验证票证执行消息身份验证检查。基本语法如下:
<machineKey validationKey="AutoGenerate,IsolateApps" [String]
decryptionKey="AutoGenerate,IsolateApps" [String]
validation="HMACSHA256" [SHA1 | MD5 | 3DES | AES | HMACSHA256 |
HMACSHA384 | HMACSHA512 | alg:algorithm_name]
decryption="Auto" [Auto | DES | 3DES | AES | alg:algorithm_name]
/>
Membership
配置用于管理和验证用户帐户的参数。基本语法如下:
<membership defaultProvider="provider name"
userIsOnlineTimeWindow="number of minutes" hashAlgorithmType="SHA1">
<providers>...</providers>
</membership>
Pages
提供特定于页面的配置。基本语法如下:
<pages asyncTimeout="number" autoEventWireup="[True|False]"
buffer="[True|False]" clientIDMode="[AutoID|Predictable|Static]"
compilationMode="[Always|Auto|Never]"
controlRenderingCompatibilityVersion="[3.5|4.0]"
enableEventValidation="[True|False]"
enableSessionState="[True|False|ReadOnly]"
enableViewState="[True|False]"
enableViewStateMac="[True|False]"
maintainScrollPositionOnPostBack="[True|False]"
masterPageFile="file path"
maxPageStateFieldLength="number"
pageBaseType="typename, assembly"
pageParserFilterType="string"
smartNavigation="[True|False]"
styleSheetTheme="string"
theme="string"
userControlBaseType="typename"
validateRequest="[True|False]"
viewStateEncryptionMode="[Always|Auto|Never]" >
<controls>...</controls>
<namespaces>...</namespaces>
<tagMapping>...</tagMapping>
<ignoreDeviceFilters>...</ignoreDeviceFilters>
</pages>
Profile
它配置用户配置文件参数。基本语法为:
<profile enabled="true|false" inherits="fully qualified type reference"
automaticSaveEnabled="true|false" defaultProvider="provider name">
<properties>...</properties>
<providers>...</providers>
</profile>
RoleManager
它配置用户角色设置。基本语法为:
<roleManager cacheRolesInCookie="true|false" cookieName="name"
cookiePath="/" cookieProtection="All|Encryption|Validation|None"
cookieRequireSSL="true|false " cookieSlidingExpiration="true|false "
cookieTimeout="number of minutes" createPersistentCookie="true|false"
defaultProvider="provider name" domain="cookie domain">
enabled="true|false"
maxCachedResults="maximum number of role names cached"
<providers>...</providers>
</roleManager>
ASP.NET - Deployment
ASP.NET 部署分为两大类:
-
Local deployment :在这种情况下,整个应用程序都包含在一个虚拟目录中,并且所有内容和程序集都包含在其中,并且可用于应用程序。
-
Global deployment :在这种情况下,所有在服务器上运行的应用程序都可以使用这些程序集。
有不同的技术可用于部署,但是我们将讨论以下最常见且最简单的部署方式:
-
XCOPY deployment
-
Copying a Website
-
创建安装项目
XCOPY Deployment
XCOPY 部署是指将所有文件递归复制到目标计算机上的目标文件夹中。您可以使用任何常用的技术:
-
FTP transfer
-
使用在远程站点上提供复制功能的服务器管理工具
-
MSI installer application
XCOPY 部署仅将应用程序文件复制到生产服务器,并在其中设置一个虚拟目录。您需要使用 Internet 信息管理器 Microsoft Management Console(MMC 插件)设置一个虚拟目录。
Copying a Website
可以在 Visual Studio中找到“复制网站”选项。它可以在“网站”→“复制网站”菜单选项中找到。该菜单项允许将当前网站复制到其他本地或远程位置。它是一种集成 FTP 工具。
使用该选项,您可以连接到目标位置,选择所需的复制模式:
-
Overwrite
-
Source to Target Files
-
同步源项目和目标项目
然后开始物理复制文件。与 XCOPY 部署不同,此部署流程在 Visual Studio 环境中完成。但是,上述两种部署方法存在以下问题:
-
您传递了源代码。
-
没有针对这些文件的预编译和相关的错误检查。
-
初始页面加载将很慢。
Creating a Setup Project
使用此方法,您可以使用 Windows Installer 并打包您的 Web 应用程序,以使其准备好部署在生产服务器上。Visual Studio 允许您构建部署包。让我们在现有项目之一(比如数据绑定项目)上测试一下。
打开项目并执行以下步骤:
Step (1) :选择“文件”→“添加”→“新项目”,同时突出显示解决方案资源管理器中的网站根目录。
Step (2) :在“其他项目类型”下选择“设置和部署”。选择设置向导。
Step (3) :选择默认位置可确保设置项目位于网站根目录下的特定文件夹中。单击“确定”以获取向导的第一个闪屏。
Step (4) :选择项目类型。选择“为 Web 应用程序创建设置”。
Step (5) :接下来,第三个屏幕将要求从解决方案中的所有项目中选择项目输出。选中“来自……的内容文件”旁边的复选框。
Step (6) :第四个屏幕允许包括其他文件,如 ReadMe。但是,在我们的情况下没有这样的文件。单击“完成”。
Step (7) :最后一个屏幕会显示设置项目的设置摘要。
Step (8) :设置项目已添加到解决方案资源管理器中,而主设计窗口显示文件系统编辑器。
Step (9) :下一步是构建安装项目。在解决方案资源管理器中右键单击项目名称,然后选择“生成”。
Step (10) :构建完成后,您在输出窗口中会收到以下消息:
构建过程创建了两个文件:
-
Setup.exe
-
Setup-databinding.msi
您需要将这些文件复制到服务器上。双击安装文件,以在本地计算机上安装 .msi 文件的内容。