目录

ASP.NET - 快速指南

ASP.NET - Introduction

什么是ASP.NET?

ASP.NET是一个Web开发平台,它提供了编程模型,全面的软件基础架构以及为PC和移动设备构建强大的Web应用程序所需的各种服务。

ASP.NET在HTTP协议之上工作,并使用HTTP命令和策略来设置浏览器到服务器的双边通信和协作。

ASP.NET是Microsoft .Net平台的一部分。 ASP.NET应用程序是编译代码,使用.Net框架中存在的可扩展和可重用组件或对象编写。 这些代码可以使用.Net框架中的整个类层次结构。

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

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

ASP.NET用于通过Internet生成交互式,数据驱动的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页面的各种构建块。 基本上它是一个对象模型,它描述了:

  • 几乎所有HTML元素或标记的服务器端副本,例如

    和《input》。
  • 服务器控件,有助于开发复杂的用户界面。 例如,Calendar控件或Gridview控件。

ASP.NET是一种技术,它在.Net框架上工作,该框架包含所有与Web相关的功能。 .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) Common Language Runtime or CLR

它执行内存管理,异常处理,调试,安全检查,线程执行,代码执行,代码安全,验证和编译。 由CLR直接管理的代码称为托管代码。 编译托管代码时,编译器将源代码转换为CPU独立的中间语言(IL)代码。 Just In Time(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窗体包含应用程序中显示的任何窗口的图形表示。

(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

它提供了用户界面和业务逻辑之间的分离。 它有助于使用文档,媒体,二维和三维图形,动画等开发视觉上令人惊叹的界面。

(11) Windows Communication Foundation (WCF)

它是用于构建和执行连接系统的技术。

(12) Windows CardSpace

它为访问资源和在互联网上共享个人信息提供了安全性。

(13) LINQ

它使用类似于传统查询语言SQL的语法为.Net语言提供数据查询功能。

ASP.NET - Environment Setup

ASP.NET在构建Web应用程序的HTTP之上提供了一个抽象层。 它在面向对象的范例中提供高级实体,例如类和组件。

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

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

Visual Studio IDE

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

Visual Studio IDE

当您启动新网站时,ASP.NET会提供该网站的起始文件夹和文件,包括该网站的第一个Web表单的两个文件。

名为Default.aspx的文件包含定义表单的HTML和asp代码,名为Default.aspx.cs的文件(用于C#编码)或名为Default.aspx.vb的文件(用于VB编码)包含代码您选择的语言,此代码负责对表单执行的操作。

Visual Studio IDE中的主窗口是Web窗体设计器窗口。 其他支持窗口是Toolbox,Solution Explorer和Properties窗口。 您可以使用设计器来设计Web表单,在表单上向控件添加代码,以便表单根据您的需要工作,您可以使用代码编辑器。

使用视图和Windows

您可以通过以下方式使用Windows:

  • 要将Web窗体设计器从一个视图更改为另一个视图,请单击“设计”或“源”按钮。

  • 要关闭窗口,请单击右上角的关闭按钮并重新显示,然后从“视图”菜单中选择它。

  • 要隐藏窗口,请单击其“自动隐藏”按钮。 然后窗口变为选项卡。 要再次显示,请再次单击“自动隐藏”按钮。

  • 要更改窗口的大小,只需拖动它即可。

景观和窗户

将文件夹和文件添加到您的网站

创建新的Web表单时,Visual Studio会自动为表单生成起始HTML,并将其显示在Web表单设计器的“源”视图中。 解决方案资源管理器用于添加网站上的任何其他文件,文件夹或任何现有项目。

  • 要添加标准文件夹,请在解决方案资源管理器中右键单击要在其下添加文件夹的项目或文件夹,然后选择“新建文件夹”。

  • 要添加ASP.NET文件夹,请在解决方案资源管理器中右键单击该项目,然后从列表中选择该文件夹。

  • 要将现有项添加到站点,请右键单击要在解决方案资源管理器中添加项目的项目或文件夹,然后从对话框中进行选择。

项目和解决方案

典型的ASP.NET应用程序包含许多项:Web内容文件(.aspx),源文件(.cs文件),程序集(.dll和.exe文件),数据源文件(.mdb文件),引用,图标,用户控件和其他各种文件和文件夹。 组成网站的所有这些文件都包含在解决方案中。

创建新网站时。 VB2008自动创建解决方案并将其显示在解决方案资源管理器中。

解决方案可能包含一个或多个项目。 项目包含内容文件,源文件和其他文件,如数据源和图像文件。 通常,项目的内容作为可执行文件(.exe)或动态链接库(.dll)文件编译到程序集中。

通常,项目包含以下内容文件:

  • 页面文件(.aspx)
  • 用户控制(.ascx)
  • Web服务(.asmx)
  • 母版页(.master)
  • 站点地图(.sitemap)
  • 网站配置文件(.config)

构建和运行项目

您可以通过以下方式执行申请:

  • 选择开始
  • 从Debug菜单中选择Start Without Debugging,
  • 按F5
  • Ctrl-F5

该程序是构建的意思,.exe或.dll文件是通过从Build菜单中选择一个命令生成的。

ASP.NET - Life Cycle

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

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

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

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

ASP.NET应用程序生命周期

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

  • 用户请求访问应用程序资源,页面。 浏览器将此请求发送到Web服务器。

  • 统一管道接收第一个请求并发生以下事件:

    • 创建ApplicationManager类的对象。

    • 创建HostingEnvironment类的对象以提供有关资源的信息。

    • 编译应用程序中的顶级项目。

  • 响应对象已创建。 创建并初始化应用程序对象,如HttpContext,HttpRequest和HttpResponse。

  • 创建HttpApplication对象的实例并将其分配给请求。

  • 该请求由HttpApplication类处理。 此类引发了不同的事件来处理请求。

ASP.NET页面生命周期

请求页面时,会将其加载到服务器内存中,进行处理并发送到浏览器。 然后从内存中卸载它。 在每个步骤中,都可以使用方法和事件,可以根据应用程序的需要覆盖这些方法和事件。 换句话说,您可以编写自己的代码来覆盖默认代码。

Page类创建页面上所有控件的分层树。 除指令外,页面上的所有组件都是此控制树的一部分。 您可以通过向page指令添加trace =“true”来查看控制树。 我们将在'指令'和'事件处理'下覆盖页面指令和跟踪。

页面生命周期阶段是:

  • Initialization
  • 在页面上实例化控件
  • 恢复和维护国家
  • 执行事件处理程序代码
  • 页面渲染

理解页面循环有助于编写代码,以便在页面生命周期的任何阶段发生某些特定事情。 它还有助于编写自定义控件并在适当的时候初始化它们,使用视图状态数据填充其属性并运行控制行为代码。

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

  • Page request - 当ASP.NET获取页面请求时,它决定是否解析和编译页面,或者是否存在页面的缓存版本; 相应地发送响应。

  • Starting of page life cycle - 在此阶段,设置Request和Response对象。 如果请求是旧请求或回发,则页面的IsPostBack属性设置为true。 还设置了页面的UICulture属性。

  • Page initialization - 在此阶段,通过设置UniqueID属性并应用主题,为页面上的控件分配唯一ID。 对于新请求,将加载回发数据,并将控件属性还原为视图状态值。

  • Page load - 在此阶段,使用视图状态和控件状态值设置控件属性。

  • Validation - 调用验证控件的验证方法,并且在成功执行时,页面的IsValid属性设置为true。

  • Postback event handling - 如果请求是回发(旧请求),则调用相关的事件处理程序。

  • Page rendering - 在此阶段,将保存页面的视图状态和所有控件。 该页面为每个控件调用Render方法,并且渲染的输出被写入页面的Response属性的OutputStream类。

  • Unload - 将呈现的页面发送到客户端,并卸载页面属性(如响应和请求)并完成所有清理。

ASP.NET页面生命周期事件

在页面生命周期的每个阶段,页面都会引发一些可以编码的事件。 事件处理程序基本上是一个函数或子例程,使用声明属性(如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的对象或从其继承。

页面上的所有控件也是从父Control类继承的相关控件类的对象。 运行页面时,将创建对象页面的实例及其所有内容控件。

ASP.NET页面也是使用.aspx扩展名保存的服务器端文件。 它本质上是模块化的,可以分为以下核心部分:

  • 页面指​​令
  • 代码部分
  • 页面布局

页面指​​令

页面指​​令设置要运行的页面的环境。 @Page指令定义ASP.NET页面解析器和编译器使用的特定于页面的属性。 页面指​​令指定应如何处理页面,以及需要对页面进行哪些假设。

它允许导入名称空间,加载程序集以及使用自定义标记名称和名称空间前缀注册新控件。

代码部分

代码部分提供页面和控件事件的处理程序以及所需的其他功能。 我们提到过,ASP.NET遵循一个对象模型。 现在,当用户界面上发生某些事件时,这些对象会引发事件,例如用户单击按钮或移动光标。 这些事件需要回应的响应类型在事件处理函数中进行编码。 事件处理程序只是绑定到控件的函数。

代码部分或代码隐藏文件提供了所有这些事件处理程序例程以及开发人员使用的其他函数。 页面代码可以以二进制程序集的形式预编译和部署。

页面布局

页面布局提供页面的界面。 它包含服务器控件,文本,内联JavaScript和HTML标记。

以下代码片段提供了一个示例ASP.NET页面,解释了用C#编写的Page指令,代码段和页面布局:

<!-- 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。 从浏览器打开文件以执行它,它会生成以下结果:

ASP.NET第一个例子ASP.NET第一个例子

使用Visual Studio IDE

让我们使用Visual Studio IDE开发相同的示例。 您可以将控件拖到设计视图中,而不是键入代码:

ASP.NET第一个例子2

内容文件自动开发。 您需要添加的只是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第一个例子3

ASP.NET - Event Handling

什么是事件? (What is an Event?)

事件是一种动作或事件,例如鼠标单击,按键,鼠标移动或任何系统生成的通知。 流程通过事件进行通信。 例如,中断是系统生成的事件。 当事件发生时,应用程序应该能够响应并管理它。

ASP.NET中的事件在客户端计算机上引发,并在服务器计算机上处​​理。 例如,用户单击浏览器中显示的按钮。 引发了Click事件。 浏览器通过将此事件发布到服务器来处理此客户端事件。

服务器有一个子例程,描述引发事件时要做什么; 它被称为事件处理程序。 因此,当事件消息传输到服务器时,它会检查Click事件是否具有关联的事件处理程序。 如果有,则执行事件处理程序。

事件参数

ASP.NET事件处理程序通常采用两个参数并返回void。 第一个参数表示引发事件的对象,第二个参数表示事件参数。

事件的一般语法是:

private void EventName (object sender, EventArgs e);

应用程序和会话事件

最重要的应用事件是:

  • Application_Start - 在应用程序/网站启动时引发。

  • Application_End - 在应用程序/网站停止时引发。

同样,最常用的Session事件是:

  • Session_Start - 当用户首次从应用程序请求页面时引发它。

  • Session_End - 会话结束时引发。

页面和控制事件

常见页面和控件事件是:

  • DataBinding - 当控件绑定到数据源时引发它。

  • Disposed - 释放页面或控件时引发。

  • Error - 这是一个页面事件,在抛出未处理的异常时发生。

  • Init - 初始化页面或控件时引发。

  • Load - Load页面或控件时引发。

  • PreRender - 在呈现页面或控件时引发它。

  • Unload - 从内存中卸载页面或控件时引发。

使用控件处理事件

所有ASP.NET控件都是作为类实现的,并且它们具有在用户对它们执行特定操作时触发的事件。 例如,当用户单击按钮时,将生成“Click”事件。 对于处理事件,有内置属性和事件处理程序。 事件处理程序被编码为响应事件,并对其采取适当的操作。

默认情况下,Visual Studio通过在Sub过程中包含Handles子句来创建事件处理程序。 此子句命名过程处理的控件和事件。

按钮控件的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子句的情况下编码。 然后,必须根据控件的相应事件属性命名处理程序。

按钮控件的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

常见的控制事件是:

事件 属性 控制
ClickOnClick 按钮,图像按钮,链接按钮,图像映射
CommandOnCommand 按钮,图像按钮,链接按钮
TextChangedOnTextChanged 文本框
SelectedIndexChangedOnSelectedIndexChanged 下拉列表,列表框,单选按钮列表,复选框列表。
CheckedChangedOnCheckedChanged 复选框,单选按钮

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

某些事件不会立即回发到服务器,这些事件称为非回发事件。

例如,更改事件或选择事件,如TextBox.TextChanged或CheckBox.CheckedChanged。 可以通过将其AutoPostBack属性设置为true来立即回发非后备事件。

默认事件

Page对象的默认事件是Load事件。 同样,每个控件都有一个默认事件。 例如,按钮控件的默认事件是Click事件。

可以在Visual Studio中创建默认事件处理程序,只需双击设计视图中的控件即可。 下表显示了常用控件的一些默认事件:

控制 默认事件
AdRotatorAdCreated
BulletedListClick
ButtonClick
CalenderSelectionChanged
CheckBoxCheckedChanged
CheckBoxListSelectedIndexChanged
DataGridSelectedIndexChanged
DataListSelectedIndexChanged
DropDownListSelectedIndexChanged
HyperLinkClick
ImageButtonClick
ImageMapClick
LinkButtonClick
ListBoxSelectedIndexChanged
MenuMenuItemClick
RadioButtonCheckedChanged
RadioButtonListSelectedIndexChanged

例子 (Example)

此示例包括一个带有标签控件和按钮控件的简单页面。 当页面事件如Page_Load,Page_Init,Page_PreRender等发生时,它会发送一条消息,由标签控件显示。 单击该按钮时,将引发Button_Click事件,并且还会发送要在标签上显示的消息。

创建一个新网站并从控件工具框中拖动标签控件和按钮控件。 使用属性窗口,将控件的ID设置为.lblmessage。 和.btnclick。 分别。 将Button控件的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事件示例

ASP.NET - Server Side

我们研究了页面生命周期以及页面如何包含各种控件。 页面本身被实例化为控制对象。 所有Web表单基本上都是ASP.NET Page类的实例。 页面类具有以下与内部对象对应的非常有用的属性:

  • Session
  • Application
  • Cache
  • Request
  • Response
  • Server
  • User
  • Trace

我们将在适当的时候讨论这些对象。 在本教程中,我们将探索Server对象,Request对象和Response对象。

服务器对象

Asp.NET中的Server对象是System.Web.HttpServerUtility类的一个实例。 HttpServerUtility类提供了许多属性和方法来执行各种作业。

Server对象的属性和方法

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

下表提供了属性列表:

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

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

方法 描述
CreateObject(String) 创建由其ProgID(程序ID)标识的COM对象的实例。
CreateObject(Type) 创建由其Type标识的COM对象的实例。
Equals(Object) 确定指定的Object是否等于当前的Object。
Execute(String) 在当前请求的上下文中执行指定虚拟路径的处理程序。
Execute(String, Boolean) 在当前请求的上下文中执行指定虚拟路径的处理程序,并指定是否清除QueryString和Form集合。
GetLastError 返回先前的异常。
GetType 获取当前实例的Type。
HtmlEncode 将普通字符串更改为具有合法HTML字符的字符串。
HtmlDecode 将Html字符串转换为普通字符串。
ToString 返回表示当前对象的字符串。
Transfer(String) 对于当前请求,终止当前页面的执行,并使用页面的指定URL路径开始执行新页面。
UrlDecode 将URL字符串转换为普通字符串。
UrlEncodeToken 与UrlEncode一样,但在包含Base64编码数据的字节数组上。
UrlDecodeToken 与UrlDecode一样,但在包含Base64编码数据的字节数组上。
MapPath 返回与服务器上指定虚拟文件路径对应的物理路径。
Transfer 将执行转移到当前应用程序中的另一个网页。

请求对象

请求对象是System.Web.HttpRequest类的实例。 它表示将页面加载到浏览器中的HTTP请求的值和属性。

此对象提供的信息由更高级别的抽象(Web控件模型)包装。 但是,此对象有助于检查某些信息,例如客户端浏览器和cookie。

请求对象的属性和方法

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

属性 描述
AcceptTypes 获取客户端支持的MIME接受类型的字符串数组。
ApplicationPath 获取ASP.NET应用程序在服务器上的虚拟应用程序根路径。
Browser 获取或设置有关请求客户端浏览器功能的信息。
ContentEncoding 获取或设置entity-body的字符集。
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 获取客户端语言首选项的排序字符串数组。

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

方法 描述
BinaryRead 从当前输入流执行指定字节数的二进制读取。
Equals(Object) 确定指定的对象是否等于当前对象。 (继承自object。)
GetType 获取当前实例的Type。
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 Location标头的值。
Status 设置返回给客户端的状态行。
StatusCode 获取或设置返回给客户端的输出的HTTP状态代码。
StatusDescription 获取或设置返回给客户端的输出的HTTP状态字符串。
SubStatusCode 获取或设置限定响应状态代码的值。
SuppressContent 获取或设置一个值,该值指示是否将HTTP内容发送到客户端。

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

方法 描述
AddHeader 将HTTP标头添加到输出流。 提供AddHeader是为了与早期版本的ASP兼容。
AppendCookie Infrastructure将HTTP cookie添加到内部cookie集合中。
AppendHeader 将HTTP标头添加到输出流。
AppendToLog 将自定义日志信息添加到InterNET信息服务(IIS)日志文件。
BinaryWrite 将一串二进制字符写入HTTP输出流。
ClearContent 清除缓冲区流中的所有内容输出。
Close 关闭与客户端的套接字连接。
End 将所有当前缓冲的输出发送到客户端,停止执行页面,并引发EndRequest事件。
Equals(Object) 确定指定的对象是否等于当前对象。
Flush 将所有当前缓冲的输出发送到客户端。
GetType 获取当前实例的Type。
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服务器端

ASP.NET - Server Controls

控件是图形用户界面的小构建块,包括文本框,按钮,复选框,列表框,标签和许多其他工具。 使用这些工具,用户可以输入数据,进行选择并指出他们的偏好。

控件还用于结构作业,如验证,数据访问,安全性,创建母版页和数据操作。

ASP.NET使用五种类型的Web控件,它们是:

  • HTML控件
  • HTML服务器控件
  • ASP.NET服务器控件
  • ASP.NET Ajax Server控件
  • 用户控件和自定义控件

ASP.NET服务器控件是ASP.NET中使用的主要控件。 这些控件可以分为以下几类:

  • Validation controls - 这些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功能,可显示和自动完成属性
  • 用于直接设置属性值的属性窗口

服务器控件的属性

具有可视方面的ASP.NET服务器控件派生自WebControl类,并继承此类的所有属性,事件和方法。

WebControl类本身和一些不可视化呈现的服务器控件是从System.Web.UI.Control类派生的。 例如,PlaceHolder控件或XML控件。

ASP.Net服务器控件继承WebControl和System.Web.UI.Control类的所有属性,事件和方法。

下表显示了所有服务器控件通用的继承属性:

属性 描述
AccessKey 使用Alt键按此键可将焦点移至控件。
Attributes 它是与控件上的属性不对应的任意属性的集合(仅用于呈现)。
BackColor 背景颜色。
BindingContainer 包含此控件的数据绑定的控件。
BorderColor 边框颜色。
BorderStyle 边框风格。
BorderWidth 边框宽度。
CausesValidation 指示它是否导致验证。
ChildControlCreated 它指示是否已创建服务器控件的子控件。
ClientID HTML标记的控件ID。
Context 与服务器控件关联的HttpContext对象。
Controls 控件中包含的所有控件的集合。
ControlStyle Web服务器控件的样式。
CssClass CSS类
DataItemContainer 如果命名容器实现IDataItemContainer,则获取对命名容器的引用。
DataKeysContainer 如果命名容器实现IDataKeysControl,则获取对命名容器的引用。
DesignMode 它指示控件是否在设计图面上使用。
DisabledCssClass 获取或设置在禁用控件时应用于呈现的HTML元素的CSS类。
Enabled 指示控件是否显示为灰色。
EnableTheming 指示主题是否适用于控件。
EnableViewState 指示是否保持控件的视图状态。
Events 获取控件的事件处理程序委托列表。
FontFont.
Forecolor 前景色。
HasAttributes 指示控件是否已设置属性。
HasChildViewState 指示当前服务器控件的子控件是否具有任何已保存的视图状态设置。
Height 高度(以像素为单位)或%。
ID 控件的标识符。
IsChildControlStateCleared 指示此控件中包含的控件是否具有控件状态。
IsEnabled 获取一个值,该值指示控件是否已启用。
IsTrackingViewState 它指示服务器控件是否正在保存对其视图状态的更改。
IsViewStateEnabled 它指示是否为此控件启用了视图状态。
LoadViewStateById 它指示控件是否参与通过ID而不是索引加载其视图状态。
Page 包含控件的页面。
Parent 家长控制。
RenderingCompatibility 它指定呈现的HTML将与之兼容的ASP.NET版本。
Site 在设计图面上呈现时承载当前控件的容器。
SkinID 获取或设置要应用于控件的外观。
Style 获取将在Web服务器控件的外部标记上呈现为样式属性的文本属性的集合。
TabIndex 获取或设置Web服务器控件的选项卡索引。
TagKey 获取与此Web服务器控件对应的HtmlTextWriterTag值。
TagName 获取控件标记的名称。
TemplateControl 包含此控件的模板。
TemplateSourceDirectory 获取包含此控件的页面或控件的虚拟目录。
ToolTip 获取或设置鼠标指针悬停在Web服务器控件上时显示的文本。
UniqueID 唯一标识符。
ViewState 获取状态信息的字典,该字典信息可以跨同一页面的多个请求保存和恢复服务器控件的视图状态。
ViewStateIgnoreCase 它指示StateBag对象是否不区分大小写。
ViewStateMode 获取或设置此控件的视图状态模式。
Visible 它指示服务器控件是否可见。
Width 获取或设置Web服务器控件的宽度。

服务器控件的方法

下表提供了服务器控件的方法:

方法 描述
AddAttributesToRender 将需要呈现的HTML属性和样式添加到指定的HtmlTextWriterTag。
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) 在当前命名容器中搜索具有指定标识和整数的服务器控件。
Focus 将输入焦点设置为控件。
GetDesignModeState 获取控件的设计时数据。
GetType 获取当前实例的类型。
GetUniqueIDRelativeTo 返回指定控件的UniqueID属性的前缀部分。
HasControls 确定服务器控件是否包含任何子控件。
HasEvents 指示是否为控件或任何子控件注册事件。
IsLiteralContent 确定服务器控件是否仅包含文字内容。
LoadControlState 恢复控制状态信息。
LoadViewState 恢复视图状态信息。
MapPathSecure 检索虚拟路径(绝对路径或相对路径)映射到的物理路径。
MemberwiseClone 创建当前对象的浅表副本。
MergeStyle 将指定样式的任何非空白元素复制到Web控件,但不会覆盖控件的任何现有样式元素。
OnBubbleEvent 确定服务器控件的事件是否向上传递到页面的UI服务器控件层次结构。
OnDataBinding 引发数据绑定事件。
OnInit 引发Init事件。
OnLoad 引发Load事件。
OnPreRender 引发PreRender事件。
OnUnload 引发Unload事件。
OpenFile 获取用于读取文件的Stream。
RemovedControl 从控件对象的控件集合中删除子控件后调用。
Render 将控件呈现给指定的HTML编写器。
RenderBeginTag 将控件的HTML开始标记呈现给指定的编写器。
RenderChildren 将服务器控件的子项的内容输出到提供的HtmlTextWriter对象,该对象写入要在客户端上呈现的内容。
RenderContents 将控件的内容呈现给指定的编写器。
RenderControl(HtmlTextWriter) 将服务器控件内容输出到提供的HtmlTextWriter对象,并在启用跟踪时存储有关控件的跟踪信息。
RenderEndTag 将控件的HTML结束标记呈现到指定的编写器中。
ResolveAdapter 获取负责呈现指定控件的控件适配器。
SaveControlState 保存自页面发回服务器以来发生的任何服务器控件状态更改。
SaveViewState 保存调用TrackViewState方法后修改的任何状态。
SetDesignModeState 设置控件的设计时数据。
ToString 返回表示当前对象的字符串。
TrackViewState 使控件跟踪其视图状态的更改,以便它们可以存储在对象的视图状态属性中。

例子 (Example)

让我们看一下特定的服务器控件 - 树视图控件。 树视图控件位于导航控件下。 其他导航控件包括:菜单控件和SiteMapPath控件。

在页面上添加树视图控件。 从任务中选择“编辑节点...”。 使用树视图节点编辑器编辑每个节点,如下所示:

ASP.NET编辑节点

创建节点后,它在设计视图中如下所示:

ASP.NET编辑节点2

AutoFormat ...任务允许您格式化树视图,如下所示:

ASP.NET自动套用格式

在页面上添加标签控件和文本框控件,并分别将它们命名为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控制节点

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">

使用HTML服务器控件的优点

虽然ASP.NET服务器控件可以执行HTML服务器控件完成的每个作业,但后面的控件在以下情况下很有用:

  • 使用静态表进行布局。
  • 转换HTML页面以在ASP.NET下运行

下表描述了HTML服务器控件:

控制名称 HTML标记
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>元素
HtmlLink <link>元素
HtmlAnchor <a>元素
HtmlButton <button>元素</button>
HtmlButton <button>元素</button>
HtmlForm <form>元素</form>
HtmlTable table 元素
HtmlTableCell td和th
HtmlTableRow tr元素
HtmlTitle title元素
HtmlSelect 元件
HtmlGenericControl 未列出所有HTML控件

例子 (Example)

以下示例使用基本HTML表进行布局。 它使用一些框来获取用户的输入,例如名称,地址,城市,州等。它还有一个按钮控件,单击该按钮控件以获取显示在表格最后一行中的用户数据。

页面在设计视图中应如下所示:

ASP.NET服务器控件

内容页面的代码显示了使用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页面生成此Client side source code 。 例如,ASP.NET页面的HTML源代码包含许多隐藏字段和自动注入的JavaScript代码块,这些代码保存视图状态或其他作业以使页面工作。

客户端脚本

所有ASP.NET服务器控件都允许调用使用JavaScript或VBScript编写的客户端代码。 某些ASP.NET服务器控件使用客户端脚本来向用户提供响应,而不会回发到服务器。 例如,验证控件。

除了这些脚本之外,Button控件还有一个属性OnClientClick,它允许在单击按钮时执行客户端脚本。

传统和服务器HTML控件具有以下事件,可以在引发脚本时执行它们:

事件 描述
onblur 当控件失去焦点时
onfocus 当控件获得焦点时
onclick 单击控件时
onchange 当控件的值发生变化时
onkeydown 当用户按下某个键时
onkeypress 当用户按下字母数字键时
onkeyup 当用户释放密钥时
onmouseover 当用户将鼠标指针移到控件上时
onserverclick 单击控件时,它会引发控件的ServerClick事件

客户端源代码

我们已经讨论过,ASP.NET页面通常用两个文件编写:

  • 内容文件或标记文件(.aspx)
  • 代码隐藏文件

内容文件包含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>

如果正确浏览代码,可以看到前两个

标记包含存储视图状态和验证信息的隐藏字段。

ASP.NET - Basic Controls

在本章中,我们将讨论ASP.NET中可用的基本控件。

按钮控件

ASP.NET提供了三种类型的按钮控件:

  • Button :它在矩形区域内显示文本。

  • Link Button :显示看起来像超链接的文本。

  • Image Button :显示图像。

当用户单击按钮时,会引发两个事件:单击和命令。

按钮控件的基本语法:

<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Click"/>

按钮控件的常用属性:

属性 描述
Text 按钮上显示的文字。 这仅适用于按钮和链接按钮控件。
ImageUrl 仅适用于图像按钮控制。 要为按钮显示的图像。
AlternateText 仅适用于图像按钮控制。 如果浏览器无法显示图像,则显示的文本。
CausesValidation 确定用户单击按钮时是否发生页面验证。 默认值为true。
CommandName 用户单击按钮时传递给命令事件的字符串值。
CommandArgument 用户单击按钮时传递给命令事件的字符串值。
PostBackUrl 用户单击按钮时请求的页面的URL。

文本框和标签

文本框控件通常用于接受来自用户的输入。 文本框控件可以接受一行或多行文本,具体取决于TextMode属性的设置。

标签控件提供了一种显示文本的简便方法,可以将文本从一次执行更改为下一次。 如果要显示不更改的文本,请使用文字文本。

文本控件的基本语法:

<asp:TextBox ID="txtstate" runat="server" ></asp:TextBox>

文本框和标签的常见属性:

属性 描述
TextMode 指定文本框的类型。 SingleLine创建一个标准文本框,MultiLIne创建一个文本框,可以接受多行文本,而密码会导致输入的字符被屏蔽。 默认值为SingleLine。
Text 文本框的文本内容。
MaxLength 可以在文本框中输入的最大字符数。
Wrap 它确定文本是否自动换行为多行文本框; 默认为true。
ReadOnly 确定用户是否可以更改框中的文本; 默认为false,即用户无法更改文本。
Columns 文本框的宽度,以字符为单位。 实际宽度是根据用于文本输入的字体确定的。
Rows 行中多行文本框的高度。 默认值为0,表示单行文本框。

标签控件最常用的属性是“文本”,它表示标签上显示的文本。

复选框和单选按钮

复选框显示用户可以选中或取消选中的单个选项,单选按钮显示一组选项,用户只能从中选择一个选项。

要创建一组单选按钮,请为组中每个单选按钮的GroupName属性指定相同的名称。 如果单个表单中需要多个组,请为每个组指定不同的组名。

如果要在最初显示表单时选中复选框或单选按钮,请将其“已检查”属性设置为true。 如果组中的多个单选按钮的Checked属性设置为true,则只有最后一个被视为true。

复选框的基本语法:

<asp:CheckBox ID= "chkoption" runat= "Server"> 
</asp:CheckBox>

单选按钮的基本语法:

<asp:RadioButton ID= "rdboption" runat= "Server"> 
</asp: RadioButton>

复选框和单选按钮的常见属性:

属性 描述
Text 复选框或单选按钮旁边显示的文本。
Checked 指定是否选中它,默认为false。
GroupName 控件所属的组的名称。

列表控件

ASP.NET提供以下控件

  • 下拉列表,
  • 列表框,
  • 单选按钮列表,
  • 复选框列表,
  • 项目符号列表。

这些控件允许用户从列表中的一个或多个项目中进行选择。 列表框和下拉列表包含一个或多个列表项。 这些列表可以通过代码或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>

列表框和下拉列表的常见属性:

属性 描述
Items ListItem对象的集合,表示控件中的项。 此属性返回ListItemCollection类型的对象。
Rows 指定框中显示的项目数。 如果实际列表包含的行数多于显示的行数,则会添加滚动条。
SelectedIndex 当前所选项目的索引。 如果选择了多个项目,则为第一个选定项目的索引。 如果未选择任何项,则此属性的值为-1。
SelectedValue 当前所选项目的值。 如果选择了多个项目,则为第一个选定项目的值。 如果未选择任何项,则此属性的值为空字符串(“”)。
SelectionMode 指示列表框是允许单个选择还是多个选择。

每个列表项对象的公共属性:

属性 描述
Text 显示该项目的文本。
Selected 指示是否选择了该项目。
Value 与项关联的字符串值。

重要的是要注意:

  • 若要使用下拉列表或列表框中的项目,请使用控件的Items属性。 此属性返回ListItemCollection对象,该对象包含列表的所有项。

  • 当用户从下拉列表或列表框中选择其他项时,将引发SelectedIndexChanged事件。

ListItemCollection

ListItemCollection对象是ListItem对象的集合。 每个ListItem对象代表列表中的一个项目。 ListItemCollection中的项目从0开始编号。

当使用以下字符串加载列表框中的项目时:lstcolor.Items.Add(“Blue”),然后列表项的Text和Value属性都将设置为您指定的字符串值。 要以不同方式设置它,您必须创建一个列表项对象,然后将该项添加到集合中。

ListItemCollection编辑器用于将项添加到下拉列表或列表框中。 这用于创建静态项目列表。 要显示集合编辑器,请从智能标记菜单中选择编辑项,或选择该控件,然后单击属性窗口中Item属性的省略号按钮。

ListItemCollection的常见属性:

属性 描述
Item(integer) ListItem对象,表示指定索引处的项目。
Count 集合中的项目数。

ListItemCollection的常用方法:

方法 描述
Add(string) 在集合的末尾添加一个新项,并将字符串参数分配给项的Text属性。
Add(ListItem) 在集合的末尾添加一个新项。
Insert(integer, string) 在集合中的指定索引位置插入项,并将字符串参数分配给项的text属性。
Insert(integer, ListItem) 将项插入集合中的指定索引位置。
Remove(string) 删除具有与字符串相同的文本值的项目。
Remove(ListItem) 删除指定的项目。
RemoveAt(integer) 删除指定索引处的项目作为整数。
Clear 删除集合中的所有项目。
FindByValue(string) 返回其值与字符串相同的项。
FindByValue(Text) 返回其文本与字符串相同的项。

单选按钮列表和复选框列表

单选按钮列表显示了互斥选项的列表。 复选框列表显示独立选项列表。 这些控件包含一组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>

复选框和单选按钮列表的常用属性:

属性 描述
RepeatLayout 此属性指定在呈现列表时格式化列表时要使用的表标记还是正常的html流。 默认为Table。
RepeatDirection 它指定了重复控件的方向。 可用值为“水平”和“垂直”。 默认为垂直。
RepeatColumns 它指定重复控件时要使用的列数; 默认值为0。

项目符号列表和编号列表

项目符号列表控件可创建项目符号列表或编号列表。 这些控件包含一组ListItem对象,可以通过控件的Items属性引用它们。

项目符号列表的基本语法:

<asp:BulletedList ID="BulletedList1" runat="server">
</asp:BulletedList>

项目符号列表的常见属性:

属性 描述
BulletStyle 此属性指定项目符号或数字的样式和外观。
RepeatDirection 它指定了重复控件的方向。 可用值为“水平”和“垂直”。 默认为垂直。
RepeatColumns 它指定重复控件时要使用的列数; 默认值为0。

HyperLink控件

HyperLink控件类似于HTML 元素。

超链接控件的基本语法:

<asp:HyperLink ID="HyperLink1" runat="server">
   HyperLink
</asp:HyperLink>

它具有以下重要属性:

属性 描述
ImageUrl 控件显示图像的路径。
NavigateUrl 目标链接URL。
Text 要显示为链接的文本。
Target 加载链接页面的窗口或框架。

图像控制

如果图像不可用,则图像控件用于在网页上显示图像,或者一些替代文本。

图像控件的基本语法:

<asp:Image ID="Image1" runat="server">

它具有以下重要属性:

属性 描述
AlternateText 在没有图像的情况下显示的备用文本。
ImageAlign 控件的对齐选项。
ImageUrl 控件显示图像的路径。

ASP.NET - Directives

ASP.NET指令是指定可选设置的指令,例如注册自定义控件和页面语言。 这些设置描述了.Net框架如何处理Web表单(.aspx)或用户控件(.ascx)页面。

声明指令的语法是:

<%@  directive_name attribute=value  [attribute=value]  %>

在本节中,我们将只介绍ASP.NET指令,我们将在整个教程中使用大多数这些指令。

应用指令

Application指令定义特定于应用程序的属性。 它位于global.aspx文件的顶部。

Application指令的基本语法是:

<%@ Application Language="C#" %>

Application指令的属性是:

属性 描述
Inherits 要从中继承的类的名称。
Description 应用程序的文本描述。 解析器和编译器忽略了这一点。
Language 代码块中使用的语言。

大会指令

Assembly指令在解析时将程序集链接到页面或应用程序。 这可以出现在用于应用程序范围链接的global.asax文件中,页面文件中,用于链接到页面或用户控件的用户控件文件。

Assembly指令的基本语法是:

<%@ Assembly Name ="myassembly" %>

Assembly指令的属性是:

属性 描述
Name 要链接的程序集的名称。
Src 要动态链接和编译的源文件的路径。

控制指令

control指令与用户控件一起使用,并显示在用户控件(.ascx)文件中。

Control指令的基本语法是:

<%@ Control Language="C#"  EnableViewState="false" %>

Control指令的属性是:

属性 描述
AutoEventWireup 布尔值,用于启用或禁用事件与处理程序的自动关联。
ClassName 控件的文件名。
Debug 用于启用或禁用使用调试符号进行编译的布尔值。
Description 控制页面的文本描述,被编译器忽略。
EnableViewState 布尔值,指示是否跨页面请求维护视图状态。
Explicit 对于VB语言,告诉编译器使用选项显式模式。
Inherits 控件页面继承的类。
Language 代码和脚本的语言。
Src 代码隐藏类的文件名。
Strict 对于VB语言,告诉编译器使用选项strict模式。

实施指令

Implement指令指示网页,母版页或用户控制页面必须实现指定的.Net框架接口。

implements指令的基本语法是:

<%@ Implements  Interface="interface_name" %>

进口指令

Import指令将名称空间导入到网页,即应用程序的用户控制页面。 如果在global.asax文件中指定了Import指令,则它将应用于整个应用程序。 如果它位于用户控制页面的页面中,则它将应用于该页面或控件。

import指令的基本语法是:

<%@ namespace="System.Drawing" %>

主指令

Master指令将页面文件指定为mater页面。

示例MasterPage指令的基本语法是:

<%@ MasterPage Language="C#"  AutoEventWireup="true"  CodeFile="SiteMater.master.cs" Inherits="SiteMaster"  %>

MasterType指令

MasterType指令将类名分配给页面的Master属性,以使其强类型化。

MasterType指令的基本语法是:

<%@ MasterType attribute="value"[attribute="value" ...]  %>

OutputCache指令

OutputCache指令控制网页或用户控件的输出缓存策略。

OutputCache指令的基本语法是:

<%@ OutputCache Duration="15" VaryByParam="None"  %>

页面指​​令

Page指令定义特定于页面解析器和编译器的页面文件的属性。

Page指令的基本语法是:

<%@ Page Language="C#"  AutoEventWireup="true" CodeFile="Default.aspx.cs"  Inherits="_Default"  Trace="true" %>

Page指令的属性是:

属性 描述
AutoEventWireup 用于启用或禁用自动绑定到方法的页面事件的布尔值; 例如,Page_Load。
Buffer 用于启用或禁用HTTP响应缓冲的布尔值。
ClassName 页面的类名称。
ClientTarget 服务器控制的浏览器应呈现内容。
CodeFile 文件后面的代码名称。
Debug 用于启用或禁用使用调试符号进行编译的布尔值。
Description 页面的文本描述,由解析器忽略。
EnableSessionState 它启用,禁用或使会话状态为只读。
EnableViewState 布尔值,用于启用或禁用跨页面请求的视图状态。
ErrorPage 如果发生未处理的页面异常,则重定向的URL。
Inherits 后面的代码或其他类的名称。
Language 代码的编程语言。
Src 类后面的代码的文件名。
Trace 它启用或禁用跟踪。
TraceMode 它指示跟踪消息的显示方式,并按时间或类别排序。
Transaction 它指示是否支持事务。
ValidateRequest 布尔值,指示是否针对硬编码的值列表验证所有输入数据。

PreviousPageType指令

PreviousPageType指令为页面分配一个类,以便强类型页面。

示例PreviousPagetype指令的基本语法是:

<%@ PreviousPageType attribute="value"[attribute="value" ...]   %>

参考指令

Reference指令指示应编译另一个页面或用户控件并将其链接到当前页面。

Reference指令的基本语法是:

<%@ Reference Page ="somepage.aspx" %>

注册指令

Register衍生产品用于注册自定义服务器控件和用户控件。

Register指令的基本语法是:

<%@ Register Src="~/footer.ascx" TagName="footer" TagPrefix="Tfooter" %>

ASP.NET - Managing State

超文本传输​​协议(HTTP)是一种无状态协议。 当客户端与服务器断开连接时,ASP.NET引擎会丢弃页面对象。 这样,每个Web应用程序都可以向上扩展以同时处理大量请求,而不会耗尽服务器内存。

但是,需要一些技术来在请求之间存储信息并在需要时检索它。 此信息,即当前会话中当前用户的所有控件和变量的当前值称为State。

ASP.NET管理四种类型的状态:

  • 查看状态
  • 控制状态
  • 会话状态
  • 申请国

查看状态

视图状态是页面的状态及其所有控件。 它由ASP.NET框架自动维护。

将页面发送回客户端时,将确定页面属性及其控件的更改,并将其存储在名为_VIEWSTATE的隐藏输入字段的值中。 当页面再次回发时,_VIEWSTATE字段将通过HTTP请求发送到服务器。

可以启用或禁用视图状态:

  • 通过在web.config文件的“pages”部分中设置EnableViewState属性来完成The entire application

  • 通过设置Page指令的EnableViewState属性的页面,为“%@ Page Language =”C#“EnableViewState =”false“%”

  • 通过设置Control.EnableViewState属性的A control

它是使用StateBag类定义的视图状态对象实现的,该类定义了视图状态项的集合。 状态包是包含属性值对的数据结构,存储为与对象关联的字符串。

StateBag类具有以下属性:

属性 描述
Item(name) 具有指定名称的视图状态项的值。 这是StateBag类的默认属性。
Count 视图状态集合中的项目数。
Keys 集合中所有项目的密钥集合。
Values 集合中所有项的值的集合。

StateBag类具有以下方法:

方法 描述
Add(name, value) 将项添加到视图状态集合,并更新现有项。
Clear 从集合中删除所有项目。
Equals(Object) 确定指定的对象是否等于当前对象。
Finalize 允许它释放资源并执行其他清理操作。
GetEnumerator 返回一个枚举器,它迭代StateBag对象中存储的StateItem对象的所有键/值对。
GetType 获取当前实例的类型。
IsItemDirty 检查存储在StateBag对象中的StateItem对象,以评估它是否已被修改。
Remove(name) 删除指定的项目。
SetDirty 设置StateBag对象的状态以及它包含的每个StateItem对象的Dirty属性。
SetItemDirty 为StateBag对象中的指定StateItem对象设置Dirty属性。
ToString 返回表示状态bag对象的字符串。

例子 (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++;
   }
}

它会产生以下结果:

查看状态演示

控制状态

无法修改,直接访问或禁用控制状态。

会话状态

当用户连接到ASP.NET网站时,将创建一个新的会话对象。 打开会话状态时,将为每个新请求创建一个新的会话状态对象。 此会话状态对象成为上下文的一部分,并且可通过页面使用。

会话状态通常用于存储应用程序数据,例如库存,供应商列表,客户记录或购物车。 它还可以保留有关用户及其偏好的信息,并跟踪待处理的操作。

使用120位SessionID标识和跟踪会话,会话ID从客户端传递到服务器并作为cookie或修改后的URL返回。 SessionID是全球唯一且随机的。

会话状态对象是从HttpSessionState类创建的,该类定义会话状态项的集合。

HttpSessionState类具有以下属性:

属性 描述
SessionID 唯一会话标识符。
Item(name) 具有指定名称的会话状态项的值。 这是HttpSessionState类的默认属性。
Count 会话状态集合中的项目数。
TimeOut 获取并设置会话状态提供程序终止会话之前请求之间允许的时间(以分钟为单位)。

HttpSessionState类具有以下方法:

方法 描述
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;
}

上面的代码只存储Session字典对象中的字符串,但是,它可以存储所有原始数据类型和由原始数据类型组成的数组,以及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"];
   }
}

