ASP.NET 系列_05_编程指南(一)

关于 ASP.NET 编程指南

ASP.NET 编程指南

ASP.NET 是一个由 Microsoft 开发和送入市场的网页应用程序框架,它允许程序员构建动态网站。

它也允许你使用功能齐全的程序设计语言比如 C# 或者 VB.NET 来简单构建网页应用程序。

本指南包含了所有初学者将需要使用的 ASP.NET 的基本元素。

适用人群

本指南已为初学者准备好来帮助他们理解基本的 ASP.NET 编程。

在读完这个指南后你将发现自己处于 ASP.NET 编程中的中等专业知识水平,你可以从那将自己带入下一个等级。

学习前提

在进行本指南之前,你应该有一个基本的有关 .NET 编程语言的理解。

我们将使用 ASP.NET 网页应用程序框架来开发基于网页的应用程序,

如果你有其它的网页技术比如 HTML,CSS,AJAX 等,那将会很好。

版本信息

书中演示代码基于以下版本:

框架 版本信息 IDE
.Net Framework 3.5 Visual Studio 2008

ASP.NET 简介

简介

ASP.NET 是一个 web 开发平台,它提供编程模型、软件基础程序以及多种服务来帮助开发者搭建健壮的网络应用程序。

ASP.NET 工作于 HTTP 协议之上,并使用 HTTP 命令和政策来建立浏览器到用户之间双向的交流与合作。

ASP.NET 是 Microsoft.NET 平台的一部分。

ASP.NET 应用程序是编译后的代码,运行在 .Net framework 中,利用可扩展和可重用的组件和对象编写的。

ASP.NET 应用程序编码可以用以下语言编写:

  • C#
  • Visual Basic.Net
  • Jscript
  • J#

ASP.NET 用于产生互动的、通过互联网数据驱动的 web 应用程序。

它由大量的控件组成,例如:文本框,按钮,组装标签,构形,以及操控编码来创建 HTML 页面。

ASP.NET web 表单模型

ASP.NET web 表单延伸了交互作用对 web 应用程序的事件驱动模型。

浏览器提交给 web 服务器一个 web 表单,然后服务器返回一个完整的标记页面或 HTML 页面作为回应。

所有客户端用户活动转发到服务器进行有状态的处理。服务器处理客户端动作的输出并触发反馈。

现在,HTTP 是一种无状态协议。ASP.NET 框架帮助储存有关应用程序状态的信息,由以下组成:

  • 页状态
  • 会话状态

页状态是客户端状态,例如:在 web 表单中不同输入领域的内容。会话状态是由用户浏览和使用的不同页面中获得的集合信息,例如:整体会话状态。为了更清楚地了解这个概念,我们拿购物手推车作为例子。

用户在购物手推车中添加项目。项目是在一个页面中所选,叫做项目页面,而项目这个集合的总数和价格就会在不同的页面所显示,叫做购物车页面。只有 HTTP 是不能记录来自不同页面的信息。ASP.NET 会话状态以及服务器基础设施通过一个会话记录全球所收集的信息。

ASP.NET 在生成 ASP.NET 运行时间编码的时候,ASP.NET 运行时间通过页面请求在服务器终端送去或拿回页面状态,并且与隐藏领域内的服务端组件状态合并。

ASP.NET 用这个方法,服务器会意识到整体应用程序状态并以双层的连接方式进行操作。

ASP.NET 组件模型

ASP.NET组件模型提供了 ASP.NET 页面的不同的组成部件。基本上它是一个对象模型,描述为:

  • 几乎所有的 HTML 元素或标签,例如<form><input>
  • 服务器控件,帮助开发复杂的用户界面。例如:日历控件或者网络视图控件。

ASP.NET 是一项技术,工作于 .Net 框架,包括所有与网络相关的功能。.

NET 框架由一个面向对象的等级组成。

一个 ASP.NET 的 web 应用是由页面组成。

当一个用户请求一个 ASP.NET 页面,IIS 委派页面到 ASP.NET 的运行时系统。

ASP.NET 运行时把 .aspx 页面转化成为一个类的实例,继承了 .Net 框架的基本类页面。因此,每一个 ASP.NET 页面是一个对象,并且其所有组件如服务器端控件也是对象。

.Net Framework 3.5 的组件

在进入到下一个关于 Visual Studio.Net 的部分,我们先来浏览一下 .Net Framework 3.5 的不同组件。

以下表格描述了.Net Framework 3.5 的组件和它们所执行的工作:

组件及描述
(1)通用语言 运行环境  或者 CLR 
它执行内存管理、异常处理、调试、安全检查、线程执行、代码执行、代码安全、验证和编译。由 CLR 直接管理的代码被称为管理代码。但通过管理代码被编译,编译器将源代码转化到一个 CPU 独立的中介语言(IL)代码。实时(JIT)编译器将 IL 代码编译成源代码,特定于 CPU。
(2).Net Framework 类库 
它包含一个有可重复使用类型的巨大的库。类、接口、结构、和枚举值,它们统称为类型。
(3)通用语言规范 
它包含对于 .NET所支持的语言和集成语言实现的规范。
(4)通用类型系统 
它提供了对于在运行时声明、使用和管理类型和跨语言交流的指导。

(5)元数据和程序集 
元数据是描述程序的二进制信息,或者储存在一个可执行文件内(PE),或者储存在内存里。

程序集是一个逻辑单元,由程序集清单、元数据类型、IL代码、和一组资源,比如图片文件组成。

(6)Windows 窗体 
Windows 窗体包括在应用程序中展示的任何窗口的图形表示。
(7)ASP.NET 和 ASP.NET AJAX 
ASP.NET 是 web 开发模型,AJAX 是对于 ASP.NET 开发和执行 AJAX 功能的一个延伸。ASP.NET AJAX 包括组件,可以允许开发者更新网页上的数据,并且不用对页面完整地重新下载。
(8)ADO.NET 
它是与数据和数据库工作相关的技术。它为数据源提供通道,例如:SQL 服务器、OLE DB、XML 等等。ADO.NET 允许连接源数据进行检索、操作及数据更新。
(9)Windows工作流基础(WF) 
它帮助构建在 Windows 中以工作流为基础的应用程序。它包括活动、工作流运行时、工作流设计和规则引擎。
(10)Windows 描述基础 
它提供了一个对于用户界面和业务逻辑之间的分离。它通过使用文档、媒体、两维和三维图形、动画等等,从而帮助开发具有极强的视觉冲击力的界面。
(11)Windows 交流基础(WCF) 
它是用于构建和执行连接系统的技术。
(12)Windows CardSpace 
它为网络上访问资源和分享私人信息提供安全保障。
(13)LINQ 
它赋予 .NET 语言数据查询功能,利用一个类似于传统查询语言 SQL 的句法。

ASP.NET 环境设置

环境设置

ASP.NET 在 HTTP 的顶部提供了一个抽象层,即应用程序所构建的地方。它提供了高层次的实体,例如一个面向对象的范例中的类和组件。

构建 ASP.NET 应用程序的关键开发工具及前端是 Visual Studio。本教程中,我们主要讲 Visual Studio 2008。

Visual Studio 是一个整合的开发环境,用于编写,编译和调试代码。它为构建 ASP.NET web 应用程序、web 服务、桌面应用程序和移动应用程序提供了一组完整的开发工具。

Visual Studio IDE

新项目窗口允许从可用模板中选择一个应用程序模板。

image

当你打开一个新的网站,ASP.NET 提供启动文件夹和网站的文件,包括站点中的第一个 web 表单的两个文件。