执行文件并观察其工作原理:

会话运行视图

申请国

ASP.NET应用程序是Web服务器上单个虚拟目录中所有网页,代码和其他文件的集合。 当信息存储在应用程序状态时,所有用户都可以使用它。

为了提供应用程序状态的使用,ASP.NET从HTTPApplicationState类为每个应用程序创建一个应用程序状态对象,并将此对象存储在服务器内存中。 该对象由类文件global.asax表示。

应用程序状态主要用于存储命中计数器和其他统计数据,全球应用程序数据,如税率,折扣率等,并保持用户访问该站点的跟踪。

HttpApplicationState类具有以下属性:

属性 描述
Item(name) 具有指定名称的应用程序状态项的值。 这是HttpApplicationState类的默认属性。
Count 应用程序状态集合中的项目数。

HttpApplicationState类具有以下方法:

方法 描述
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类

验证控件类继承自BaseValidator类,因此它们继承了它的属性和方法。 因此,有助于查看此基类的属性和方法,这些属性和方法对于所有验证控件都是通用的:

会员 描述
ControlToValidate 指示要验证的输入控件。
Display 指示错误消息的显示方式。
EnableClientScript 指示客户端验证是否需要。
Enabled 启用或禁用验证程序。
ErrorMessage 表示错误字符串。
Text 如果验证失败,则显示错误文本。
IsValid 指示控件的值是否有效。
SetFocusOnError 它表示如果控制无效,焦点应切换到相关的输入控制。
ValidationGroup 此控件所属的多个验证器的逻辑组。
Validate() 此方法重新验证控件并更新IsValid属性。

RequiredFieldValidator控件

RequiredFieldValidator控件确保必需字段不为空。 它通常绑定到文本框以强制输入文本框。

控件的语法如下:

<asp:RequiredFieldValidator ID="rfvcandidate" 
   runat="server" ControlToValidate ="ddlcandidate"
   ErrorMessage="Please choose a candidate" 
   InitialValue="Please choose a candidate">
</asp:RequiredFieldValidator>

RangeValidator控件

RangeValidator控件验证输入值是否在预定范围内。

它有三个特定属性:

属性 描述
Type 它定义了数据的类型。 可用值包括:Currency,Date,Double,Integer和String。
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控件将一个控件中的值与固定值或另一个控件中的值进行比较。

它具有以下特定属性:

属性 描述
Type 它指定数据类型。
ControlToCompare 它指定要与之比较的输入控件的值。
ValueToCompare 它指定要与之比较的常量值。
Operator 它指定比较运算符,可用值为:Equal,NotEqual,GreaterThan,GreaterThanEqual,LessThan,LessThanEqual和DataTypeCheck。

控件的基本语法如下:

<asp:CompareValidator ID="CompareValidator1" runat="server" 
   ErrorMessage="CompareValidator">
</asp:CompareValidator>

RegularExpressionValidator

RegularExpressionValidator允许通过匹配正则表达式的模式来验证输入文本。 正则表达式在ValidationExpression属性中设置。