名称为 Default.aspx 的文件包括 HTML 和 asp 代码,可以定义表单,名称为 Default.aspx.cs(为 C# 编码)的文件或者名称为 Default.aspx.vb(为 VB 编码)的文件包含你所选择的语言的代码,并且此代码为一个表单中所执行的动作负责。

在 Visual Studio IDE 中的初始窗口是 Web Forms Designer 窗口。其他支持的窗口有工具箱、解决方案资源管理器以及内容窗口。设计师设计一个 web 表单,在表单上添加代码进行控制,根据你所需使用代码编辑程序。

使用视图和窗口

你可以用以下方式使用窗口:

  • 把 Web 表单设计器从一个视图改变到另一个视图,点击 Design 或者源按钮。
  • 要关闭一个窗口,点击右上角的关闭按钮,重新显示的话,从视图菜单中选择。
  • 要隐藏一个窗口,点击自动隐藏按钮。窗口就会变成一个标签。再次显示的话,再次点击自动隐藏按钮。
  • 要改变窗口的大小,拖拽窗口即可。

image

在你的网站中添加文件夹和文件

当创造了一个新的 web 表单,Visual Studio 自动为表单生成启动 HTML,并且在 web 表单设计器上显示出源视图。解决方案资源管理器被用于添加其他任何文件,文件夹或者在 web 站点的现有项目。

  • 要增加一个标准的文件夹,右键点击你将要在解决方案管理器中添加的项目或文件夹,选择新文件夹。
  • 要增加一个 ASP.NET 文件夹,右键点击在解决方案管理器中的项目,在列表中选择文件夹。
  • 要在站点中添加一个现有项,右键点击你将要在解决方案管理器中添加的项目,在对话窗口中选择。

项目和解决方案

一个典型的 ASP.NET 应用程序由许多的项目组成:web 内容文件(.aspx),源文件(.cs 文件),程序集(.dll 和 .exe 文件),数据源文件(.mgd 文件),引用,图标,用户控件和其他杂项文件和文件夹。所有组成网址的这些文件包含在一个解决方案中。

当创造了一个新的网站,.VB2008 自动创造了解决方案,并且在解决方案管理器中显示。

解决方案可能包含一个或多个项目。一个项目包含内容文件,源文件,以及其他文件比如说数据源和图片文件。一般来说,一个项目的内容可以编译成一个程序集作为一个可执行文件(.exe)或者一个动态链接库(.dll)文件

一般来说一个项目包含以下内容文件:

  • 页面文件(.aspx)
  • 用户控件(.ascx)
  • Web 服务器(.asmx)
  • 主版页(.master)
  • 网站导航(.sitemap)
  • 网站配置文件(.config)

建立和运行项目

你可以执行一个应用程序,通过:

  • 选择启动
  • 选择启动而不从调试菜单中调试
  • 按 F5
  • Ctrl-F5

程序构建的基本思路是 .exe 或 .dll 文件从 Build 菜单中选择一个命令而生成。

ASP.NET 生命周期

生命周期

ASP.NET 生命周期指定如何:

  • ASP.NET 处理页面生成动态输出
  • 应用程序及其页面进行实例化和处理
  • ASP.NET 动态编译页面

ASP.NET 生命周期可以被分为两组:

  • 应用程序生命周期
  • 页面生命周期

ASP.NET 应用程序生命周期

应用程序生命周期有以下阶段:

  • 用户请求访问应用程序的资源,即一个页面。浏览器发送此请求到 web 服务器。
  • 一个统一管道接收第一个请求,并发生以下事件:
    • 一个 ApplicationManager 类的对象创建。
    • 一个 HostingEnvironment 类的对象创建从而提供信息资源。
  • 创建响应对象。应用程序对象如 HttpContext,HttpRequest 和 HttpResponse 被创建并初始化。
  • 一个 HttpApplication 对象的实例被创建并被分配到请求。
  • 请求由 HttpApplication 类所处理。不同的事件引发此类处理请求。

ASP.NET 页面生命周期

当请求一个页面时,页面被加载到服务器内存,然后处理并送达到浏览器中。然后再从内存中卸载。在这些步骤中的每一步,方法和事件都是可用的,可以根据应用程序所需进行改写。换言之,你可以编写自己的代码从而去置换缺省代码。

页面类创建了页面上所有控件的等级树。页面上所有的组件,除了指令,其余都是控件树的一部分。你可以通过在页面指令上添加 trace = "true" 来看到控制树。我们会覆盖页面指令,然后在 'directives' 和 'event handling' 下追踪。

页面生命周期阶段为:

  • 初始化
  • 页面控件实例化
  • 状态恢复和维护
  • 事件处理代码的执行
  • 页面显示

理解页面周期帮助我们编写代码从而使一些具体的事情可以在页面生命周期中任何阶段发生。它同样帮助编写自定义控件并且在合适的时间将其初始化,利用视图状态下的数据填充其属性,并且运行控件行为的代码。

以下是一个 ASP.NET 页面的不同阶段:

  • 页面请求 - 当 ASP.NET 得到一个页面请求,它决定是否解析和编译页面,或者会有一个页面的缓存版本;相应地进行回应。
  • 页面生命周期的开启 - 在这个阶段,设置请求和回应对象。如果是一个旧的请求或者是回发的,页面 IsPostBack 属性设置为正确。页面 ULCulture 属性同样也被设置。
  • 页面初始化 - 在此阶段,页面上的控件通过设置 UniqueID 属性被分配到独特的 ID 并应用主题。对于一个新的请求,加载回发数据并且控件属性被重新储存到视图状态下的值。
  • 页面加载 - 在此阶段,设置控件属性,使用视图状态和控件状态值。
  • 验证 - 调用验证控件的校验方法并成功执行,页面的 IsValid 属性设置为 true。
  • 回发事件处理 - 如果请求是一个回发(旧请求),相关事件处理程序被调用。
  • 页面显示 - 在此阶段,页面的视图状态和所有控件被保存。页面为每一个控件调用显示方法,并且呈现的输出被写入页面响应属性中的 OutputStream 类。
  • 卸载 - 显示过的页面被送达客户端以及页面属性,例如响应和请求,被卸载并全部清除完毕。

ASP.NET 页面生命周期事件

在页面生命周期的每一阶段,页面引发一些时间,会被编码。一个事件处理程序基本上是一个函数或子程序,绑定到事件,使用声明式如 OnClick 属性或处理。

以下是页面生命周期事件:

  • PreInit - PreInit 是页面生命周期的第一个事件。它检查 IsPostBack 属性并决定页面是否是回发。它设置主题及主版页,创建动态控件,并且获取和设置值配置文件属性值。此事件可通过重载 OnPreInit 方法或者创建一个 Page_PreInit 处理程序进行处置。
  • Init - Init 事件初始化控件属性,并且建立控件树。此事件可通过重载 OnInit 方法或者创建一个 Page_Init处理程序进行处置。
  • InitComplete - InitComplete 事件允许对视图状态的跟踪。所有的控件开启视图状态下的跟踪。
  • LoadViewState - LoadViewState 事件允许加载视图状态信息到控件中。
  • LoadPostData - 在此阶段期间,对所有由 \ 标签定义的输入字段的内容进行处理。
  • PreLoad - PreLoad 在回发数据加载在控件中之前发生。此事件可以通过重载 OnPreLoad 方法或者创建一个 Pre_Load 处理程序进行处置。
  • Load - Load 事件被页面最先引发,然后递归地引发所有子控件。控件树中的控件就被创建好了。此事件可通过重载 OnLoad 方法或者创建一个 Page_Load 处理程序来进行处置。
  • LoadComplete - 加载进程完成,控件事件处理程序运行,页面验证发生。此事件可通过重载 OnLoad 方法或者创建一个 Page_LoadComplete 处理程序来进行处置。
  • PreRender - PreRender 事件就在输出显示之前发生。通过处理此事件,页面和控件可以在输出显示之前执行任何更新。
  • PreRenderComplete - 当 PreRender 事件为所有子控件被循环引发,此事件确保了显示前阶段的完成。
  • SaveStateComplete - 页面控件状态被保存。个性化、控件状态以及视图状态信息被保存。
  • UnLoad - UnLoad 阶段是页面生命周期的最后一个阶段。它为所有控件循环引发 UnLoad 事件,最后为页面自身引发。最终完成清理和释放所有资源和引用,比如数据库连接。此事件可通过调整 OnLoad 方法或者创建一个 Page_UnLoad 处理程序来进行处置。

ASP.NET 实例

实例

ASP.NET 页面是由大量的服务器控件以及 HTML 控件、文本和图像组成的。页面的敏感数据和页面上的不同控件状态被储存在隐藏字段中,组成了页面请求的配置指令。

ASP.NET 运行时控制一个页面实例和其状态的关联。一个 ASP.NET 页面是一个页面的对象或者从之继承而来。

页面上所有的控件同样也是从一个父类控件继承而来的相关控件类的对象。当一个页面运行时,对象页面的一个实例就随其内容控件一起被创建。

一个 ASP.NET 页面同样也是储存在 .aspx 延伸的服务器端文件。

它在本质上是模块化的,并且可被分成以下几个核心部分:

  • 网页指令
  • 编码区段
  • 页面布局

页面指令

页面指令为页面设置运行环境。@Page 指令定义了使用 ASP.NET 页面解析器和编译器的特殊页面属性。页面指令指定应该如何处理页面,并指定对页面需要采取的假设。

它允许导入命名空间、加载程序集和注册新的控件,包括自定义标记名称和命名空间前缀。

编码区段

编码区段为页面和控件即其他所需功能提供处理程序。我们提到,ASP.NET 遵从对象模型。现在,当一些事件在用户界面发生,这些对象会激发事件,比如说一个用户点击了一个按钮或者移动了光标。这些事件需要往复的这类响应是在事件处理程序功能里编码的。事件处理程序除了绑定到空间上的功能就没什么了。

编码区段或者文件后的编码提供了对于所有这些事件处理程序的路线,以及其他开发者使用的功能。页面代码可以预编译和以二进制汇编的形式进行部署。

页面布局

页面布局提供了页面的界面。它包含服务器控件、文本和内联的 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。从浏览器中打开文件然后执行,它就会生成以下结果:

image

使用 Visual Studio IDE

让我们用 Visual Studio IDE 展开同样的例子。你可以直接拖拽控件到设计视图,而不用输入代码。

image

内容文件会自动生成。你只需添加的是 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>

通过右键点击设计视图来执行此示例,并且从弹出菜单中选择 ‘View in Browser’。这将生成以下结果:

image

ASP.NET 事件处理

事件处理

本节为你介绍 ASP.NET 事件处理。

事件是一个动作或发生的事,如鼠标单击、按键、鼠标移动,或任何系统生成的通知。一个进程通过事件进行沟通。例如,中断是系统生成的事件。当事件发生,应用程序也能够回应和管理。

ASP.NET 上的事件在用户机器上引发,在服务器上处理。例如,一个用户点击了在浏览器中显示的一个按钮。一个点击事件被引发。浏览器通过把它发送给服务器从而处理这个客户端事件。

服务器有一个子程序来描述当事件被引发时该做什么;这个被称为事件处理程序。因此,当事件信息被传递给服务器,它会检查点击事件是否与事件处理程序有关联。如果有关联的话,事件处理程序就会被执行。

事件参数

ASP.NET 事件处理程序一般采用两个参数并返回空。第一个参数代表了对象激发事件,第二个参数是事件参数。

一个事件的一般句法是:

private void EventName (object sender, EventArgs e);

应用程序和会话事件

最重要的应用程序事件是:

  • Application_Start - 当开启应用程序或者网页时被引发。
  • Application_End - 当停止应用程序或者网页时被引发。

同样的,最常使用的会话事件是:

  • Session_Start – 当用户最开始从应用程序上请求一个页面被引发。
  • Session_End – 当会话结束后被引发。

页面和控件事件

常见的页面和控件事件有:

  • DataBinding – 当一个控件绑定到一个数据源时被引发。
  • Disposed – 当释放页面或者控件时被引发。
  • Error – 它是一个页面事件,当有未处理的异常时发生。
  • Init – 当初始化页面或者控件时被引发。
  • Load – 当加载页面或者控件时被引发。
  • PreRender – 当显示页面或者控件时被引发。
  • Unload – 当从内存中卸载页面或者控件时被引发。

使用控件处理事件

所有的 ASP.NET 控件作为类而实现,并且当用户对其执行一个特定的动作时,它们会引发事件。比如说,当一个用户点击了一个按钮,那就生成了 'Click' 事件。对于处理事件来说,有内置属性和事件处理程序。事件处理应用程序被编码作为一个事件的回应,并且对其采取适当的行动。

默认情况下,Visual Studio 创建一个事件处理程序,包括处理条款的子程序。这个子句命名程序处理的控件和事件。

button 控件的 ASP 标签:

<asp:Button ID="btnCancel" runat="server" Text="Cancel" />

Click 事件的事件处理应用程序:

Protected Sub btnCancel_Click(ByVal sender As Object, ByVal e As System.EventArgs) 

   Handles btnCancel.Click

End Sub

一个事件同样可以在没有 Handles 子句的前提下被编码。然后,处理程序必须根据适合控件属性的适当事件进行命名。

button 控件的 ASP 标签:

<asp:Button ID="btnCancel" runat="server" Text="Cancel" Onclick="btnCancel_Click" />

Click 事件的事件处理应用程序:

Protected Sub btnCancel_Click(ByVal sender As Object, ByVal e As System.EventArgs)

End Sub

常见的控件事件有:

事件 属性 控件
Click OnClick 按钮,图像按钮,链接按钮,图像导位图
Command OnCommand 按钮,图像按钮,链接按钮
TextChanged OnTextChanged 文本框
SelectedIndexChanged OnSelectedIndexChanged 下拉菜单,列表框,单选按钮列表,带复选框的列表框
CheckedChanged OnCheckedChanged 复选框,单选按钮

一些事件导致表单立即发回到服务器,这些被称为回调事件。例如,单击事件像 Button.Click。

一些事件则不会被立即发回到服务器,这些被称为非回调事件

例如,改变事件或者选择事件,像 TextBox.TextChanged 或者 CheckBox.CheckedChanged。这些非回调事件可以通过设置它们的 AutoPostBack 属性为 true 便可立即使它们回调。

默认事件

页面对象的默认事件是加载事件。相似地,每一个控件都有一个默认的事件。比如,按钮控件的默认事件就是 Click 事件。

默认事件处理程序可以在 Visual Studio 中创建,仅通过双击设计视图中的控件。以下表格展示了一写常见控件的默认事件:

控件 默认事件
广告控件(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

示例

这个例子包括一个简单页面,上面有控件标签和一个按钮控件。当页面事件,例如 Page_Load,Page_Init,Page_PreRender 等等事件发生的时候,它就会发送一条信息,会由标签控件显示。当点击一个按钮,Button_Click 事件被引发,同样发送一条由标签展示的信息。

创建一个新的网站,从控件工具框中拖拽一个标签控件和按钮控件。使用窗口属性,相应地设置控件的 ID 为 .lblmessage. and .btnclick。设置按钮控件的文本属性为“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/>";
      }
   }
}