下表总结了正则表达式常用的语法结构:

角色逃脱 描述
\b 匹配退格。
\t 匹配选项卡。
\r 匹配回车。
\v 匹配垂直选项卡。
\f 匹配表单Feed。
\n 匹配新行。
\ 逃避角色。

除了单字符匹配外,还可以指定一类可以匹配的字符,称为元字符。

元字符 描述
. 匹配除\ n之外的任何字符。
[abcd] 匹配集合中的任何字符。
[^abcd] 排除集合中的任何字符。
[2-7a-mA-M] 匹配范围中指定的任何字符。
\w 匹配任何字母数字字符和下划线。
\W 匹配任何非单词字符。
\s 匹配空白字符,如空格,制表符,换行符等。
\S 匹配任何非空白字符。
\d 匹配任何小数字符。
\D 匹配任何非小数字符。

可以添加量词来指定角色出现的次数。

量词 描述
* 零个或多个匹配。
+ 一场或多场比赛。
? 零或一个匹配。
{N} N匹配。
{N,} N个或更多匹配。
{N,M} N和M之间的比赛。

控件的语法如下:

<asp:RegularExpressionValidator ID="string" runat="server" ErrorMessage="string"
   ValidationExpression="string" ValidationGroup="string">
</asp:RegularExpressionValidator>

CustomValidator (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)

ValidationSummary控件不执行任何验证,但显示页面中所有错误的摘要。 摘要显示验证失败的所有验证控件的ErrorMessage属性的值。

以下两个相互包含的属性列出了错误消息:

  • ShowSummary :以指定格式显示错误消息。

  • ShowMessageBox :在单独的窗口中显示错误消息。

控件的语法如下:

<asp:ValidationSummary ID="ValidationSummary1" runat="server" 
   DisplayMode = "BulletList" ShowSummary = "true" HeaderText="Errors:" />

验证组

复杂页面在不同的面板中提供不同的信息组。 在这种情况下,可能需要单独为单独的组执行验证。 使用验证组处理这种情况。

要创建验证组,应通过设置其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文档
  • 业务对象
  • 平面文件

ASP.NET隐藏了复杂的数据访问过程,并提供了更高级别的类和对象,通过它们可以轻松访问数据。 这些类隐藏了连接,数据检索,数据查询和数据操作的所有复杂编码。

ADO.NET是提供各种ASP.NET控件对象和后端数据源之间桥梁的技术。 在本教程中,我们将简要介绍数据访问和使用数据。

检索并显示数据

在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站点并在Web表单上添加SqlDataSourceControl。

SqlDataSourceControl

(2)单击“配置数据源”选项。

配置数据源

(3)单击“新建连接”按钮以建立与数据库的连接。

与数据库连接

(4)建立连接后,您可以将其保存以供进一步使用。 在下一步,系统会要求您配置select语句:

选择声明

(5)选择列并单击“下一步”完成步骤。 观察WHERE,ORDER BY和高级按钮。 这些按钮允许您提供where子句,order by子句,并分别指定SQL的insert,update和delete命令。 这样,您就可以操纵数据。

(6)在表单上添加GridView控件。 选择数据源并使用自动套用格式选项格式化控件。

自动套用格式

(7)在此之后,格式化的GridView控件显示列标题,并且应用程序已准备好执行。

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对象:

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前缀,该前缀对DataSet的命名空间进行别名。
Relations 返回DataRelation对象的集合。
Tables 返回DataTable对象的集合。

下表显示了DataSet类的一些重要方法:

方法 描述
AcceptChanges 接受自加载DataSet或调用此方法以来所做的所有更改。
BeginInit 开始DataSet的初始化。 初始化在运行时发生。
Clear 清除数据。
Clone 复制DataSet的结构,包括所有DataTable模式,关系和约束。 不复制任何数据。
Copy 复制结构和数据。
CreateDataReader() 返回一个DataTableReader,每个DataTable有一个结果集,其顺序与表集合中显示的表相同。
CreateDataReader(DataTable[]) 返回一个DataTableReader,每个DataTable有一个结果集。
EndInit 结束数据集的初始化。
Equals(Object) 确定指定的Object是否等于当前的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() 从DataSet写入XML模式和数据。 此方法具有不同的重载形式。
WriteXMLSchema() 将DataSet的结构写为XML模式。 此方法具有不同的重载形式。

DataTable类

DataTable类表示数据库中的表。 它具有以下重要特性; 除了PrimaryKey属性之外,大多数这些属性都是只读属性:

属性 描述
ChildRelations 返回子关系的集合。
Columns 返回Columns集合。
Constraints 返回Constraints集合。
DataSet 返回父DataSet。
DefaultView 返回表的视图。
ParentRelations 返回ParentRelations集合。
PrimaryKey 获取或设置列数组作为表的主键。
Rows 返回Rows集合。

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

方法 描述
AcceptChanges 提交自上次AcceptChanges以来的所有更改。
Clear 清除表中的所有数据。
GetChanges 返回DataTable的副本,其中包含自调用AcceptChanges方法以来所做的所有更改。
GetErrors 返回有错误的行数组。
ImportRows 将新行复制到表中。
LoadDataRow 查找并更新特定行,或创建新行(如果未找到)。
Merge 将表与另一个DataTable合并。
NewRow 创建一个新的DataRow。
RejectChanges 回滚自上次调用AcceptChanges以来所做的所有更改。
Reset 将表重置为其原始状态。
Select 返回DataRow对象的数组。

DataRow类

DataRow对象表示表中的行。 它具有以下重要属性:

属性 描述
HasErrors 指示是否有任何错误。
Items 获取或设置存储在特定列中的数据。
ItemArrays 获取或设置行的所有值。
Table 返回父表。

下表显示了DataRow类的一些重要方法:

方法 描述
AcceptChanges 接受自调用此方法以来所做的所有更改。
BeginEdit 开始编辑操作。
CancelEdit 取消编辑操作。
Delete 删除DataRow。
EndEdit 结束编辑操作。
GetChildRows 获取此行的子行。
GetParentRow 获取父行。
GetParentRows 获取DataRow对象的父行。
RejectChanges 回滚自上次调用AcceptChanges以来所做的所有更改。

DataAdapter对象

DataAdapter对象充当DataSet对象和数据库之间的中介。 这有助于数据集包含来自多个数据库或其他数据源的数据。

DataReader对象

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()来创建表的列和行,以及向行添加数据。

执行页面时,它返回表格的行,如下所示:

ADO.Net结果

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类还具有以下只读属性:

属性 描述
FileBytes 返回要上载的文件中的字节数组。
FileContent 返回指向要上载的文件的流对象。
FileName 返回要上载的文件的名称。
HasFile 指定控件是否具有要上载的文件。
PostedFile 返回对上载文件的引用。

发布的文件封装在HttpPostedFile类型的对象中,可以通过FileUpload类的PostedFile属性进行访问。

HttpPostedFile类具有以下常用属性:

属性 描述
ContentLength 以字节为单位返回上载文件的大小。
ContentType 返回上载文件的MIME类型。
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控件及其属性的详细信息之前,让我们看一下广告文件的构造。

广告文件