执行页面。标签显示页面加载,页面初始化以及页面预览事件。点击按钮查看效果:

image

ASP.NET 服务器端

服务器端

我们已经研究了页面生命周期和一个页面如何包含不同的控件。

页面本身作为一个控制对象被实例化。

所有的 web 表单基本上是 ASP.NET 页面类的实例。

页面类有以下极其有用的属性,与内部对象所对应:

  • 会话
  • 应用程序
  • 缓存
  • 请求
  • 响应
  • 服务器
  • 用户
  • 跟踪

我们会在适当的时间里讨论每一个对象。在本教程中我们将会探索 Server 对象,Request 对象和 Response 对象。

Server 对象

ASP.NET 中的服务器对象是 System.Web.HttpServerUtility 类的一个实例。The HttpServerUtility 类提供了大量的属性和方法来执行不同的工作。

Server 对象的属性和方法

HttpServerUtility 类的方法和属性通过由 ASP.NET 提供的内部服务器对象公开的。

以下表格提供了 HttpServerUtility 类一系列的属性。

属性 描述
MachineName 服务器电脑的名称
ScriptTimeOut 以秒为单位获取和设置请求超时的值

以下表格提供了一些重要的方法:

方法 描述
CreateObject(String) 创建一个 COM 对象的实例,由其 ProgID 验证。
CreateObject(Type) 创建一个 COM 对象的实例,由其 Type 验证。
Equals(Object) 决定具体的对象是否和现有对象一致。
Execute(String) 在当前请求的上下文中执行处理应用程序指定的虚拟路径。
Execute(String, Boolean) 在当前请求的上下文中执行处理程序指定的虚拟路径,指定是否清除 QueryString 及表单集合。
GetLastError 返回之前的异常。
GetType 获取现有实例的类型。
HtmlEncode 将一个普通的字符串变成合法的 HTML 字符串。
HtmlDecode 将一个 Html 字符串转化成一个普通的字符串。
ToString 返回一个表示当前对象的字符串。
Transfer(String) 对于当前请求,终止当前页面的执行并通过指定页面的 URL 路径,开始执行一个新页面。
UrlDecode 将一个 URL 字符串转化成一个普通的字符串。
UrlEncodeToken 与 UrlEncode 作用相同,但是在一个字节数组中,包含以 Base64 编码的数据。
UrlDecodeToken 与 UrlDecode 工作相同,但是在一个字节数组中,包含以 Base64 编码的数据。
MapPath 返回与指定的虚拟服务器上的文件路径相对应的物理路径。
Transfer 在当前应用程序上转移执行到另一个 web 页面。