广告文件是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元素:

元件 描述
Advertisements 附上广告文件。
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>

AdRotator类的属性和事件

AdRotator类派生自WebControl类并继承其属性。 除此之外,AdRotator类还具有以下属性:

属性 描述
AdvertisementFile 广告文件的路径。
AlternateTextFeild 提供备用文本的字段的元素名称。 默认值为AlternateText。
DataMember 未使用广告文件时要绑定的特定数据列表的名称。
DataSource 控制从哪里检索数据。
DataSourceID 从中检索数据的控件的ID。
Font 指定与广告标题控件关联的字体属性。
ImageUrlField 提供图像URL的字段的元素名称。 默认值为ImageUrl。
KeywordFilter 仅用于显示基于关键字的广告。
NavigateUrlField 提供要导航到的URL的字段的元素名称。 默认值为NavigateUrl。
Target 显示链接页面内容的浏览器窗口或框架。
UniqueID 获得AdRotator控件的唯一的,分层限定的标识符。

以下是AdRotator类的重要事件:

活动 描述
AdCreated 在创建控件之后,每次往返服务器时都会引发一次,但是在呈现页面之前
DataBinding 在服务器控件绑定到数据源时发生。
DataBound 在服务器控件绑定到数据源之后发生。
Disposed 从内存释放服务器控件时发生,这是请求ASP.NET页面时服务器控件生命周期的最后一个阶段
Init 在初始化服务器控件时发生,这是其生命周期的第一步。
Load 将服务器控件加载到Page对象时发生。
PreRender 在加载Control对象之后但在渲染之前发生。
Unload 从内存中卸载服务器控件时发生。

使用AdRotator Control

创建一个新网页并在其上放置AdRotator控件。

<form id="form1" runat="server">
   <div>
      <asp:AdRotator ID="AdRotator1" runat="server" AdvertisementFile  ="~/ads.xml" onadcreated="AdRotator1_AdCreated" />
   </div>
</form>

ads.xml文件和图像文件应位于网站的根目录中。

尝试执行上述应用程序并观察每次重新加载页面时,广告都会更改。

ASP.NET - Calendars

日历控件是功能丰富的Web控件,它提供以下功能:

  • 一次显示一个月
  • 选择一天,一周或一个月
  • 选择一个天数范围
  • 每月搬家
  • 以编程方式控制日期的显示

日历控件的基本语法是:

<asp:Calender ID = "Calendar1" runat = "server">
</asp:Calender>

Calendar控件的属性和事件

日历控件具有许多属性和事件,您可以使用它们自定义控件的操作和显示。 下表提供了Calendar控件的一些重要属性:

属性 描述
Caption 获取或设置日历控件的标题。
CaptionAlign 获取或设置标题的对齐方式。
CellPadding 获取或设置数据与单元格边框之间的空格数。
CellSpacing 获取或设置单元格之间的空间。
DayHeaderStyle 获取显示星期几的部分的样式属性。
DayNameFormat 获取或设置星期几的格式。
DayStyle 获取显示月份中日期的样式属性。
FirstDayOfWeek 获取或设置要在第一列中显示的星期几。
NextMonthText 获取或设置下个月导航控件的文本。 默认值为>。
NextPrevFormat 获取或设置下一个和上个月导航控件的格式。
OtherMonthDayStyle 获取Calendar控件上不在显示的月份中的日期的样式属性。
PrevMonthText 获取或设置上个月导航控件的文本。 默认值为
SelectedDate 获取或设置所选日期。
SelectedDates 获取表示所选日期的DateTime对象的集合。
SelectedDayStyle 获取所选日期的样式属性。
SelectionMode 获取或设置选择模式,指定用户是选择单日,一周还是整月。
SelectMonthText 获取或设置选择器列中月份选择元素的文本。
SelectorStyle 获取周和月选择器列的样式属性。
SelectWeekText 获取或设置选择器列中为week选择元素显示的文本。
ShowDayHeader 获取或设置指示是否显示星期几的标题的值。
ShowGridLines 获取或设置指示是否显示网格线的值。
ShowNextPrevMonth 获取或设置一个值,该值指示标题部分中是否显示下一个和上个月的导航元素。
ShowTitle 获取或设置一个值,该值指示是否显示标题部分。
TitleFormat 获取或设置标题部分的格式。
Titlestyle 获取Calendar控件的标题标题的样式属性。
TodayDayStyle 获取Calendar控件上今天日期的样式属性。
TodaysDate 获取或设置今天日期的值。
UseAccessibleHeader 获取或设置一个值,该值指示是否为日标题而不是表数据 HTML元素呈现表标题 HTML元素。
VisibleDate 获取或设置指定要显示的月份的日期。
WeekendDayStyle 获取Calendar控件上周末日期的样式属性。

Calendar控件具有以下三个最重要的事件,允许开发人员对日历控件进行编程。 他们是:

活动 描述
SelectionChanged 当选择一天,一周或整个月时,它会被提升。
DayRender 在呈现日历控件的每个数据单元时引发它。
VisibleMonthChanged 当用户更改一个月时会引发此问题。

使用日历控件

放置一个没有任何代码隐藏文件的裸骨日历控件可为站点提供可行的日历,该日历显示一年中的月份和日期。 它还允许导航到下个月和前几个月。

日历

日历控件允许用户选择一天,一周或整个月。 这是通过使用SelectionMode属性完成的。 此属性具有以下值:

属性 描述
Day 选择一天。
DayWeek 选择一天或整周。
DayWeekMonth 选择一天,一周或整个月。
None 没有什么可以选择。

选择日期的语法:

<asp:Calender ID = "Calendar1" runat = "server" SelectionMode="DayWeekMonth">
</asp:Calender>

当选择模式设置为值DayWeekMonth时,会出现带有>符号的额外列以选择周,并且日期名称左侧会显示>>符号以选择月份。

CALENDAR2

例子 (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();
}

运行该文件时,它应生成以下输出:

Calendar3

ASP.NET - Multi Views

MultiView和View控件允许您将页面内容划分为不同的组,一次只显示一个组。 每个View控件管理一组内容,所有View控件都在MultiView控件中保存在一起。

MultiView控件负责一次显示一个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>

View和MultiView控件的属性

View和MultiView控件都派生自Control类,并继承其所有属性,方法和事件。 View控件最重要的属性是Boolean类型的Visible属性,它设置视图的可见性。

MultiView控件具有以下重要属性:

属性 描述
Views MultiView中的View控件集合。
ActiveViewIndex 基于零的索引,表示活动视图。 如果没有活动视图,则索引为-1。

与MultiView控件的导航关联的按钮控件的CommandName属性与MultiView控件的某些相关字段相关联。

例如,如果具有CommandName值的按钮控件作为NextView与多视图的导航相关联,则在单击按钮时它会自动导航到下一个视图。

下表显示了上述属性的默认命令名称:

属性 描述
NextViewCommandNameNextView
PreviousViewCommandNamePrevView
SwitchViewByIDCommandNameSwitchViewByID
SwitchViewByIndexCommandNameSwitchViewByIndex

多视图控件的重要方法是:

方法 描述
SetActiveview 设置活动视图
GetActiveview 检索活动视图

每次更改视图时,页面都会回发到服务器并引发一些事件。 一些重要事件是:

活动 描述
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

Panel控件用作页面上其他控件的容器。 它控制它包含的控件的外观和可见性。 它还允许以编程方式生成控件。

面板控件的基本语法如下:

<asp:Panel ID= "Panel1"  runat = "server">
</asp:Panel>

Panel控件派生自WebControl类。 因此它继承了它的所有属性,方法和事件。 它没有任何自己的方法或事件。 但是它具有以下属性:

属性 描述
BackImageUrl 面板背景图像的URL。
DefaultButton 获取或设置Panel控件中包含的默认按钮的标识符。
Direction 面板中的文字方向。
GroupingText 允许将文本分组为字段。
HorizontalAlign 面板中内容的水平对齐。
ScrollBars 指定面板中滚动条的可见性和位置。
Wrap 允许文字换行。

使用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)

以下示例演示了动态内容生成。 用户提供要在面板上生成的标签控件和文本框的数量。 控件以编程方式生成。

使用属性窗口更改面板的属性。 在设计视图上选择控件时,属性窗口将显示该特定控件的属性,并允许您在不键入的情况下进行更改。

是Panel2

该示例的源文件如下:

<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 />"));
      }
   }
}

执行时,面板呈现为:

·Panel3中

ASP.NET - Ajax Control

AJAX代表异步JavaScript和XML。 这是一种跨平台技术,可加快响应时间。 AJAX服务器控制将脚本添加到由浏览器执行和处理的页面。

但是,与其他ASP.NET服务器控件一样,这些AJAX服务器控件也可以具有与它们关联的方法和事件处理程序,这些处理程序在服务器端进行处理。

Visual Studio IDE中的控件工具箱包含一组名为“AJAX Extensions”的控件

AJAX扩展

ScriptManager控件

ScriptManager控件是最重要的控件,必须出现在页面上才能使其他控件生效。

它有基本语法:

<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>

如果您创建“Ajax Enabled site”或从“Add Item”对话框添加“AJAX Web Form”,Web表单将自动包含脚本管理器控件。 ScriptManager控件负责所有服务器端控件的客户端脚本。

UpdatePanel控件

UpdatePanel控件是一个容器控件,派生自Control类。 它充当其中的子控件的容器,并且没有自己的接口。 当其中的控件触发回发时,UpdatePanel会介入以异步启动帖子并仅更新页面的该部分。

例如,如果按钮控件位于更新面板内并且单击它,则只会更新更新面板中的控件,不会影响页面其他部分的控件。 这称为部分回发或异步回发。

例子 (Example)

在您的应用程序中添加AJAX Web表单。 它默认包含脚本管理器控件。 插入更新面板。 在更新面板控件中放置一个按钮控件和一个标签控件。 在面板外放置另一组按钮和标签。

设计视图如下所示:

的ScriptManager

源文件如下:

<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属性来更改此默认模式。 我们来看看更新面板的其他属性。

UpdatePanel控件的属性

下表显示了更新面板控件的属性:

属性 描述
ChildrenAsTriggers 此属性指示回发是否来自子控件,这会导致更新面板刷新。
ContentTemplate 它是内容模板,用于定义呈现时更新面板中显示的内容。
ContentTemplateContainer 检索动态创建的模板容器对象,并用于以编程方式添加子控件。
IsInPartialRendering 指示面板是否作为部分回发的一部分进行更新。
RenderMode 显示渲染模式。 可用的模式是Block和Inline。
UpdateMode 通过确定某些条件来获取或设置渲染模式。
Triggers 定义每个与事件对应的集合触发器对象,从而使面板自动刷新。

UpdatePanel控件的方法

下表显示了更新面板控件的方法:

方法 描述
CreateContentTemplateContainer 创建一个Control对象,该对象充当定义UpdatePanel控件内容的子控件的容器。
CreateControlCollection 返回UpdatePanel控件中包含的所有控件的集合。
Initialize 如果启用了部分页面呈现,则初始化UpdatePanel控件触发器集合。
Update 导致更新UpdatePanel控件的内容。

更新面板的行为取决于UpdateMode属性和ChildrenAsTriggers属性的值。

的UpdateMode ChildrenAsTriggers 影响
AlwaysFalse 非法参数。
AlwaysTrue 如果整个页面刷新或其上的子控件回发,UpdatePanel将刷新。
ConditionalFalse 如果整个页面刷新或其外部的触发控件启动刷新,UpdatePanel将刷新。
ConditionalTrue 如果整个页面刷新或其上的子控件回发或其外部的触发控件启动刷新,UpdatePanel将刷新。

UpdateProgress控件

当正在更新一个或多个更新面板控件时,UpdateProgress控件在浏览器上提供一种反馈。 例如,当用户在执行某些面向数据库的作业时登录或等待服务器响应。

它提供了一个视觉确认,如“正在加载页面......”,表明工作正在进行中。

UpdateProgress控件的语法是:

<asp:UpdateProgress ID="UpdateProgress1" runat="server" DynamicLayout="true" 
   AssociatedUpdatePanelID="UpdatePanel1" >
   <ProgressTemplate>
      Loading...
   </ProgressTemplate>
</asp:UpdateProgress>

上面的代码段显示了ProgressTemplate标记内的一条简单消息。 但是,它可能是图像或其他相关控件。 UpdateProgress控件显示每个异步回发,除非使用AssociatedUpdatePanelID属性将其分配给单个更新面板。

UpdateProgress控件的属性

下表显示了更新进度控件的属性:

属性 描述
AssociatedUpdatePanelID 获取并设置与此控件关联的更新面板的ID。
Attributes 获取或设置UpdateProgress控件的级联样式表(CSS)属性。
DisplayAfter 获取并设置显示进度模板的时间(以毫秒为单位)。 默认值为500。
DynamicLayout 指示是否动态呈现进度模板。
ProgressTemplate 表示在异步回发期间显示的模板,其占用的时间比DisplayAfter时间长。

UpdateProgress控件的方法

下表显示了更新进度控制的方法:

方法 描述
GetScriptDescriptors 返回UpdateProgress控件的客户端功能所需的组件,行为和客户端控件的列表。
GetScriptReferences 返回UpdateProgress控件的客户端脚本库依赖项列表。

定时器控制

定时器控件用于自动启动回发。 这可以通过两种方式完成:

(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文档或自定义类,并帮助:

  • 管理连接
  • 选择数据
  • 管理表示方面,如分页,缓存等。
  • 操纵数据

ASP.NET中有许多数据源控件可用于从SQL Server,ODBC或OLE DB服务器,XML文件和业务对象访问数据。

根据数据类型,这些控件可分为两类:

  • 分层数据源控件
  • 基于表的数据源控件

用于分层数据的数据源控件是:

  • XMLDataSource - 它允许绑定带有或不带有架构信息的XML文件和字符串。

  • SiteMapDataSource - 它允许绑定到提供站点地图信息的提供程序。

用于表格数据的数据源控件是:

数据源控件 描述
SqlDataSource 它表示与返回SQL数据的ADO.NET数据提供程序的连接,包括可通过OLEDB和ODBC访问的数据源。
ObjectDataSource 它允许绑定到返回数据的自定义.Net业务对象。
LinqdataSource 它允许绑定到Linq-to-SQL查询的结果(仅受ASP.NET 3.5支持)。
AccessDataSource 它表示与Microsoft Access数据库的连接。

数据源视图

数据源视图是DataSourceView类的对象。 它代表不同数据操作(如排序,过滤等)的数据自定义视图。

DataSourceView类充当所有数据源视图类的基类,这些类定义数据源控件的功能。

下表提供了DataSourceView类的属性:

属性 描述
CanDelete 指示是否允许在基础数据源上进行删除。
CanInsert 指示是否允许在基础数据源上插入。
CanPage 指示是否允许在基础数据源上进行分页。
CanRetrieveTotalRowCount 指示总行数信息是否可用。
CanSort 指示是否可以对数据进行排序。
CanUpdate 指示是否允许在基础数据源上进行更新。
Events 获取数据源视图的事件处理程序委托列表。
Name 视图的名称。

下表提供了DataSourceView类的方法:

方法 描述
CanExecute 确定是否可以执行指定的命令。
ExecuteCommand 执行特定命令。
ExecuteDelete 对DataSourceView对象表示的数据列表执行删除操作。
ExecuteInsert 对DataSourceView对象表示的数据列表执行插入操作。
ExecuteSelect 从基础数据存储中获取数据列表。
ExecuteUpdate 对DataSourceView对象表示的数据列表执行更新操作。
Delete 对与视图关联的数据执行删除操作。
Insert 对与视图关联的数据执行插入操作。
Select 返回查询的数据。
Update 对与视图关联的数据执行更新操作。
OnDataSourceViewChanged 引发DataSourceViewChanged事件。
RaiseUnsupportedCapabilitiesError 由RaiseUnsupportedCapabilitiesError方法调用,以将ExecuteSelect操作请求的功能与视图支持的功能进行比较。

SqlDataSource控件

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控件的相关属性集,它提供了控件的编程接口:

物业集团 描述

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>

ObjectDataSource控件

ObjectDataSource控件允许用户定义的类将其方法的输出与数据绑定控件相关联。 该类的编程接口与SqlDataSource控件几乎相同。

以下是绑定业务对象的两个重要方面:

  • 可绑定类应该具有默认构造函数,它应该是无状态的,并且具有可以映射到选择,更新,插入和删除语义的方法。

  • 对象必须一次更新一个项目,不支持批处理操作。

让我们直接进入一个使用此控件的示例。 student类是与对象数据源一起使用的类。 该课程有三个属性:学生ID,姓名和城市。 它有一个默认构造函数和一个用于检索数据的GetStudents方法。

学生班:

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表单中。

  • 通过选择对象来配置数据源。

选择对象
  • 为数据的不同操作选择一种数据方法。 在此示例中,只有一种方法。

选择一种数据方法
  • 在页面上放置数据绑定控件(如网格视图),并选择对象数据源作为其基础数据源。

数据绑定控制
  • 在此阶段,设计视图应如下所示:

对象数据源
  • 运行该项目,它从学生class中检索硬编码元组。

对象数据结果

AccessDataSource控件

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表单控件都从其父Control类继承DataBind方法,这为其提供了将数据绑定到至少一个属性的固有功能。 这称为simple data bindinginline data binding

简单数据绑定涉及将实现IEnumerable接口的任何集合(项集合)或DataSet和DataTable类附加到控件的DataSource属性。

另一方面,某些控件可以通过DataSource控件将记录,列表或数据列绑定到其结构中。 这些控件派生自BaseDataBoundControl类。 这称为declarative data binding

数据源控件可帮助数据绑定控件实现诸如排序,分页和编辑数据集合等功能。

BaseDataBoundControl是一个抽象类,它由两个更抽象的类继承:

  • DataBoundControl
  • HierarchicalDataBoundControl

抽象类DataBoundControl再次由两个更抽象的类继承:

  • ListControl
  • CompositeDataBoundControl

能够进行简单数据绑定的控件是从ListControl抽象类派生的,这些控件是:

  • BulletedList
  • CheckBoxList
  • DropDownList
  • ListBox
  • RadioButtonList

能够进行声明性数据绑定的控件(更复杂的数据绑定)是从抽象类CompositeDataBoundControl派生的。 这些控件是:

  • DetailsView
  • FormView
  • GridView
  • RecordList

简单的数据绑定

简单数据绑定涉及只读选择列表。 这些控件可以绑定到数组中的数组列表。 选择列表从数据库或数据源中获取两个值; 列表显示一个值,另一个值被视为与显示对应的值。

让我们举一个小例子来理解这个概念。 创建一个带有项目符号列表和SqlDataSource控件的网站。 配置数据源控件以从数据库中检索两个值(我们使用与上一章相同的DotNetReferences表)。

为项目符号列表控件选择数据源包括:

  • 选择数据源控件
  • 选择要显示的字段,称为数据字段
  • 选择值的字段
选择数据源

执行应用程序时,检查整个标题列是否绑定到项目符号列表并显示。

选择数据源2

声明性数据绑定

我们已经使用GridView控件在上一个教程中使用了声明性数据绑定。 能够以表格方式显示和操作数据的其他复合数据绑定控件是DetailsView,FormView和RecordList控件。

在下一个教程中,我们将研究处理数据库的技术,即ADO.NET。

但是,数据绑定涉及以下对象:

  • 存储从数据库检索的数据的数据集。

  • 数据提供程序,它通过连接使用命令从数据库中检索数据。

  • 发出存储在命令对象中的select语句的数据适配器; 它还能够通过发出Insert,Delete和Update语句来更新数据库中的数据。

数据绑定对象之间的关系:

声明性数据绑定

例子 (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

用户控制

用户控件的行为类似于微型ASP.NET页面或Web表单,可以被许多其他页面使用。 它们派生自System.Web.UI.UserControl类。 这些控件具有以下特征:

  • 他们有.ascx扩展名。
  • 它们可能不包含任何,或
    标记。
  • 它们具有Control指令而不是Page指令。

为了理解这个概念,让我们创建一个简单的用户控件,它将作为网页的页脚。 要创建和使用用户控件,请执行以下步骤:

  • 创建一个新的Web应用程序。
  • 右键单击Solution Explorer上的项目文件夹,然后选择Add New Item。 添加新项目
  • 从“添加新项”对话框中选择“Web用户控件”,并将其命名为footer.ascx。 最初,footer.ascx仅包含Control指令。

    <%@ 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" />

自定义控件

自定义控件作为单独的程序集部署。 它们被编译为动态链接库(DLL)并用作任何其他ASP.NET服务器控件。 它们可以通过以下任一方式创建:

  • 通过从现有控件派生自定义控件
  • 通过组合一个新的自定义控件组合两个或多个现有控件。
  • 通过从基类控件类派生。

为了理解这个概念,让我们创建一个自定义控件,它只是在浏览器上呈现文本消息。 要创建此控件,请执行以下步骤:

创建一个新网站。 右键单击解决方案资源管理器中树顶部的解决方案(而不是项目)。

Solution Explorer

在“新建项目”对话框中,从项目模板中选择“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属性在浏览器上呈现,如下所示:

定制服务器控件

使用自定义控件

在上一个示例中,设置了自定义控件的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的方法,它给它一个检查回文的能力。

回文是反转时拼写相同的单词/文字。 例如,马拉雅拉姆语,女士,萨拉斯等。

扩展自定义控件的代码,该代码应如下所示:

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;
         }
      }
   }
}

更改控件的代码时,必须通过单击“生成” - >“生成解决方案”来构建解决方案,以便更改反映在项目中。 向页面添加文本框和按钮控件,以便用户可以提供文本,在单击按钮时检查其是否为回文。

<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事件处理程序只是将文本框中的文本复制到自定义控件的text属性。

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提供个性化网站的服务,以满足特定客户的口味和偏好。

了解配置文件

ASP.NET个性化服务基于用户配置文件。 用户配置文件定义了网站所需用户的信息类型。 例如,姓名,年龄,地址,出生日期和电话号码。

此信息在应用程序的web.config文件中定义,ASP.NET运行时读取并使用它。 这项工作由个性化提供商完成。

从用户数据获取的用户配置文件存储在ASP.NET创建的默认数据库中。 您可以创建自己的数据库来存储配置文件。 配置文件数据定义存储在配置文件web.config中。

例子 (Example)

让我们创建一个示例站点,我们希望我们的应用程序记住用户详细信息,如姓名,地址,出生日期等。在元素的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_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;
         }
      }
   }
}

为Submit按钮编写以下处理程序,以便将用户数据保存到配置文件中:

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();
   }
}

当页面第一次执行时,用户需要输入信息。 但是,下次将自动加载用户详细信息。

元素的属性

除了我们使用的名称和类型属性之外,元素还有其他属性。 下表说明了其中一些属性:

属性 描述
name 该物业的名称。
type 默认情况下,类型为字符串,但它允许任何完全限定的类名作为数据类型。
serializeAs 序列化此值时使用的格式。
readOnly 无法更改只读配置文件值,默认情况下此属性为false。
defaultValue 如果配置文件不存在或没有信息,则使用的默认值。
allowAnonymous 一个布尔值,指示此属性是否可以与匿名配置文件一起使用。
Provider 应该用于管理此属性的配置文件提供程序。

匿名个性化

匿名个性化允许用户在识别自己之前个性化网站。 例如,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

要启用页面级别跟踪,您需要修改Page指令并添加Trace属性,如下所示:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
   Inherits="errorhandling._Default" <b class="notranslate">Trace</b> ="true" %>

现在,当您执行该文件时,您将获得跟踪信息:

追踪信息

它在顶部提供以下信息:

  • 会话ID
  • 状态代码
  • 请求时间
  • 请求类型
  • 请求和响应编码

每次请求页面时,从服务器发送的状态代码显示错误的名称和时间(如果有)。 下表显示了常见的HTTP状态代码:

描述
Informational (100 - 199)
100Continue
101 切换协议
Successful (200 - 299)
200OK
204 无内容
Redirection (300 - 399)
301 永久移动
305 使用代理服务器
307 临时重定向
Client Errors (400 - 499)
400 错误的请求
402 需要付款
404 未找到
408 请求超时
417 期望失败了
Server Errors (500 - 599)
500 内部服务器错误
503 暂停服务
505 不支持HTTP版本

在顶级信息下,有Trace log,它提供页面生命周期的详细信息。 它提供自页面初始化以来经过的时间(以秒为单位)。

追踪Info2

下一节是控制树,它以分层方式列出页面上的所有控件:

追踪Info3

最后在会话和应用程序状态摘要,cookie和标头集合中,后跟所有服务器变量的列表。

Trace对象允许您将自定义信息添加到跟踪输出。 它有两种方法可以实现: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 = 
      .......................
   }
}

运行以观察效果:

追踪Info4

要检查Warn方法,让我们在选定的索引更改事件处理程序中强制输入一些错误代码:

try
{
   int a = 0;
   int b = 9/a;
}
catch (Exception e)
{
   Trace.Warn("UserAction", "processing 9/a", e);
}

Try-Catch是一个C#编程结构。 try块保存可能产生或不产生错误的任何代码,catch块捕获错误。 程序运行时,它会在跟踪日志中发送警告。

追踪Info5

应用程序级别跟踪适用于网站中的所有页面。 它是通过在web.config文件中放入以下代码行来实现的:

<system.web>
   <trace enabled="true" />
</system.web>

错误处理

尽管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>

部分具有可能的属性:

  • Mode :启用或禁用自定义错误页面。 它有三个可能的值:

    • On :显示自定义页面。
    • Off :显示ASP.NET错误页面(黄页)
    • remoteOnly :它向客户端显示自定义错误,在本地显示ASP.NET错误。
  • defaultRedirect :它包含在未处理错误的情况下要显示的页面的URL。

要为不同类型的错误添加不同的自定义错误页面,将使用子标记,其中根据错误的状态代码指定不同的错误页面。

要实现页面级错误处理,可以修改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>

“调试”工具栏提供了可用于调试的所有工具:

调试工具栏

断点(Breakpoints)

断点指定运行特定行代码然后停止执行的运行时,以便检查代码并执行各种调试作业,例如,更改变量的值,逐步执行代码,移入和移出函数和方法等等

要设置断点,请右键单击代码并选择插入断点。 左边缘出现一个红点,代码行突出显示如下:

打破突出

接下来,当您执行代码时,您可以观察其行为。

打破突出2

在此阶段,您可以单步执行代码,观察执行流程并检查变量,属性,对象等的值。

您可以通过右键单击断点字形从“属性”菜单中修改断点的属性:

打破下拉列表

位置对话框显示文件的位置,行号和所选代码的字符编号。 条件菜单项允许您输入有效的表达式,该表达式在程序执行到达断点时进行评估:

打破条件

“命中计数”菜单项显示一个对话框,显示断点已执行的次数。