Request 对象

请求对象是 System.Web.HttpRequest 类的一个实例。它代表了 HTTP 请求的值和属性,使页面加载到浏览器中。

此对象所呈现的信息被封装在更高级别的抽象中(web 控件模型)。然而,这个对象可以帮助检查一些信息,例如客户端浏览器和信息记录程序。

Request 对象的属性和方法

下表提供了请求对象一些值得注意的属性:

属性 描述
AcceptTypes 获取一个用户支持的 MIME 接受类型的字符串数组。
ApplicationPath 在服务器上获取 ASP.NET 应用程序的真实应用程序根路径。
Browser 获取或设置关于请求用户浏览器能力的信息。
ContentEncoding 获取或设置字符集的实体。
ContentLength 指定由客户端发送的内容的长度以字节为单位。
ContentType 获取或设置传入请求的 MIME 内容类型。
Cookies 获取客户端发送的 cookies 集合。
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 获取客户端语言首选项的排序字符串数组。

下表提供了一些重要的方法:

方法 描述
BinaryRead 从当前的输入流中执行一个指定字节数的二进制读数。
Equals(Object) 决定指定对象是否等同于现有对象。(继承自对象)
GetType 获取现有实例的类型。
MapImageCoordinates 将传入的象场表单参数绘制成适当的 x 坐标和 y 坐标值。
MapPath(String) 将指定的真实路径绘制成一个物理路径。
SaveAs 在硬盘中存为一个 HTTP 请求。
ToString 返回一个代表现有对象的字符串。
ValidateInput 导致验证发生,通过访问 Cookies,Form,QueryString 属性的集合。

Response 对象

响应对象代表了服务器对于用户请求的响应。它是 System.Web.HttpResponse 类的一个实例。

在 ASP.NET 中,响应对象在给用户发送 HTML 文本的过程中不扮演任何重要的角色,因为服务器端控件有嵌套的、面向对象的方法来自我呈现。

然而,HttpResponse 对象提供了一些重要的功能,比如 cookie 特点和 Redirect() 方法。 Response.Redirect() 方法允许将用户转移到另一个页面,在应用程序内部或应用程序外部均可。它需要一个往返过程。

Response 对象的属性和方法

下表提供了一些响应对象值得注意的属性:

属性 描述
Buffer 获取或设置一个值,表明是否缓冲输出,并在完整的响应程序结束后将其发送。
BufferOutput 获取或设置一个值,表名是否缓冲输出,并在完整页面结束进城后将其发送。
Charset 获取或设置输出流的 HTTP 字符集。
ContentEncoding 获取或设置输出流的 HTTP 字符集。
ContentType 获取或设置输出流的 HTTP MIME 类型。
Cookies 获取相应 cookie 集合。
Expires 获取或设置一个浏览器上缓存的页面在到期前的分钟数。
ExpiresAbsolute 获取或设置从缓存中移除缓存信息的绝对日期和时间。
HeaderEncoding 获取或设置一个编码对象,代表现有标题输出流的编码。
Headers 获取响应标题的集合。
IsClientConnected 获取一个值,表明用户是否仍和服务器相连。
Output 使输出的文本到输出的 HTTP 响应流。
OutputStream 使二进制输出到输出的 HTTP 内容本体。
RedirectLocation 获取或设置 Http 标题位置的值。
Status 设置状态栏,返回给客户端。
StatusCode 获取或设置返回到客户端的 HTTP 输出状态码。
StatusDescription 获取或设置返回给客户端的 HTTP 输出状态字符串。
SubStatusCode 获取或设置一个值限制响应的状态码。
SuppressContent 获取或设置一个值,表明是否发送 HTTP 内容到客户端。