突破点

单击下拉列表中显示的任何选项将打开一个编辑字段,其中输入目标点击计数。 这在分析代码中的循环结构时特别有用。

打破Point2

“过滤器”菜单项允许设置过滤器,用于指定断点有效的机器,进程或线程或任何组合。

打破过滤器

When Hit菜单项允许您指定在达到断点时要执行的操作。

打破点3

调试Windows

Visual Studio提供以下调试窗口,每个窗口都显示一些程序信息。 下表列出了窗口:

窗口 描述
Immediate 显示变量和表达式。
Autos 显示当前和先前语句中的所有变量。
Locals 显示当前上下文中的所有变量。
Watch 最多显示四组不同的变量。
调用堆栈 显示调用堆栈中的所有方法。
Threads 显示和控制线程。

ASP.NET - LINQ

大多数应用程序都是以数据为中心的,但大多数数据存储库都是关系数据库。 多年来,设计人员和开发人员基于对象模型设计了应用程序。

对象负责连接到数据访问组件 - 称为数据访问层(DAL)。 在这里我们要考虑三点:

  • 应用程序中所需的所有数据都不存储在同一个源中。 源可以是关系数据库,某些业务对象,XML文件或Web服务。

  • 访问内存中对象比从数据库或XML文件访问数据更简单,更便宜。

  • 访问的数据不直接使用,但需要进行排序,排序,分组,更改等。

因此,如果有一个工具可以轻松实现所有类型的数据访问,允许从这些不同的数据源连接数据并执行标准的数据处理操作,那么在几行代码中,它将会有很大的帮助。

LINQ或语言集成查询就是这样一种工具。 LINQ是.Net Framework 3.5及其托管语言的扩展,用于将查询设置为对象。 它定义了一种通用语法和编程模型,以使用通用语言查询不同类型的数据。

Select,Project,Join,Group,Partition,Set operations等关系运算符在LINQ中实现,.Net framework 3.5中的C#和VB编译器支持LINQ语法,可以使用配置的数据存储而不诉诸ADO.NET。

例如,使用C#中的LINQ查询查询Northwind数据库中的Customers表,代码如下:

var data = from c in dataContext.Customers
where c.Country == "Spain"
select c;

哪里:

  • 'from'关键字在逻辑上循环遍历集合的内容。

  • 将为集合中的每个对象评估带有'where'关键字的表达式。

  • 'select'语句选择要添加到返回列表的计算对象。

  • 'var'关键字用于变量声明。 由于返回对象的确切类型未知,因此表明将动态推断信息。

LINQ查询可以应用于从IEnumerable 继承的任何数据承载类,这里T是任何数据类型,例如List

让我们看一个例子来理解这个概念。 该示例使用以下类: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结果

上面的LINQ表达式:

var booktitles = 
from b in books 
select b.Title;

等效于以下SQL查询:

SELECT Title from Books

LINQ运算符

除了目前使用的运算符之外,还有其他几个运算符,它们实现了所有查询子句。 让我们看看一些运算符和子句。

Join子句

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);
}

结果页面如下所示:

LINQ结果2

Where子句

'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的那些行:

LINQ结果3

Orderby和Orderbydecending条款

这些子句允许对查询结果进行排序。 要查询按照价格排序的书名,页数和书价,请在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};

返回的元组是:

LINQ结果4

Let子句

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};

生成的查询页面如下所示:

LINQ结果5

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允许您通过Web站点管理工具轻松实现用户创建,身份验证和授权,而无需编写任何代码。 此工具允许创建用户和角色。

除此之外,ASP.NET还带有现成的登录控件集,它具有为您执行所有作业的控件。

实现基于表单的安全性

要设置基于表单的身份验证,您需要以下内容:

  • 用于支持身份验证过程的用户数据库
  • 使用数据库的网站
  • 用户帐户
  • 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) :从工具箱的登录部分将WelcomeStatus控件放在Welcome.aspx上。 它有两个模板:LoggedIn和LoggedOut。

在LoggedOut模板中,有一个登录链接,在LoggedIn模板中,控件上有一个注销链接。 您可以从“属性”窗口更改控件的登录和注销文本属性。

登录状态控制

Step (7) :从LoginStatus控件下面的工具箱中放置一个LoginView控件。 在这里,您可以根据用户是否登录显示文本和其他控件(超链接,按钮等)。

此控件有两个视图模板:匿名模板和LoggedIn模板。 选择每个视图并为要为每个模板显示的用户编写一些文本。 文本应放在标记为红色的区域。

登录视图控件

Step (8) :应用程序的用户由开发者创建。 您可能希望允许访问者创建用户帐户。 为此,在LoginView控件下添加一个链接,该链接应链接到CreateAccount.aspx页面。

Step (9) :在创建帐户页面上放置一个CreateUserWizard控件。 将此控件的ContinueDestinationPageUrl属性设置为Welcome.aspx。

CreateUserWizard控件

Step (10) :创建登录页面。 在页面上放置一个Login控件。 LoginStatus控件自动链接到Login.aspx。 要更改此默认值,请在web.config文件中进行以下更改。

例如,如果要将登录页面命名为signup.aspx,请将以下行添加到web.config的部分:

<configuration>
   <system.web>
      <authentication mode="Forms">
         <forms loginUrl ="signup.aspx" defaultUrl = “Welcome.aspx† />
      </authentication>
   </system.web>
</configuration>

Step (11) :用户经常忘记密码。 PasswordRecovery控件可帮助用户访问该帐户。 选择“登录”控件。 打开其智能标记,然后单击“转换为模板”。

自定义控件的UI以在登录按钮下放置一个超链接控件,该按钮控件应链接到PassWordRecovery.aspx。

PasswordRecovery控件

Step (12) :在密码恢复页面上放置一个PasswordRecovery控件。 此控件需要电子邮件服务器将密码发送给用户。

PasswordRecovery控件2

Step (13) :在Welcome.aspx中的LoginView控件的LoggedIn模板中创建指向ChangePassword.aspx页面的链接。

ChangePassword控件

Step (14) :在更改密码页面上放置ChangePassword控件。 此控件还有两个视图。

ChangePassword control2

现在运行应用程序并观察不同的安全操作。

要创建角色,请返回Web应用程序管理工具,然后单击“安全”选项卡。 单击“创建角色”并为应用程序创建一些角色。

Web应用程序管理

单击“管理用户”链接并为用户分配角色。

管理用户

IIS身份验证:SSL

安全套接字层或SSL是用于确保安全连接的协议。 启用S​​SL后,浏览器会加密发送到服务器的所有数据,并解密来自服务器的所有数据。 同时,服务器对浏览器的所有数据进行加密和解密。

安全连接的URL以HTTPS而不是HTTP开头。 浏览器使用安全连接显示小锁。 当浏览器初始尝试使用SSL通过安全连接与服务器通信时,服务器通过发送其数字证书进行身份验证。

要使用SSL,您需要从受信任的证书颁发机构(CA)购买数字安全证书,并将其安装在Web服务器中。 以下是一些值得信赖和声誉的认证机构:

  • www.verisign.com
  • www.geotrust.com
  • www.thawte.com

SSL内置于所有主流浏览器和服务器中。 要启用SSL,您需要安装数字证书。 各种数字证书的强度取决于加密期间生成的密钥长度。 更长,更安全的是证书,因此连接。

强度 描述
40位 大多数浏览器都支持但容易破解。
56位 比40位更强。
128位 非常难以打破,但所有浏览器都不支持它。

ASP.NET - Data Caching

什么是缓存?

高速缓存是一种将经常使用的数据/信息存储在存储器中的技术,因此,当下次需要相同的数据/信息时,可以直接从存储器中检索它而不是由应用程序生成。

缓存对于ASP.NET中的性能提升非常重要,因为页面和控件是在此处动态生成的。 这对于数据相关的交易尤其重要,因为这些交易在响应时间方面是昂贵的。

高速缓存将经常使用的数据放置在快速访问的媒体中,例如计算机的随机存取存储器。 ASP.NET运行时包含一个名为cache的CLR对象的键值映射。 它驻留在应用程序中,可通过HttpContext和System.Web.UI.Page获得。

在某些方面,缓存类似于存储状态对象。 但是,状态对象中的存储信息是确定性的,即,您可以依赖存储在那里的数据,并且数据的缓存是不确定的。

在以下情况下,数据将不可用:

  • 如果它的寿命到期,
  • 如果应用程序释放其内存,
  • 如果由于某种原因没有进行缓存。

您可以使用索引器访问缓存中的项目,并可以控制缓存中对象的生命周期,并设置缓存对象与其物理源之间的链接。

在ASP.Net中缓存

ASP.NET提供以下不同类型的缓存:

  • Output Caching :输出缓存存储最终呈现的HTML页面的副本或发送到客户端的部分页面。 当下一个客户端请求此页面时,不会重新生成页面,而是发送页面的缓存副本,从而节省时间。

  • Data Caching :数据缓存意味着缓存数据源中的数据。 只要缓存未过期,就会从缓存中完成对数据的请求。 当缓存过期时,数据源获取新数据并重新填充缓存。

  • Object Caching :对象缓存是缓存页面上的对象,例如数据绑定控件。 缓存的数据存储在服务器内存中。

  • Class Caching :第一次运行时,网页或Web服务被编译到程序集中的页面类中。 然后将程序集缓存在服务器中。 下次对页面或服务发出请求时,将引用缓存的程序集。 更改源代码后,CLR将重新编译程序集。

  • Configuration Caching :应用程序范围的配置信息存储在配置文件中。 配置缓存将配置信息存储在服务器内存中。

在本教程中,我们将考虑输出缓存,数据缓存和对象缓存。

输出缓存

渲染页面可能涉及一些复杂的过程,例如数据库访问,渲染复杂控件等。输出缓存允许通过在内存中缓存数据来绕过到服务器的往返。 甚至可以缓存整个页面。

OutputCache指令负责输出缓存。 它启用输出缓存并对其行为提供某些控制。

OutputCache指令的语法:

<%@ OutputCache Duration="15" VaryByParam="None" %>

将此指令放在page指令下。 这告诉环境将页面缓存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指令具有以下属性,这有助于控制输出缓存的行为:

属性 描述
DiskCacheabletrue/false 指定可以将输出写入基于磁盘的缓存。
NoStoretrue/false 指定是否发送“no store”缓存控制头。
CacheProfile 字符串名称 要存储在web.config中的缓存配置文件的名称。
VaryByParam

没有

*

参数名称
以分号分隔的字符串列表指定POST请求中的GET请求或变量中的查询字符串值。
VaryByHeader

*

标题名称

以分号分隔的字符串列表指定可能由客户端提交的标头。
VaryByCustom

浏览器

自定义字符串

告诉ASP.NET按浏览器名称和版本或自定义字符串更改输出缓存。
Location

Any

Client

Downstream

Server

None

任何:页面都可以缓存在任何地方。

客户端:缓存的内容仍保留在浏览器中。

下游:存储在下游和服务器中的缓存内容。

服务器:仅在服务器上保存的缓存内容。

无:禁用缓存。

DurationNumber 页面或控件缓存的秒数。

让我们在上一个示例中添加一个文本框和一个按钮,并为该按钮添加此事件处理程序。

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会根据文本框中的名称缓存页面。

数据缓存

数据缓存的主要方面是缓存数据源控件。 我们已经讨论过数据源控件代表数据源中的数据,如数据库或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>

对象缓存

对象缓存比其他缓存技术提供更多灵活性。 您可以使用对象缓存将任何对象放在缓存中。 对象可以是任何类型 - 数据类型,Web控件,类,数据集对象等。只需通过分配新的键名称即可将项添加到缓存中,如下所示:

Cache["key"] = item;

ASP.NET还提供了Insert()方法,用于将对象插入缓存。 此方法有四个重载版本。 让我们看看他们:

超载 描述
Cache.Insert((key, value); 使用具有默认优先级和到期的密钥名称和值将项目插入缓存。
Cache.Insert(key, value, dependencies); 使用键,值,默认优先级,到期以及链接到其他文件或项的CacheDependency名称将项插入缓存,以便在这些更改时缓存项不再有效。
Cache.Insert(key, value, dependencies, absoluteExpiration, slidingExpiration); 这表示过期策略以及上述问题。
Cache.Insert(key, value, dependencies, absoluteExpiration, slidingExpiration, priority, onRemoveCallback); 这与参数一起还允许您为缓存项和委托设置优先级,该委托指向删除项时要调用的方法。

滑动到期用于在未在指定时间范围内使用时从缓存中删除项目。 以下代码段存储一个项目,其滑动到期时间为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服务开发有三个方面:

  • 创建Web服务
  • 创建代理
  • 使用Web服务

创建Web服务

Web服务是一个Web应用程序,它基本上是一个由其他应用程序可以使用的方法组成的类。 它还遵循代码隐藏架构,例如ASP.NET网页,尽管它没有用户界面。

为了理解这个概念,让我们创建一个Web服务来提供股票价格信息。 客户可以根据股票代码查询股票的名称和价格。 为了使这个例子简单,这些值在二维数组中被硬编码。 此Web服务有三种方法:

  • 默认的HelloWorld方法
  • GetName方法
  • 一个GetPrice方法

执行以下步骤以创建Web服务:

Step (1) :在Visual Studio中选择文件 - “新建 - ”网站,然后选择“ASP.NET Web服务”。

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) :更改文件后面的代码,为股票代码,名称和价格添加二维字符串数组,以及获取股票信息的两种网络方法。

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方法,提供其中一个硬编码的股票代码,它返回股票的名称