下表提供了一些重要的方法:

方法 描述
AddHeader 给输出流添加一个 HTTP 标题。提供 AddHeader 是为了 ASP 早期版本的兼容性。
AppendCookie 基础设施为内部 cookie 集合添加一个 HTTP 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 响应输出流中,作为一个内存块。

示例

以下简单的例子有一个文本框控件,用户可以输入名称,一个按钮可以发送信息到服务器,还有一个标签控件来显示客户端计算机的 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())
   }
}

运行页面查看以下结果:

image

ASP.NET ADO.NET

ADO.NET

ADO.NET 提供了前端控件和后端数据库之间的桥梁。ADO.NET 对象封装了与数据显示对象相互作用的所有的数据存取操作和控件。因此便隐藏了数据移动的细节。

下列图表整体展示了 ADO.NET 对象:

DataSet 类

数据集代表了数据库的一个子集。它和数据库没有持续的连接。为了升级数据库需要进行重新连接。

DataSet 包括了 DataTable 和 DataRelation 对象。

DataRelation 对象代表了两张表之间的关系。

下表是 DataSet 类的一些重要属性:

属性 描述
CaseSensitive 说明和数据表进行对比的字符串是否区分大小写。
Container 为组件获取空间。
DataSetName 获取或者设置现有数据集合的名称。
DefaultViewManager 返回数据集合中的数据视图。
DesignMode 表明组件是否处于设计模式下。
EnforceConstraints 表明尝试上传文件时是否遵循限制条件。
Events 获取与本组件相关的事件处理器列表。
ExtendedProperties 获取与 DataSet 相关的自定义用户的信息的集合。
HasErrors 表明是否有任何错误。
IsInitialized 表明 DataSet 是否初始化。
Locale 获取或者设置用来和表比较字符串的信息。
Namespace 获取或者设置 DataSet 的命名空间。
Prefix 获取或者设置一个 XML 前缀,它是命名空间的别名。
Relations 返回 DataRelation 对象的集合。
Tables 返回 DataTable 对象的集合。

下表列出来 DataSet 类的一些重要方法:

方法 描述
AcceptChanges 接受所有由于装载 DataSet 或者这个方法的更改。
BeginInit 开始 DataSet 的初始化。该初始化发生在运行时。
Clear 清除数据。
Clone 克隆包括所有 DataTable 的结构、关系和限制在内的 DataSet 的结构。但是不克隆数据。
Copy 复制数据和结构。
CreateDataReader() 为每个 DataTable 返回带有一个结果集的 DataTableReader,顺序与 Tables 集合中表的显示顺序相同。
CreateDataReader(DataTable[]) 为每个 DataTable 返回带有一个结果集 DataTableReader。
EndInit 结束在窗体上使用或由另一个组件使用的 DataSet 的初始化。初始化发生在运行时。
Equals(Object) 确定指定的对象是否等于当前对象。
Finalize 释放资源执行其他清除。
GetChanges 获取 DataSet 的副本,该副本包含自加载以来或自上次调用 AcceptChanges 以来对该数据集进行的所有更改。
GetChanges(DataRowState) 获取由 DataRowState 筛选的 DataSet 的副本,该副本包含上次加载以来或调用 AcceptChanges 以来对该数据集进行的所有更改。
GetDataSetSchema 为 DataSet 获取 XmlSchemaSet 副本。
GetObjectData 用序列化 DataSet 所需的数据填充序列化信息对象。
GetType 获取当前实例的 Type。
GetXML 返回存储在 DataSet 中的数据的 XML 表示形式。
GetXMLSchema 返回存储在 DataSet 中的数据的 XML 表示形式的 XML 架构。
HasChanges() 获取一个值,该值指示 DataSet 是否有更改,包括新增行、已删除的行或已修改的行。
HasChanges(DataRowState) 获取一个值,该值指示 DataSet 是否有 DataRowState 被筛选的更改,包括新增行、已删除的行或已修改的行。
IsBinarySerialized 检查 DataSet 的序列化表示形式的格式。
Load(IDataReader, LoadOption, DataTable[]) 使用提供的 IDataReader 以数据源的值填充 DataSet,同时使用 DataTable 实例的数组提供架构和命名空间信息。
Load(IDataReader, LoadOption, String[]) 使用所提供的 IDataReader,并使用字符串数组为 DataSet 中的表提供名称,从而用来自数据源的值填充 DataSet。
Merge() 将指定的 DataSet、DataTable 或 DataRow 对象的数组合并到当前的 DataSet 或 DataTable 中。这种方法有不同的重载形式。
ReadXML() 将 XML 架构和数据读入 DataSet。这种方法有不同的重载形式。
ReadXMLSchema(0) 将 XML 架构读入 DataSet。这种方法有不同的重载形式。
RejectChanges 回滚自创建 DataSet 以来或上次调用 DataSet.AcceptChanges 以来对其进行的所有更改。
WriteXML() 从 DataSet 写 XML 数据和架构。这种方法有不同的重载形式。
WriteXMLSchema() 从 DataSet 写 XML 架构。这种方法有不同的重载形式。

DataTable 类

DataTable 类代表了数据库中的表。

它有如下的重要属性:大多数属性都是只读属性除了 PrimaryKey 属性:

属性 描述
ChildRelations 获取此 DataTable 的子关系的集合。
Columns 获取属于该表的列的集合。
Constraints 获取由该表维护的约束的集合。
DataSet 获取此表所属的 DataSet。
DefaultView 获取可能包括筛选视图或游标位置的表的自定义视图。
ParentRelations 获取该 DataTable 的父关系的集合。
PrimaryKey 获取或设置充当数据表主键的列的数组。
Rows 获取属于该表的行的集合。

下表列示出了一些 DataTable 类的重要方法:

方法 描述
AcceptChanges 提交自加载此 DataSet 或上次调用 AcceptChanges 以来对其进行的所有更改。
Clear 通过移除所有表中的所有行来清除任何数据的 DataSet。
GetChanges 获取 DataSet 的副本,该副本包含自上次加载以来或自调用 AcceptChanges 以来对该数据集进行的所有更改。
GetErrors 获取包含错误的 DataRow 对象的数组。
ImportRows 将 DataRow 复制到 DataTable 中,保留任何属性设置以及初始值和当前值。
LoadDataRow 查找和更新特定行。 如果找不到任何匹配行,则使用给定值创建新行。
Merge 将指定的 DataSet、DataTable 或 DataRow 对象的数组合并到当前的 DataSet 或 DataTable 中。
NewRow 创建与该表具有相同架构的新 DataRow。
RejectChanges 回滚自该表加载以来或上次调用 AcceptChanges 以来对该表进行的所有更改。
Reset 清除所有表并从 DataSet 中删除所有关系、外部约束和表。 子类应重写 Reset,以便将 DataSet 还原到其原始状态。
Select 获取 DataRow 对象的数组。

DataRow 类

DataRow 对象代表了表中的一行,它有如下的重要属性:

属性 描述
HasErrors 表明是否有错误。
Items 获取或者设置存储在特定栏目的数据。
ItemArrays 获取或者设置本行中所有的值。
Table 返回父表。

下表列示了 DataRow 类的重要方法:

方法 描述
AcceptChanges 应用调用该方法后的所有更改。
BeginEdit 开始编辑操作。
CancelEdit 取消编辑操作。
Delete 删除数据行。
EndEdit 结束编辑操作。
GetChildRows 获取本行的子行。
GetParentRow 获取父行。
GetParentRows 获取 DataRow 的父行。
RejectChanges 回滚所有 AcceptChanges 调用后的更改。

DataAdapter 对象

DataAdapter 对象扮演 DataSet 对象与数据库之间的中间者。

这有助于 DataSet 从多种数据库或者其他数据源获取数据。

DataReader 对象

DataReader 对象是 DataSet 和 DataAdapter 结合的备选。

这个对象提供了对数据库中的数据记录的定向的存取。这些对象只适合只读存取,例如填充一个列表然后断开连接。

DbCommand 和 DbConnection 对象

DbConnection 对象代表了数据源的连接。这种连接可以在不同的命令对象间共享。
DbCommand 对象代表了从检索或操纵数据发送到数据库的命令或者或者一个储存的进程。

例子

目前为止,我们已经应用了我们电脑中的表和数据库。在本案例中,我们将创建一个表,添加栏目,行和数据,并且用 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() 方法来创建表格然后将他们添加到数据集合的表集合中。
  • CreateStudentTable() 方法调用用户定义的 AddNewColumn() 和 AddNewRow() 方法来创建表的栏目和行同时向行中添加数据。
    当页面得到执行,它返回的表的行如下图所示:

猜你喜欢

转载自blog.csdn.net/u012576807/article/details/81432364