股票的名称

使用Web服务

要使用Web服务,请在同一解决方案下创建网站。 这可以通过在解决方案资源管理器中右键单击解决方案名称来完成。 调用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());
      }
   }
}

创建代理

代理是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) :右键单击解决方案资源管理器中的Web应用程序条目,然后单击“添加Web引用”。

添加Web引用

Step (2) :选择“此解决方案中的Web服务”。 它返回StockService引用。

选择Web服务

Step (3) :单击该服务将打开测试网页。 默认情况下,创建的代理称为“localhost”,您可以重命名它。 单击“添加引用”以将代理添加到客户端应用程序。

股票服务2

通过添加以下内容将代理包含在代码隐藏文件中:

 using localhost;

ASP.NET - Multi Threading

线程被定义为程序的执行路径。 每个线程定义一个独特的控制流。 如果您的应用程序涉及复杂且耗时的操作(如数据库访问或某些强烈的I/O操作),那么设置不同的执行路径或线程通常很有帮助,每个线程执行特定的工作。

线程是轻量级进程。 使用线程的一个常见示例是现代操作系统的并发编程的实现。 线程的使用可以节省CPU周期的浪费并提高应用程序的效率。

到目前为止,我们编译了程序,其中单个线程作为单个进程运行,该进程是应用程序的运行实例。 但是,这样应用程序可以一次执行一个作业。 为了使它一次执行多个任务,可以将其划分为更小的线程。

在.Net中,线程通过'System.Threading'命名空间来处理。 创建System.Threading.Thread类型的变量允许您创建一个新线程以开始使用。 它允许您创建和访问程序中的各个线程。

创建线程

通过创建Thread对象来创建线程,为其构造函数提供ThreadStart引用。

ThreadStart childthreat = new ThreadStart(childthreadcall);

线程生命周期

线程的生命周期在创建System.Threading.Thread类的对象时开始,在线程终止或完成执行时结束。

以下是线程生命周期中的各种状态:

  • The Unstarted State :创建线程实例但未调用Start方法的情况。

  • The Ready State :线程准备好执行并等待CPU周期的情况。

  • The Not Runnable State :线程不可运行,时间:

    • 已经调用了睡眠方法
    • 等待方法已被调用
    • 被I/O操作阻止
  • The Dead State :线程已完成执行或已中止的情况。

线程优先级

Thread类的Priority属性指定一个线程相对于其他线程的优先级。 .Net运行时选择具有最高优先级的就绪线程。

优先事项可归类为:

  • 超出正常水平
  • 低于一般
  • Highest
  • Lowest
  • Normal

创建线程后,使用线程类的Priority属性设置其优先级。

NewThread.Priority = ThreadPriority.Highest;

线程属性和方法

Thread类具有以下重要属性:

属性 描述
CurrentContext 获取线程正在执行的当前上下文。
CurrentCulture 获取或设置当前线程的区域性。
CurrentPrinciple 获取或设置线程的基于角色的安全性的当前主体。
CurrentThread 获取当前正在运行的线程。
CurrentUICulture 获取或设置资源管理器用于在运行时查找特定于文化的资源的当前区域性。
ExecutionContext 获取一个ExecutionContext对象,该对象包含有关当前线程的各种上下文的信息。
IsAlive 获取一个值,该值指示当前线程的执行状态。
IsBackground 获取或设置一个值,该值指示线程是否为后台线程。
IsThreadPoolThread 获取一个值,该值指示线程是否属于托管线程池。
ManagedThreadId 获取当前托管线程的唯一标识符。
Name 获取或设置线程的名称。
Priority 获取或设置一个值,该值指示线程的调度优先级。
ThreadState 获取包含当前线程状态的值。

Thread类有以下重要方法:

方法 描述
Abort 在调用它的线程中引发ThreadAbortException,以开始终止线程的过程。 调用此方法通常会终止该线程。
AllocateDataSlot 在所有线程上分配一个未命名的数据槽。 为了获得更好的性能,请使用标有ThreadStaticAttribute属性的字段。
AllocateNamedDataSlot 在所有线程上分配命名数据槽。 为了获得更好的性能,请使用标有ThreadStaticAttribute属性的字段。
BeginCriticalRegion 通知主机执行即将进入代码区域,其中线程中止或未处理异常的影响可能危及应用程序域中的其他任务。
BeginThreadAffinity 通知主机托管代码即将执行依赖于当前物理操作系统线程标识的指令。
EndCriticalRegion 通知主机执行即将进入代码区域,其中线程中止或未处理异常的影响仅限于当前任务。
EndThreadAffinity 通知主机托管代码已完成执行依赖于当前物理操作系统线程标识的指令。
FreeNamedDataSlot 消除进程中所有线程的名称和插槽之间的关联。 为了获得更好的性能,请使用标有ThreadStaticAttribute属性的字段。
GetData 从当前线程的当前域中的当前线程的指定槽中检索值。 为了获得更好的性能,请使用标有ThreadStaticAttribute属性的字段。
GetDomain 返回当前线程正在运行的当前域。
GetDomainID 返回唯一的应用程序域标识符。
GetNamedDataSlot 查找命名数据槽。 为了获得更好的性能,请使用标有ThreadStaticAttribute属性的字段。
Interrupt 中断处于WaitSleepJoin线程状态的线程。
Join 阻塞调用线程直到线程终止,同时继续执行标准COM和SendMessage抽取。 此方法具有不同的重载形式。
MemoryBarrier 按如下方式同步内存访问:执行当前线程的处理器无法重新排序指令,使得在调用MemoryBarrier之前的内存访问在对MemoryBarrier的调用之后的内存访问之后执行。
ResetAbort 取消当前线程请求的中止。
SetData 为当前运行的线程设置该线程当前域的指定槽中的数据。 为了获得更好的性能,请使用标记为ThreadStaticAttribute属性的字段。
Start 开始一个帖子。
Sleep 使线程暂停一段时间。
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";
         }
      }
   }
}

请注意以下事项

  • 加载页面时,将使用方法childthreadcall()的引用启动新线程。 主线程活动直接显示在网页上。

  • 第二个线程运行并向标签控件发送消息。

  • 主线程休眠2000毫秒,在此期间执行子线程。

  • 子线程运行直到主线程中止。 它引发ThreadAbortException并终止。

  • 控制返回主线程。

执行时,程序发送以下消息:

ASP.NET线程

ASP.NET - Configuration

ASP.NET应用程序的行为受配置文件中的不同设置的影响:

  • machine.config
  • web.config

machine.config文件包含所有支持设置的默认值和计算机特定值。 机器设置由系统管理员控制,通常不允许应用程序访问此文件。

但是,应用程序可以通过在其根文件夹中创建web.config文件来覆盖默认值。 web.config文件是machine.config文件的子集。

如果应用程序包含子目录,则可以为每个文件夹定义web.config文件。 每个配置文件的范围以分层自顶向下的方式确定。

任何web.config文件都可以在本地扩展,限制或覆盖在上一级定义的任何设置。

Visual Studio为每个项目生成默认的web.config文件。 应用程序可以在没有web.config文件的情况下执行,但是,如果没有web.config文件,则无法调试应用程序。

下图显示了Web服务教程中使用的示例示例的解决方案资源管理器:

解决方案Explorer-2

在此应用程序中,有两个项目的web.config文件,即Web服务和调用Web服务的Web站点。

web.config文件将配置元素作为根节点。 此元素内的信息分为两个主要区域:配置部分 - 处理程序声明区域和配置部分设置区域。

以下代码段显示了配置文件的基本语法:

<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>

配置节处理程序声明

配置节处理程序包含在标记中。 每个配置处理程序指定包含在文件中的配置节的名称,该配置节提供一些配置数据。 它具有以下基本语法:

<configSections>
   <section />
   <sectionGroup />
   <remove />
   <clear/>
</configSections>

它有以下要素:

  • Clear - 删除对继承的节和节组的所有引用。

  • Remove - 删除对继承的节和节组的引用。

  • Section - 它定义配置节处理程序和配置元素之间的关联。

  • Section group - 它定义配置节处理程序和配置节之间的关联。

应用程序设置

应用程序设置允许存储应用程序范围的名称 - 值对以进行只读访问。 例如,您可以将自定义应用程序设置定义为:

<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>

连接字符串

连接字符串显示网站可用的数据库连接字符串。 例如:

<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元素的一些常见子元素的简要说明:

AnonymousIdentification

这需要识别在需要授权时未经过身份验证的用户。

身份验证 (Authentication)

它配置身份验证支持。 基本语法如下:

<authentication mode="[Windows|Forms|Passport|None]"> 
   <forms>...</forms>
   <passport/>
</authentication>

授权 (Authorization)

它配置授权支持。 基本语法如下:

<authorization> 
   <allow .../>
   <deny .../>
</authorization>

Caching

它配置缓存设置。 基本语法如下:

<caching>
   <cache>...</cache>
   <outputCache>...</outputCache>
   <outputCacheSettings>...</outputCacheSettings>
   <sqlCacheDependency>...</sqlCacheDependency>
</caching>

CustomErrors (CustomErrors)

它定义了自定义错误消息。 基本语法如下:

<customErrors defaultRedirect="url" mode="On|Off|RemoteOnly">
   <error. . ./>
</customErrors>

部署(Deployment)

它定义了用于部署的配置设置。 基本语法如下:

<deployment retail="true|false" />

HostingEnvironment (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 (MachineKey)

它配置用于加密和解密Forms身份验证cookie数据的密钥。

它还允许配置验证密钥,该验证密钥对视图状态数据执行消息验证检查并形成验证票证。 基本语法是:

<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)

它配置用户角色的设置。 基本语法是:

<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>

SecurityPolicy (SecurityPolicy)

它配置安全策略。 基本语法是:

<securityPolicy>
   <trustLevel />
</securityPolicy>

UrlMappings (UrlMappings)

它定义映射以隐藏原始URL并提供更加用户友好的URL。 基本语法是:

<urlMappings enabled="true|false">
   <add.../>
   <clear />
   <remove.../>
</urlMappings>

WebControls (WebControls)

它提供客户端脚本的共享位置的名称。 基本语法是:

<webControls clientScriptsLocation="String" />

Web服务(WebServices)

这会配置Web服务。

ASP.NET - Deployment

ASP.NET部署分为两类:

  • Local deployment :在这种情况下,整个应用程序包含在虚拟目录中,所有内容和程序集都包含在其中并可供应用程序使用。

  • Global deployment :在这种情况下,程序集可供服务器上运行的每个应用程序使用。

有不同的技术用于部署,但是,我们将讨论以下最常见和最简单的部署方法:

  • XCOPY部署
  • 复制网站
  • 创建一个设置项目

XCOPY部署

XCOPY部署意味着将所有文件的递归副本复制到目标计算机上的目标文件夹。 您可以使用任何常用技术:

  • FTP传输
  • 使用在远程站点上提供复制的服务器管理工​​具
  • MSI安装程序

XCOPY部署只是将应用程序文件复制到生产服务器并在那里设置虚拟目录。 您需要使用Internet Information Manager Microsoft管理控制台(MMC管理单元)设置虚拟目录。

复制网站

“复制网站”选项在Visual Studio中可用。 可从网站 - >复制网站菜单选项中获取。 此菜单项允许将当前网站复制到另一个本地或远程位置。 它是一种集成的FTP工具。

使用此选项,您连接到目标目标,选择所需的复制模式:

  • Overwrite
  • 源文件到目标文件
  • 同步源和目标项目

然后继续物理复制文件。 与XCOPY部署不同,此部署过程是从Visual Studio环境完成的。 但是,上述部署方法存在以下问题:

  • 您传递了源代码。
  • 没有预编译和相关的文件错误检查。
  • 初始页面加载速度很慢。

创建安装项目

在此方法中,您使用Windows Installer并打包Web应用程序,以便可以在生产服务器上进行部署。 Visual Studio允许您构建部署包。 让我们在我们现有的一个项目上测试一下,比如数据绑定项目。

打开项目并执行以下步骤:

Step (1) :选择文件 - “添加 - ”新建项目,并在解决方案资源管理器中突出显示网站根目录。

Step (2) :在“其他项目类型”下选择“设置和部署”。 选择安装向导。

选择安装向导

Step (3) :选择默认位置可确保设置项目位于站点根目录下的自己的文件夹中。 单击“确定”以获取向导的第一个启动画面。

启动画面向导

Step (4) :选择项目类型。 选择“为Web应用程序创建设置”。

启动画面Wizard2

Step (5) :接下来,第三个屏幕要求从解决方案中的所有项目中选择项目输出。 选中“来自......的内容文件”旁边的复选框

启动画面Wizard3

Step (6) :第四个屏幕允许包括其他文件,如ReadMe。 但是,在我们的例子中没有这样的文件。 点击完成。

启动画面Wizard4

Step (7) :最终屏幕显示设置项目的设置摘要。

启动画面Wizard5

Step (8) :将设置项目添加到解决方案资源管理器中,主设计窗口显示文件系统编辑器。

启动画面Wizard6

Step (9) :下一步是构建安装项目。 在Solution Explorer中右键单击项目名称,然后选择Build。

启动画面Wizard7

Step (10) :构建完成后,您将在“输出”窗口中收到以下消息:

启动画面Wizard8

构建过程创建了两个文件:

  • Setup.exe
  • Setup-databinding.msi

您需要将这些文件复制到服务器。 双击安装文件以在本地计算机上安装.msi文件的内容。

↑回到顶部↑
WIKI教程 @2018