原创作者: 马伟   阅读:5201次   评论:0条   更新时间:2011-06-23    

书名:ASP.NET 4权威指南(国内首本ASP.NET 4著作,基于C# 4.0和Visual Studio 2010)
作者:马伟
ISBN:978-7-111-32124-8
定价:99.00元


内容简介:
ASP.NET不仅是微软最重要的战略性产品之一,而且还是Web开发领域最具创新性、最成功的技术之一。它可完全利用.NET架构的强大、高效、安全的平台特性。ASP.NET以功能丰富、性能卓越、高效稳定和开发便利而著称,随着C# 4.0和Visual Studio 2010的推出,今天的ASP.NET 4更是如虎添翼,不仅在功能上有了很大的增强(如增强与改进了输出缓存、会话状态压缩、Web窗体、Microsoft Ajax和ASP.NET MVC等功能,新推出了强大的ASP.NET Chart 图形控件等),而且还在敏捷开发、SOA与云计算等技术方面也都提供了很好的解决方案。因此,通过ASP.NET 4,你可以简单快速地开发出企业级的、高性能的易于维护的Web应用系统。
《ASP.NET 4权威指南》是ASP.NET领域的又一鸿篇巨制,由资深ASP.NET专家亲自执笔,知名微软技术社区和权威技术专家一致鼎力推荐。 它是国内第一本关于ASP.NET 4的著作。从广度上讲,内容系统而全面,全书一共包含4个部分:第一部分以一个易于实践的示例开篇,既能帮助读者快速了解ASP.NET的开发流程,还能帮助读者建立ASP.NET开发的大局观,紧接着全面介绍了ASP.NET的各种常用控件,这是ASP.NET的基础;第二部分详尽地讲解了ASP.NET访问的所有细节,包括数据管理、数据控件绑定与操作、GridView控件、LINQ查询、LINQ与ADO.NET和XML,以及ADO.NET实体框架等;第三部分深入浅出地讲解了开发一个Web站点必须掌握的各种知识点、流程和方法;第四部分是本书的高级话题,分析了ASP.NET状态管理、自定义服务器控件、ASP.NET缓存、多语言本地化应用程序、ASP.NET Web部件等。从深度上来讲,本书对实际开发中极不常用而大部分同类书都浓墨重彩的知识点只做了必要性的介绍,对于较容易给开发者带来困惑而大部分同类书都浅尝辄止的知识点进行了深入分析,其详细程度是一般同类书不能比拟的。从实践性上讲,本书精心设计了大量可操作性强和极具借鉴价值的实例代码与解决方案。
《ASP.NET 4权威指南》在广度、深度和实践性上完美结合,既能引领初学者快速在实践中掌握ASP.NET开发,又能帮助有一定经验的读者解决在实际开发中遇到的各种疑难问题。

作者简介:

马伟,资深软件研发工程师、系统架构师和企业培训讲师,拥有多年软件研发和管理经验,在系统需求分析、架构设计、数据库设计与实现、设计模式、SOA、性能优化等方面有独到的见解。资深微软技术专家、微软特约讲师、西安.NET俱乐部技术主 席,擅长C#、ASP.NET、Visual Studio、SQL Server、 C/C++/ 、UML和Oracle等技术,曾荣获“最有影响力开发者”称号。参与并领导了“远程视频监控系统”、“视频营销平台”、“人事绩效考核系统”、“电力四分统计平台”、“电力理论线损计算软件”、“电力生产技术管理系统”、“电力红外监控系统”、“电力防洪防汛监控系统”等项目的架构、设计与开发工作,实践经验丰富。

《ASP.NET 4权威指南》前言 Top

为何写作本书
众所周知,ASP.NET是当前最主流的Web应用程序开发技术之一,它构建在.NET Framework之上。.NET Framework属于企业级的技术开发平台,聚合了多种开发语言和多种紧密相关的新技术。通过.NET Framework平台,我们可以根据自己的特长来选择多种开发语言作为ASP.NET的服务器端编程语言,比如C#、Visual Basic等。与此同时,我们还可以根据自己以前开发的习惯来选择多种不同类型的Web应用程序构建方式,比如新建Web网站和新建Web应用程序这两种方式。
ASP.NET是Web开发技术高速发展的产物,使得从传统的数据库访问技术到如今的分布式应用开发技术等一系列技术都发生了变革。并且,它在快速开发、编译与部署等方面的优势是任何一种互联网开发技术都不能够比拟的。也正是因为这些优点,全球开发者社区一批又一批的开发人员加入到ASP.NET开发这个阵营中。通过ASP.NET,我们可以简单快速地开发出企业级的、高性能的、便于维护的Web应用系统。
这些年,微软对.NET Framework进行不断地改进与升级,使其在功能上取得了很大的突破,获得了成功。Visual Studio 2010的推出是微软在技术与应用上的一次重要的历史性变革,它不仅在敏捷开发等项目开发技术上得到了很好的支持,而且还在SOA和云计算等技术方面提供了很好的解决方案,功能也日渐强大。当然,在这个过程中,ASP.NET 4也在很多方面有了很大的改进,尤其是其核心功能(如输出缓存、会话状态压缩等方面)、Web窗体、Microsoft Ajax与ASP.NET MVC等。同时,它还新推出了ASP.NET Chart 控件,能让我们在图形报表的处理方面更加得心应手。
在ASP.NET 4以前,市面上关于ASP.NET的参考书籍非常多,但是在仔细分析后会发现,除了少有的几本引进版图书比较经典之外,大部分书籍都存在着这样一些问题:读者群定位不准确、内容不够系统、深浅不适中、技术版本落后、作者缺乏实际开发经验、过于书面化、照搬MSDN文档,等等。基于这些原因,笔者产生了编写本书的源动力。本书立足于笔者多年的ASP.NET开发经验,以最新的ASP.NET 4为基础,结合Visual Studio 2010与.NET Framework 4全方位地阐述了ASP.NET 4方方面面的知识,旨在使大家能够循序渐进地、系统性地学习ASP.NET 4,最后达到完全掌握与熟练运用的目的。
鉴于ASP.NET所涉及的内容较多,所以本书对那些华而不实、实际中使用很少的知识点只做了一些简单地介绍,而对那些实用性强、日常开发中使用频率较高的知识点将进行了非常全面、深入地阐述和分析。比如在数据访问(如事务处理、LINQ技术)、状态管理、自定义服务器控件、ASP.NET缓存与分布式缓存Velocity、ASP.NET Web部件等几个方面,其阐述的广度与深度是一般同类书所不能够比拟的。同时,为了提高本书的实用性,笔者还通过大量编程示例展示了一些很有价值的源码与解决方案,从而可以让大家真正地了解、认识软件开发,并达到学以致用的目的。

如何阅读本书
如果你是一位ASP.NET的中初级读者,本书就是为你量身打造的,你可以逐章地进行系统地学习,并结合我们所提供的示例进行动手实践,巩固所学的知识;如果你是一位有一定基础的高级读者,可以跳过一些基础性的章节,去仔细研读本书中的一些高级话题,它们也许会让你受益非浅。最重要的是,本书可以作为所有ASP.NET开发者的工作参考手册,以备需要时查阅。
需要特别说明的是,本书是以C#作为ASP.NET的服务器端编程语言。因此,要求你必须有一定的C#基础。如果你需要学习和巩固C#方面的知识,推荐你参考本书的姊妹篇《C# 4.0权威指南》或笔者撰写的《易学C#》。
读者服务支持
为了能够与广大读者朋友更好地沟通,本书特别提供了如下的Web站点(本书官方网站)供大家学习与交流:http://www.comesns.com/aspnet。在这里,你不仅可以直接与笔者以及广大读者进行交流,而且还可以下载到本书的所有源代码和相关的电子教学文档,同时还有大量的学习资料与大家共享。

致   谢
在最后,笔者要感谢所有为本书的出版提供过帮助的朋友,没有他们的帮助和付出,本书恐怕很难如此顺利地完成。
首先,要感谢杨福川和曾珊两位编辑为本书的整体策划、修订和出版所做的大量工作,与他们的合作非常愉快。同时,也正因为他们对本书的高要求,才使得本书的结构更加系统化、内容更加深刻化、语言更加通俗化。
其次,要感谢我的家人,尤其是我的妻子吴亚峰女士。在写这本书的过程中,我投入了大量的时间和精力,占用了无数个本应该陪伴家人的周末和节假日。
最后,要感谢那些曾经为本书的编写提供过宝贵意见的朋友,他们的意见让本书锦上添花。
尽管笔者在本书的写作过程中非常认真和努力,但由于水平有限,书中难免存在错误和疏漏之处,恳请广大读者批评指正。如果大家对本书有任何意见或建议,欢迎大家通过本书的官方网站或邮箱(madengwei@hotmail.com)告知,笔者将不胜感激。
马伟
2010年9月

第0章 预备课1:ASP.NET 4的核心服务 Top

微软的每一次新版本发布对于我们开发人员来说都是激动人心的,它所提供的强大功能和人性化的操作界面总会让你心潮澎湃、激动不已。相对于ASP.NET 3.5 SP1 来说,ASP.NET 4 算是一个功能性增强版本,它引入了多项可改进ASP.NET 核心服务的功能。

1. 可扩展输出缓存

其实,自ASP.NET 1.0 发布之后,开发人员就可以通过输出缓存将生成的页、控件和HTTP 响应的输出存储在内存中。对于后续的Web 请求,ASP.NET 可以从内存中检索生成的输出而不是从头开始重新生成输出,从而更快地提供内容服务。但此方法有一个限制,即生成的内容必须始终存储在内存中。在流量较大的服务器上,输出缓存的内存需求可能会与Web 应用程序其他部分的内存需求产生冲突。

ASP.NET 4 为输出缓存增加了扩展性,它允许你能够配置一个或多个自定义输出缓存提供程序。输出缓存提供程序可使用任何存储机制保存HTML 内容。这些存储选项包括本地或远程磁盘、云存储和分布式缓存引擎。

借助ASP.NET 4 中的输出缓存提供程序扩展性,可以为网站设计更主动且更智能的输出缓存策略。例如,可以创建这样一个输出缓存提供程序,该程序在内存中缓存站点流量“排名前10”的页面,而在磁盘上缓存流量较低的页面,也可以根据所呈现页面的各种变化因素组合进行缓存,但应使用分布式缓存以减少前端Web 服务器的内存消耗。

可以将自定义输出缓存提供程序作为派生自新的OutputCacheProvider 类型的类创建。随后,可以通过使用OutputCache元素的新的providers节在Web.config 文件中配置提供程序,如下面的示例所示:
 <caching>
  <outputCache defaultProvider="AspNetInternalProvider">
   <providers>
    <add name="MyOutputCacheProvider"
    type="_19_1.MyOutputCacheProvider,19-1"/>
   </providers>
  </outputCache>
</caching>


默认情况下,ASP.NET 4 中所有的HTTP响应、生成的网页以及控件都使用内存输出缓存,其中defaultProvider属性被默认设置为AspNetInternalProvider。当然,可以更改Web 应用程序中所使用的默认输出缓存提供程序,这是通过为defaultProvider指定一个不同的提供程序名称实现的,如下面的代码所示。
<caching>
  <outputCache defaultProvider="MyOutputCacheProvider">
   <providers>
    <add name="MyOutputCacheProvider"
    type="_19_1.MyOutputCacheProvider,19-1"/>
   </providers>
  </outputCache>
</caching>


此外,还可以针对每个控件和每个请求选择不同的输出缓存提供程序。为不同的Web 用户控件选择不同的输出缓存提供程序的最简单的方法就是在用户控件的指令中以声明方式使用新的ProviderName属性,如下面的代码所示。
 <%@ Control Language="C#" AutoEventWireup="true"
  CodeBehind="MyOutputCacheProviderUserControl.ascx.cs"
  Inherits="_19_1.MyOutputCacheProviderUserControl" %>
  <%@ OutputCache Duration="30" VaryByParam="none"
  ProviderName="MyOutputCacheProvider" %>
  <asp:Label ID="Label1" runat="server" />


2. 预加载Web应用程序

预加载功能提供了一种可控方法,用于启动应用程序池,初始化ASP.NET 应用程序,然后接受HTTP 请求。通过这种方法,可以在处理第一项HTTP 请求之前初始化开销很大的应用程序。例如,可以使用应用程序预加载管理器初始化某个应用程序,然后向负载平衡器发出信号,告知应用程序已初始化并做好接受HTTP 流量的准备。值得注意的是,该技术只能够在Windows Server 2008 R2 上的IIS 7.5 中运行。

若要使用应用程序预加载管理器,需要由IIS 管理员通过使用applicationHost.config 文件中的以下配置将IIS 7.5 中的应用程序池设置为自动启动:
<applicationPools>
  <add name="MyApplicationPool" startMode="AlwaysRunning" />
         </applicationPools>


由于一个应用程序池可包含多个应用程序,因此需要通过使用applicationHost.config 文件中的以下配置分别指定要自动启动的各个应用程序:
 <sites>
  <site name="MySite" id="1">
   <application path="/"
    serviceAutoStartEnabled="true"
    serviceAutoStartProvider="PrewarmMyCache" >
    <!-- Additional content -->
   </application>
  </site>
</sites>
<!-- Additional content -->
<serviceAutoStartProviders>
   <add name="PrewarmMyCache"
    type="MyNamespace.CustomInitialization, MyLibrary" />
</serviceAutoStartProviders>


如果IIS 7.5 服务器冷启动或某个应用程序池已回收,IIS 7.5 将使用applicationHost.config 文件中的信息确定哪些Web 应用程序必须自动启动。对于每个标记为预加载的应用程序,IIS 7.5 将向ASP.NET 4 发送一个请求以启动该应用程序使其处于一种状态,在该状态下该应用程序暂时无法接受HTTP 请求。当应用程序处于这种状态时,ASP.NET 将对serviceAutoStartProvider 特性定义的类型进行实例化并调入其公共入口点。

通过实现IProcessHostPreloadClient 接口,可以创建具有所需入口点的托管预加载类型。

3. 永久重定向页面

对于页面的重定向,ASP.NET 4 增加了一个RedirectPermanent方法,它可以方便地发出HTTP 301(“永久移动”)响应,如下面的示例所示:
RedirectPermanent("/Main.aspx");


识别永久重定向的搜索引擎及其他用户代理将存储与内容关联的新URL,从而消除浏览器用于临时重定向的不必要的往返。

4. 会话状态压缩
默认情况下,ASP.NET 提供两个用于存储整个Web 场中会话状态的选项:第一个选项是一个调用进程外会话状态服务器的会话状态提供程序;第二个选项是一个在Microsoft SQL Server 数据库中存储数据的会话状态提供程序。由于这两个选项均在Web 应用程序的工作进程之外存储状态信息,因此在将会话状态发送至远程存储器之前,必须对其进行序列化。如果会话状态中保存了大量数据,序列化数据可能会变得很大。

ASP.NET 4 针对这两种类型的进程外会话状态提供程序引入了一个新的压缩选项。使用此选项后,在Web 服务器上有多余CPU 周期的应用程序可以大大缩减序列化会话状态数据的大小。

可以使用配置文件中sessionState 元素的新的compressionEnabled 特性设置此选项,当compressionEnabled 配置选项设置为true 时,ASP.NET 使用.NET Framework GZipStream类对序列化会话状态进行压缩和解压缩。下面的示例演示了如何设置该特性:
<sessionState
mode="SqlServer"
sqlConnectionString="data source=dbserver;
Initial Catalog=aspnetstate"
allowCustomSqlDatabase="true"
compressionEnabled="true"/>


5. 简洁的Web.config文件
在ASP.NET 4 中,配置信息被移到了machine.config文件中,从而使Web.config 比以前的版本更简洁和清晰,如下面的代码所示。
<?xml version="1.0"?>
<!--
  For more information on how to configure your ASP.NET application,
  please visit http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
   <system.web>
    <compilation debug="true" targetFramework="4.0" />
   </system.web>
 </configuration>

第0章 预备课2:ASP.NET 4在Web窗体方面的改进 Top

在Web 窗体方面,ASP.NET 4 做了以下几方面的改进。
1. Page.MetaKeywords 和Page.MetaDescription 属性
MetaKeywords 和MetaDescription是Page类新增加的两个属性,使用它们可以设置页面对应的meta标记—keywords和description。

2. 为页面的各个控件启用视图状态
Control 类增加了一个新属性ViewStateMode ,可以使用该属性来启用单个控件的视图状态。

3. 支持最近引入的浏览器和设备
在ASP.NET 中,包含一项名为“浏览器功能”的功能,可用于确定用户使用的浏览器的功能。其中,浏览器功能由存储在HttpRequest.Browser 属性中的HttpBrowserCapabilities 对象表示,有关特定浏览器功能的信息由浏览器定义文件定义。
在ASP.NET 4 中,这些浏览器定义文件已更新为包含有关最近引入的浏览器和设备(如Chrome、BlackBerry 和iPhone等)的信息。附带的浏览器定义文件包括:blackberry.browser 、chrome.browser、Default.browser、firefox.browser、gateway.browser 、generic.browser、ie.browser、iemobile.browser、iphone.browser、opera.browser和safari.browser。
除此之外,ASP.NET 4 还提供了一项名为“浏览器功能提供程序”的新功能。它可用于构建一个提供程序,该提供程序还可用于编写自定义代码以确定浏览器功能。

4. ASP.NET 路由
ASP.NET 4 增加了对使用Web 窗体进行路由的内置支持。路由是ASP.NET 3.5 SP1 引入的一项功能,通过此功能可将应用程序配置为使用对用户和搜索引擎有意义的URL,这样无须指定物理文件名。使用这项功能,可以使站点更友好,并增加站点内容被搜索引擎发现的概率。
例如,显示应用程序中产品类别的某个页面的URL 如下面的示例所示:
http://website/products.aspx?id=10

通过路由功能,可以使用下面的URL呈现相同的信息:
http://website/products/software

很显然,第二个URL 不仅能使用户了解将获得的内容,并且还可以显著提高在搜索引擎搜索结果中的排名。

5.设置客户端ID
在ASP.NET 4 中,所有的控件都增加了一个ClientIDMode属性。可以使用此属性来影响ASP.NET 用于生成控件的ClientID 值的算法,从而更加方便地控制控件客户端ID。该属性是一个枚举类型,它有四个枚举值,其原型如下面所示:
using System;
namespace System.Web.UI
{
    public enum ClientIDMode
    {
        Inherit = 0,
        AutoID = 1,
        Predictable = 2,
        Static = 3,
    }
}


6. 在GridView 和ListView 控件中保持行选择
在ASP.NET 的早期版本中,行选择是基于页面的行索引进行的。例如,如果选择第一页上的第三行,当移至第二页时,则会自动选定第二页上的第三行。在大多数情况下,更理想的情况是不选择第二页上的任何行。
而在ASP.NET 4 中,它新增加了一个EnablePersistedSelection属性来支持持久化选择。启用此功能后,将基于行数据键选择项。这意味着,如果你选择第一页上的第三行,当移至第二页时,并不会选定第二页上的任何行。当再次返回第一页时,仍将选定第三行。其中,设置示例如下面所示:
<asp:GridView id="GridView1" runat="server" 
PersistedSelection="true">
</asp:GridView>


7. 使用CSS简化FormView 控件内容的样式设置
在ASP.NET 的早期版本中,FormView 控件使用项模板呈现内容。这使得在标记中进行样式设置十分困难,因为控件会呈现意外的表行和表单元格标记。而在ASP.NET 4 中,提供了属性RenderOuterTable ,当此属性设置为false时,则不会呈现表标记,这样也就更容易对控件内容应用CSS 样式。设置示例如下面的代码所示:
<asp:FormView ID="FormView1" runat="server" RenderTable="false">


8. 简化ListView 控件的布局
ASP.NET 3.5 中引入的ListView 控件不仅具备GridView 控件的所有功能,同时还可以全面地控制输出。但是,该控件的早期版本要求在使用中指定布局模板LayoutTemplate ,如下面的示例代码所示:
<asp:ListView ID="ListView1" runat="server">

<LayoutTemplate>
<asp:PlaceHolder ID="ItemPlaceHolder" runat="server">
</asp:PlaceHolder>
</LayoutTemplate>
<ItemTemplate>
<% Eval("Name")%>
</ItemTemplate>
</asp:ListView>


而在ASP.NET 4 中,简化了此控件的使用,可以不需要布局模板。即上面示例中的标记可以替换为下面的标记:
<asp:ListView ID99="ListView1" runat="server">
<ItemTemplate>
<% Eval("Name")%>
</ItemTemplate>
</asp:ListView>


9. 使用QueryExtender控件筛选数据
我们知道,创建数据驱动的网页时,一项十分常见的任务就是数据筛选操作。筛选操作通过仅显示满足指定条件的记录,从数据源排除数据。通过筛选,可以在不影响数据集中的数据的情况下以多种方式查看这些数据。
以前,筛选操作通常要求创建Where 子句以应用于查询数据源的命令。但是,LinqDataSource 控件的Where 属性并不公开LINQ 中提供的全部功能。为了更便于筛选数据操作,ASP.NET 4 中新增加了一个新的QueryExtender 控件,该控件可通过声明性语法从数据源中筛选出数据。使用QueryExtender 控件有以下优点:
❑ 与编写Where 子句相比,可提供功能更丰富的筛选表达式。
❑ 提供一种LinqDataSource 和EntityDataSource 控件均可使用的查询语言。例如,如果将QueryExtender 与这些数据源控件配合使用,则可以在网页中提供搜索功能,而不必编写特定于模型的Where 子句或eSQL 语句。
❑ 可以与LinqDataSource 或EntityDataSource 控件配合使用,或与第三方数据源配合使用。
❑ 支持多种可单独和共同使用的筛选选项。

10. 对Web 标准和辅助功能的增强支持
ASP.NET 控件的早期版本有时会呈现不符合HTML、XHTML 或辅助功能标准的标记。而在ASP.NET 4 中,消除了其中大部分异常情况。主要体现在以下几个方面:
(1)用于可禁用控件的CSS
在ASP.NET 3.5 中,当将某个控件的Enabled属性设置为false时,系统会将一个disabled 特性添加到呈现的HTML元素中。例如,下面的标记将创建一个已禁用的Label 控件:
<asp:Label id="Label1" runat="server" 
Text="已禁用的Label 控件" Enabled="false" />


在ASP.NET 3.5 中,原有控件设置将生成以下HTML:
<span id="Label1" disabled="disabled">已禁用的Label 控件</span>


而在HTML 4.01中,针对span元素将disabled特性视为无效。对于仅供显示的元素(如span), 浏览器通常支持呈现禁用的外观,但根据辅助功能标准,依赖于这种非标准行为的网页并不可靠。因此,对于这些仅供显示的元素,应使用CSS 指明已禁用的可视外观。在默认情况下,ASP.NET 4 将针对上面显示的控件设置生成以下HTML:
<span id="Label1" class="aspNetDisabled">已禁用的Label 控件
</span>


当然,可以通过设置DisabledCssClass 属性来更改控件禁用时默认呈现的class特性的值。也就是说,如果要使用不同于“aspNetDisabled”默认值的类名,通常可以在Global.asax 文件的Application_Start 方法中放入代码来执行此操作,如下面的示例所示:
protected void Application_Start(object sender, EventArgs e)
{
WebControl.DisabledCssClass = "customDisabledClassName";
}


现在的Label控件将生成以下HTML:
<span id="Label1" class="customDisabledClassName">
已禁用的Label 控件</span>


(2)用于验证控件的CSS
在ASP.NET 3.5 中,验证控件将默认颜色red 呈现为内联样式。例如,下面的标记创建一个RequiredFieldValidator 控件:
<asp:RequiredFieldValidator ID="RequiredFieldValidator1"
runat="server" ErrorMessage="Required Field"
ControlToValidate="RadioButtonList1" />


ASP.NET 3.5 为验证程序控件呈现以下HTML:
<span id="RequiredFieldValidator1"
style="color:Red;visibility:hidden;">
RequiredFieldValidator

</span>


默认情况下,ASP.NET 4 不会呈现将颜色设置为红色的内联样式。内联样式仅用于隐藏或显示验证程序,如下面的示例所示:
<span id="RequiredFieldValidator1"
style"visibility:hidden;">
RequiredFieldValidator

</span>


因此,ASP.NET 4 不会自动以红色显示错误消息。
(3)用于隐藏字段Div元素的CSS
ASP.NET 使用隐藏字段存储状态信息,如视图状态和控件状态,这些隐藏字段包含在div元素中。在ASP.NET 3.5 中,此div元素没有class特性或id特性。因此,影响所有div元素的CSS规则可能会在无意中导致此div变为可见状态。
为避免上面这种问题,ASP.NET 4 使用一个CSS类呈现隐藏字段的div元素,该类可用于将隐藏字段div与其他元素区分开来。呈现的HTML如下所示:
<div class="aspNetHidden"> 


(4)用于Table 、Image和ImageButton控件的CSS
默认情况下,在ASP.NET 3.5 中,某些控件会将所呈现HTML 的border 特性设置为0。下面的示例显示了由ASP.NET 3.5 中的Table 控件生成的HTML:
<table id="Table2" border="0">


Image控件和ImageButton 控件也会这样,但由于此设置完全没有必要,而且会提供应通过使用CSS 提供的可视格式设置信息,因此,在ASP.NET 4 中未生成该特性。
(5)用于UpdatePanel和UpdateProgress控件的CSS
在ASP.NET 3.5 中,UpdatePanel和UpdateProgress控件不支持expando 特性。因此,无法针对它们呈现的HTML 元素设置CSS 类。而在ASP.NET 4 中,这些控件已更改为接受expando 特性,如下面的示例所示:
<asp:UpdatePanel runat="server" class="myStyle">
</asp:UpdatePanel>


下面是此标记呈现的HTML:
<div id="ctl00_MainContent_UpdatePanel1" class="expandoclass">
</div>


(6)消除不需要的外部表在ASP.NET 3.5 中,FormView 、Login、PasswordRecovery与ChangePassword控件呈现的HTML 包装在一个table 元素中,该元素的用途是将内联样式应用于整个控件。
如果使用模板自定义这些控件的外观,则可以在你在模板中提供的标记中指定CSS 样式。在这种情况下,不需要额外的外部表。在ASP.NET 4 中,通过将新的RenderOuterTable 属性设置为false,可以避免呈现表。
(7)向导控件的布局模板
在ASP.NET 3.5 中,Wizard 和CreateUserWizard 控件可生成用于可视格式设置的HTML table 元素。在ASP.NET 4 中,可以使用LayoutTemplate 元素指定布局。如果这样做,将不生成HTML table 元素。在模板中,可创建占位符控件来指示应在该控件中动态插入项的位置。
(8)用于CheckBoxList 和RadioButtonList 控件的新增HTML格式设置选项
ASP.NET 3.5 使用HTML 表元素为CheckBoxList和RadioButtonList控件的输出设置格式。为提供不使用表进行可视格式设置的替代方法,ASP.NET 4 为RepeatLayout 枚举增加了两个选项:
❑ UnorderedList
此选项指定使用ul和li元素,而不是表对HTML输出进行格式设置。
❑ OrderedList
此选项指定使用ol和li元素,而不是表对HTML输出进行格式设置。
(9)Table 控件的页眉和页脚元素
在ASP.NET 3.5 中,可通过设置TableHeaderRow 类和TableFooterRow 类的TableSection 属性将Table 控件配置为呈现thead和tfoot元素。而在ASP.NET 4 中,这些属性均默认设置为适当的值。
(10)Menu 控件的CSS 和ARIA支持
在ASP.NET 3.5 中,Menu 控件使用HTML table 元素进行可视化格式设置,在某些配置中无法通过键盘访问该控件。在ASP.NET 4 中,通过以下方法解决了这些问题,并提高了可访问性:
❑ 生成的HTML 具有无序列表(ul 和li 元素)的结构;
❑ 使用CSS 进行可视化格式设置;
❑ 菜单按照ARIA 标准实现键盘访问,可以使用箭头键在菜单项中进行导航;
❑ ARIA 角色和属性特性将添加到生成的HTML 中。
Menu 控件的样式呈现在页面顶部的style 块中,而不是与呈现的HTML 元素内联呈现。如果要使用单独的CSS 文件以便于修改菜单样式,可以将Menu 控件的新的IncludeStyleBlock 属性设置为false,这样便不会生成样式块。
(11)用于HtmlForm控件的有效XHTML
在ASP.NET 3.5 中,HtmlForm 控件(由<form runat=“server”> 标记隐式创建)呈现的HTML form 元素同时具有name和id特性。但因为name 特性在XHTML 1.1 中已弃用,因此该控件在ASP.NET 4 中不会呈现name 特性。
(12)保留控件呈现中的向后兼容性
现有ASP.NET 网站中的代码可能会假定控件是以ASP.NET 3.5 中的方式呈现HTML。为避免在将该站点升级为ASP.NET 4 时出现向后兼容性问题,可以在升级站点后让ASP.NET 继续以ASP.NET 3.5 中的方式生成HTML。为此,可以在ASP.NET 4 网站的Web.config 文件中将pages 元素的controlRenderingCompatibilityVersion 特性设置为“3.5”,如下面的示例所示:
<system.web>

<pages controlRenderingCompatibilityVersion="3.5"/>

</system.web>


如果省略上述设置,默认值将与网站的目标ASP.NET 版本相同。

第0章 预备课3:Visual Studio 2010集成开发环境 Top

现在就来剖析一下Microsoft Visual Studio 2010 集成开发环境的各个组成部分以及它们各自的功能。

0.5.1 解决方案资源管理器
解决方案资源管理器从本质上说是一个可视化的文档管理系统,你可以把它看做是整个项目的大管家,如图0-8 所示。
在这里,不仅可以查看整个项目的项目文件,还可以管理项目解决方案,并在项目解决方案下根据需要任意添加、修改、删除子项目或者其他杂项文件等。同样,也可以对项目下的文件进行各种操作,所有的这些操作都可以通过鼠标右键来完成。例如想要删除一个文件,只需要在解决方案资源管理器里面选中这个文件,然后按Delete键即可。

图0-8  解决方案资源管理器

0.5.2 控件工具箱
控件工具箱属于Visual Studio 的一大特色,它为我们的开发提供许多有用的控件。在Web 项目的开发中,利用工具箱可以不需要编写任何代码,只使用鼠标“拖曳”的操作方式就能够完成Web 表单的界面设计,并且这些控件都是跨浏览器和跨设备运行的,如图0-9所示。
工具箱的内容依赖于你当前正在使用的设计器,也同样依赖于你当前的项目类型。你可以自定义工具箱的标签以及标签内的项。可以右击标签顶部来选择“Rename Tab”、“Add Tab ”或者“Delete Tab ”标签,在工具箱的空白处单击右键并选“Choose Item”,就可以添加一个或者多个项。同时,还可以把一个项从一个标签拖放到另一个标签内。

图0-9  控件工具箱

0.5.3 服务器资源管理器
服务器资源管理器提供了一个树状功能列表,它允许你使用当前机器上(以及网络上的其他服务器)各种类型的服务。类似于计算机管理工具,一般使用服务器资源管理器来了解机器上可用的事件日志、消息队列、性能计数器、系统服务和SQL Server 数据库,如图0-10所示。
其实,它不仅可以让我们快速地浏览服务器资源,同时也可以和这些资源交互。比如说,可以使用服务器资源管理器来创建一个数据库,执行查询语句,并且编写存储过程,所有这些操作都类似于使用SQL Server提供的企业管理器的操作。如果想要了解对选定的项可进行何种操作,用鼠标右击该项即可。

0.5.4 错误列表与任务列表
错误列表和任务列表是同一个窗口的两种不同表现形式。其中,错误列表提供Visual Studio 通过检测有问题的代码而产生的出错信息。错误列表以及任务列表的每一项都由一个文本描述和一个链接组成,这个链接能帮助你找到项目里面出错程序代码的指定行。作为Visual Stuido 的默认设置,当生成一个有错误的项目的时候,错误列表会自动出现,如图0-11 所示。

图0-10  服务器资源管理器


图0-11  错误列表

由图0-11 可知,错误列表有三个选项按钮。其中,“Error”表示程序的一些严重性比较高的错误,如果不修改这些错误程序将无法编译成功;“Warnings ”表示软性错误,也可以看着是潜在性错误,比如定义了多余的在程序里面没有用到的变量、在页面设计的时候用到了不符合标准的HTML标签等,这种错误不影响程序的编译,但会带来潜在的错误。
任务列表显示一个类似的带to-do任务的视图,以及你正在跟踪的其他代码注解。可以使用“Ctrl+W,T”快捷键来打开任务列表,如图0-12所示。

图0-12 任务列表

任务可以分为两种:用户任务和注释。可以在任务列表顶部的下拉列表框中选择想要看的任务。用户任务是那些你明确添加到任务列表中的项。可以单击任务列表中的“Create User Task ”图标来创建用户任务。你可以给任务一个基本的描述、优先级以及一个对勾框来表示其是否已经完成。要移动到相应的代码行,只需双击上面新的任务项即可。注意,如果删除了注释,这个对应的任务项也会被自动删除。

0.5.5 页面设计窗口与代码编辑窗口
在Visual Studio 中,页面设计窗口与代码编辑窗口共享一个窗口,可以在这里设计页面、编写HTML代码、编写C#以及设计类图等。在Web 应用程序的页面设计中,可以使用“拖曳”的方式将Web 服务器控件拖曳到页面设计窗口来完成页面的布局设计,同时它会自动生成相应的页面HTML 代码,如图0-13所示。

图0-13 选择“Design”选项

当要修改Web 服务器控件的相关属性时,只需要选中该Web 服务器控件,然后在控件的属性设置窗口就可以设置控件的属性了。在这里还可以为控件添加相应的事件。当然,也可以通过鼠标双击控件的方法来为控件添加事件,如图0-14所示。

图0-14 控件的属性设置窗口

在图0-13中,我们发现页面设计器下面有三个按钮:Design、Split和Source,它们各自代表什么意思呢?其实,这是Visual Studio 提供的三种Web 页面的设计模式,分别适合于不同设计喜好的设计人员:
1) Design模式:如图0-13所示,它提供纯页面式的设计,页面元素拖曳上去后就能够马上看到设计的效果,很适合那种不喜欢写HTML代码的设计人员。
2) Source模式:如图0-15所示,它提供纯HTML代码方式的设计模式,这适合于那些对HTML 代码比较熟悉的设计人员。

图0-15 选择“Source”选项

3) Split模式:如图0-16所示,它合并了上面两种设计模式,让你既能够看页面的设计效果又能够看到页面的HTML代码。

图0-16 选择“Split”选项

第2章 HTML服务器控件 Top

我们知道,一个完整的ASP.NET Web 窗体由页面指令(如@Page)、HTML文档头head、HTML文档体body、窗体元素form与页面执行代码(包括客户端代码与服务端代码)这五大部分组成。其中,服务器控件是窗体元素form的基本组成元素,它简化了页面的开发过程,它为代码复用和封装提供了一种机制,非常适合作为Web 快速应用开发(Rapid Application Development,RAD)的设计工具。此外,服务器控件可灵活扩展的特性为众多Web 开发者敞开了令人激动的自定义控件设计的大门,让你可以在它的基础之上打造属于自己的特有控件。
本章将介绍ASP.NET 服务器控件的相关知识,并重点讲解HTML服务器控件的使用。

2.1 ASP.NET 服务器控件概述 Top

前面的章节已经讲过,ASP.NET 的最大特色就是提供了许多现成的开发控件,能让开发者通过“拖曳”的方式完成网页设计。
注意如果页面包含允许用户交互并提交的控件,则该页面必须包含一个form元素,控件必须位于form元素内。form元素必须包含runat属性,其属性值设置为server,即runat=“server”。runat= “server” 属性指示该表单应在服务器端进行处理,它同时指示包括在form元素内的控件可被服务器端脚本访问。对于ASP.NET 而言,一个页面有且只能有一个<form runat=“server”>标记。

2.1.1 ASP.NET 服务器控件的类型
在ASP.NET 中,它提供了许多不同类型的服务器控件,按照Visual Studio 工具栏的布局,可以把它们大致分为如下几种类型:
1) HTML 服务器控件。HTML 服务器控件是服务器可理解的HTML 标签,它封装了标准的HTML 元素。默认HTML 元素是作为文本来进行处理的,要想使这些元素可编程,就需要向这些HTML 元素添加runat="server" 属性,如<input id="Button1" type="button" runat="server" value="提交" />。其中,runat="server"表示该元素是一个服务器控件。除此之外,还需要添加id 属性来标识该服务器控件,在实际开发中,id是非常重要的属性,使用id可以在代码里面自由地操作HTML服务器控件。
2) Web 标准服务器控件。Web 标准服务器控件是服务器可理解的特殊ASP.NET 标签,类似于HTML服务器控件,Web 标准服务器控件也在服务器上创建,它们同样需要runat="server" 属性以使其生效。这些控件比HTML 服务器控件具有更多内置功能,它不仅包括窗体控件(例如按钮和文本框),而且还包括具有特殊用途的控件(例如日历、菜单和树视图控件)。因此,与HTML 服务器控件相比,Web 标准服务器控件更为抽象。
3) 验证控件。它的主要功能是验证用户输入,如果用户输入没有通过验证,将给用户显示一条错误消息。因此,验证控件可用于对必填字段进行检查,对照字符的特定值或模式进行测试,验证某个值是否在限定范围之内,等等。
4) 导航控件。它实现了页面导航的功能,有了这个导航功能,用户可以很方便地在一个复杂的网站中进行页面之间的跳转。它包括SiteMapPath控件、Menu 控件和TreeView 控件。
5) 数据控件。为了能够更好地满足对数据的复杂处理要求,Microsoft Expression Web 提供了两种类型的ASP.NET 数据控件:一种是数据源控件,用于设置数据库或XML 数据源的连接属性;另一种是数据控件,用于显示来自数据源控件中指定的数据源的数据。这些将在后面详细讲解,同时,它也是本书的重点内容之一。
6) 登录控件。登录控件可以算是ASP.NET 的一大特色,你不必自行编写用于表单验证的界面就可以使用这些控件来获得预建的、可定制的登录页面、密码恢复和用户创建向导。在默认情况下,登录控件与ASP.NET 成员资格和Forms 身份验证集成,以使网站的用户身份验证过程自动化。
7) Web 部件控件。ASP.NET Web 部件是一组集成的控件,用于创建允许最终用户直接通过浏览器修改网页的内容、外观和行为的网站。这些修改适用于网站上的所有用户或个别用户。当用户修改网页和控件时,可以保存这些设置以便在以后的浏览器会话中保留用户的个人首选项,这种功能称为“个性化设置”。这些Web 部件功能意味着开发人员可以使最终用户能够动态地对Web 应用程序进行个性化设置,而无须开发人员或管理人员的干预。
8) ASP.NET AJAX 控件。这些控件可以让你使用很少的客户端脚本或不使用客户端脚本就能使用Ajax技术,从而创建丰富的客户端行为,如在异步回发过程中进行部分页更新(在回发时刷新网页的选定部分,而不是刷新整个网页)和显示更新进度等。

2.1.2 ASP.NET 服务器控件的类层次结构
在ASP.NET 中,所有的服务器控件都是直接或间接地派生自System.Web.UI 命名空间中的System.Web.UI.Control 基类,无论是HTML服务器控件、Web 服务器控件,还是用户自定义控件,都是从System.Web.UI.Control 继承而来的,如图2-1所示。

图2-1  ASP.NET服务器控件的类层次结构

其中,System.Web.UI.WebControls 包含了Web 服务器控件,System.Web.UI.HtmlControls 包含了HTML 服务器控,System.Web.UI.Page 是所有ASP.NET Web 页面(.aspx文件)的基类,System.Web.UI.UserControl 是所有ASP.NET Web 用户控件(.ascx文件)的基类,System.Web.UI.Page 和System.Web.UI.UserControl 不能同时被继承。表2-1与表2-2描述了Control类的常用属性与方法。
表2-1  Control类的常用属性

表2-2  Control类的常用方法

2.2 HTML服务器控件概述 Top

经过2.1节对ASP.NET 服务器控件的阐述,相信你已经对ASP.NET 服务器控件有了一定的了解,现在就来深入地学习ASP.NET 的HTML服务器控件。

2.2.1 HTML标签和HTML服务器控件之间的区别
早期的Web 开发只能够使用HTML来开发Web 页面,这种HTML标签给开发过程带来了许多的不便,比如无法利用程序直接来控制这些HTML标签的属性、使用方法和接收事件等,我们只能够借助于网页脚本语言(如JavaScript等)来间接地控制这些HTML标签。
而在ASP.NET 中提供了HTML服务器控件之后,这些难以控制的HTML标签有了更好的选择方案。我们既可以保留原来的HTML标签使用方法,也可以把它转换成服务器控件从而直接在程序中控制,其转换方法就是上面所讲的—向这些HTML 标签添加runat="server" 属性,如<input id="Button1" type="button" runat="server" value="提交" />。当然,为了能够方便地通过编程方式引用该HTML服务器控件,还需要设置该控件的id(如id="Button1")属性(Attribute),然后可以通过设置属性来声明HTML服务器控件实例上的属性(Property)参数和事件绑定。
从上面的阐述中可以看出,HTML标签和HTML服务器控件之间存在的区别就是:HTML服务器控件运行于服务器端,而HTML标签运行于客户端。具体来说,当ASP.NET 网页执行时,会检查HTML标签有无runat 属性,如果该HTML标签没有设定runat 属性,那么这个HTML标签就会被视为字符串,并被送到字符串流等待送到客户端,客户端的浏览器会对其进行解释;如果HTML标签设定了runat="server"属性,Page 对象会将该控件放入控制器,服务器端的代码就能对其进行控制,等到控制执行完毕后再将HTML服务器控件的执行结果转换成HTML标签,然后当成字符串流发送到客户端进行解释。

2.2.2 HTML服务器控件的类层次结构
在ASP.NET 中,所有的HTML 服务器控件都定义在System.Web.UI.HtmlControls 命名空间中,它们可以根据控件是否是输入控件(派生于HtmlInputControl)或者是否包含其他控件(也可称为容器控件,它们派生于HtmlContainerControl)来划分为几大类,可以用图2-2来描述这种结构。

图2-2 HTML服务器控件的类层次结构

如图2-2所示,所有的HTML 服务器控件都派生自HtmlControl基类,并提供大概20多个独立的HTML服务器控件类,这些控件类映射的HTML元素如表2-3所示。它们提供以下功能:1) 每个服务器控件都公开一些属性(Property)。可以使用这些属性(Property)在服务器代码中以编程方式来操作该控件的标记属性(Attribute)。2) 每个服务器控件都提供一组事件。可以为其编写事件处理程序,方法与在基于客户端的窗体中大致相同,所不同的是事件处理是在服务器代码中完成的。
3) 除了可以在服务器代码中处理事件,还可以在客户端脚本中处理事件。
4) 自动维护控件状态。在页到服务器的往返行程中,将自动对用户在HTML 服务器控件中输入的值进行维护,并发送回浏览器。
5) 与ASP.NET 验证控件进行交互,因此可以验证用户是否已在控件中输入了适当的信息。
6) 数据绑定到一个或多个控件属性。
7) 支持样式。
8) 直接可用的自定义属性。可以向HTML服务器控件添加所需的任何属性,页框架将呈现这些属性,而不会更改其任何功能。这允许你向控件添加浏览器特定的属性。
表2-3 HTML服务器控件的.NET类与映射的HTML元素


2.2.3 HTML服务器控件的共有属性
如前文所讲到的,在ASP.NET 中,每个HTML服务器控件都有自己的属性(Property),你可以使用这些属性(Property)在服务器代码中以编程方式来操作该控件的标记属性(Attribute),并且在HTML 服务器控件上声明的任何属性(Property)都将添加到该控件的Attributes 集合中,也可以像属性(Property)那样以编程方式对它进行操作。例如,如果在<body> 元素上声明bgcolor 属性,即可以编程方式访问该属性并编写事件处理程序以更改它的值。
1. 所有HTML服务器控件共享的属性
在这些HTML 服务器控件中,存在着一些共享的属性,如表2-4所示。
表2-4 所有HTML服务器控件共享的属性


2. 所有HTML输入控件共享的属性
HTML输入控件派生自HtmlInputControl,包括HtmlInputText 、HtmlInputPassword、HtmlInputButton、HtmlInputSubmit、HtmlInputReset、HtmlInputCheckBox、HtmlInputImage、HtmlInputHidden、HtmlInputFile 和HtmlInputRadioButton 控件。它允许用户交互,主要用于处理用户的数据输入与提交操作,并映射到标准HTML 输入元素。其中,Type 属性定义它们在网页上呈现的输入控件的类型,它们共享下列属性,如表2-5所示。
表2-5 所有HTML输入控件共享的属性


3. 所有HTML容器控件共享的属性
HTML容器控件派生于HtmlContainerControl,包括HtmlTableCell 、HtmlTable 、HtmlTableRow 、HtmlButton、HtmlForm、HtmlAnchor、HtmlGenericControl、HtmlSelect 和HtmlTextArea 控件。它映射到HTML 元素,这些元素必须具有开始和结束标记,如<textarea id="TextArea1" cols="20" rows="2"></textarea>和<select id="Select1">... </select>元素,它们共享下列属性,如表2-6所示。
表2-6 所有HTML 容器控件共享的属性

2.3 HTML输入控件(1) Top

上面简要地讲解了HTML输入控件的概念,接下来将结合开发中的实际应用来逐一详细讲解它们的使用方法。
2.3.1 HtmlInputButton控件
HtmlInputButton控件用来控制<input type="button" runat="server">、<input type="submit" runat="server">和<input type="reset" runat="server">元素,并允许你建立命令按钮(button)、提交(submit)按钮和重置(reset)按钮。
在这个控件中有两个非常重要的事件,即onclick 和onserverclick事件。在实际开发中,可以通过为它们提供自定义事件处理程序,在单击控件时执行特定的指令集。其中,onclick事件属于客户端事件,用于在客户端使用脚本代码(如JavaScript)进行处理;而onserverclick事件属于服务器端事件,它需要在后台代码里(即.cs文件)进行处理。来看下面的例子,如代码清单2-1所示。
代码清单2-1 TestHtmlInputButton.aspx
<form id="form1" runat="server">
    <div>
        <table>
            <tr align="center">
                <td>
                    <input id="txt_a" type="Text" size="2" maxlength="5" value="1"
                     runat="server" />
                </td>
                <td>
                    +
                </td>
                <td>
                    <input id="txt_b" type="Text" size="2" maxlength="5" value="2"
                     runat="server" />
                </td>
                <td>
                    =
                </td>
                <td>
                    <span id="Sum" runat="server" />
                </td>
            </tr>
            <tr align="center">
                <td colspan="4"> 
                    <input id="bt_Add_Button" type="Button" name="AddButton_Button"
                     value="添加(Button)" onserverclick="AddButton_Button_Click" runat="server" />
                        <input id="bt_Add_Submit" type="Submit" name="AddButton_Submit"
                        value="添加(Submit)" onserverclick="AddButton_Submit_Click"
                        runat="server" />
                        <input id="bt_Reset" type="Reset"
                        value="重置(Reset)" runat="server" />
                </td>
            </tr>
        </table>
    </div>
</form>

代码清单2-1分别定义了两种类型的输入按钮(Button与Submit),并为它们添加了相应的onserverclick 事件(AddButton_Button_Click和AddButton_Submit_Click)。事件的功能都很简单,都是实现两个文本框数据的相加,代码如下所示:
protected void AddButton_Button_Click(Object sender, EventArgs e)
{
    Sum.InnerHtml = (Convert.ToInt32(txt_a.Value)
                     + Convert.ToInt32(txt_b.Value)).ToString();
}
protected void AddButton_Submit_Click(Object sender, EventArgs e)
{
    Sum.InnerHtml =(Convert.ToInt32(txt_a.Value)
                     +Convert.ToInt32(txt_b.Value)).ToString();
}

为onserverclick 事件添加好处理程序之后,编译运行程序,结果如图2-3所示。

图2-3代码清单2-1的运行结果

在图2-3中,只要文本框的值不变,不论你是单击添加(Button)按钮还是单击添加(Submit)按钮,所得到的结果都不变。而这里的重置
(Reset)按钮的作用是将文本框的数据重置到初始状态。

注意:Reset类型的按钮不支持onserverclick事件。单击Reset 按钮时,不一定必须清除页上的所有输入控件。相反,在加载页时,它们返回到它们的原始状态。例如,如果文本框最初包含值“1”,则单击Reset 按钮会使文本框返回到该值。

2.3.2 HtmlInputSubmit和HtmlInputReset控件
HtmlInputSubmit 和HtmlInputReset 控件都是从HtmlInputButton 控件中派生出来的。其中,HtmlInputSubmit控件用于在网页上创建一个提交窗体的按钮控件,如<input id="bt_Add_Submit" type="Submit" name="AddButton_Submit" value="添加(Submit) " onserverclick= "AddButton_Submit_Click" runat="server" />;而HtmlInputSubmit控件用于在网页上创建一个按钮控件,该控件将窗体控件重置为其初始值,如<input id="bt_Reset" type="Reset" value="重置(Reset)" runat="server" />。通常,这两个控件放在一起使用,具体使用方法请参考代码清单2-1。

2.3.3 HtmlInputImage控件
HtmlInputImage控件用来控制<input type="image" runat="server">元素,它的功能与一般的按钮控件差不多。唯一不同的是它可以使用图片来替代常规样式的按钮,可以通过它的src属性来为按钮设置相关的图标。如:
<input id="bt_Image" type="image" src="Images/1.jpg" onserverclick="bt_Image_Click"/>

还可以通过onmouseover和onmouseout事件来动态地改变按钮的图标显示。如:
<input id="bt_Image1" type="image" src="Images/1.jpg"
           onmouseover="this.src='Images/1.jpg';"
           onmouseout="this.src='Images/2.jpg';"
           onserverclick="bt_Image1_Click"/>

在上面的代码中,默认页面启动时和鼠标放在按钮上面时,按钮显示Images/1.jpg图标,当鼠标离开按钮时,则显示Images/2.jpg图标。

2.3.4 HtmlInputRadioButton控件
HtmlInputRadioButton 控件用来控制<input type="radio" runat="server">元素,可以使用它在网页上建立一个单选按钮。通过将它的Name属性设置为组内所有<input type="radio" runat="server"> 元素所共有的值,可以将多个HtmlInputRadioButton 控件组成一组。同组中的单选按钮互相排斥,一次只能选择该组中的一个单选按钮,如代码清单2-2所示。
代码清单2-2 TestHtmlInputRadioButton.aspx
<form id="form1" runat="server">
    <div>
        <input type="radio" id="Radio1" name="Mode"
        onserverchange="Server_Change" runat="server" />
        选项1<br />
        <input type="radio" id="Radio2" name="Mode"
        onserverchange="Server_Change" runat="server" />
        选项2<br />
        <input type="radio" id="Radio3" name="Mode"
        onserverchange="Server_Change" runat="server" /> 
        选项3
        <br />
        <span id="Span1" runat="server" /> 
        <br /> 
        <input type="submit" id="Button1" value="保存" runat="server" />
    </div>
</form>

为了能够更好地演示HtmlInputRadioButton 控件,在代码清单2-2中,分别定义了3个HtmlInputRadioButton 控件(Radio1、Radio2和Radio3),并把它们的name属性统一设置成Mode (即它们是一组单选控件)。在这里需要注意的是,HtmlInputRadioButton 控件不会自动向服务器回送,所以必须在页面添加一个按钮<input type="submit" id="Button1" value="保存" runat= "server" />来触发它的onserverchange事件。事件的代码如下所示:
protected void Server_Change(object Source, EventArgs e)
{
    if (Radio1.Checked == true)
        Span1.InnerHtml = "选项1选中";
    else if (Radio2.Checked == true)
        Span1.InnerHtml = "选项2选中
    "else if (Radio3.Checked == true)
        Span1.InnerHtml = "选项3选中"}

为onserverchange事件添加好处理程序之后,编译运行程序,结果如图2-4所示。

图2-4  代码清单2-2的运行结果

在图2-4中,你只能够在这组单选框选择其中一个,并且只有单击“保存”按钮后,才能够触发后台代码的Server_Change事件将结果显示出来。
注意:由代码清单2-2可以看出,HtmlRadioButton 控件不会自动向服务器回送,它必须依赖于使用某个按钮控件(如HtmlInputButton、HtmlInputImage 或HtmlButton)来回送到服务器。可以通过为onserverchange事件编写处理程序来对HtmlRadioButton 控件进行编程。
<form id="form1" runat="server">
    <div>
        <input type="radio" id="Radio1" name="Mode" runat="server" /> 
        选项1<br /> 
        <input type="radio" id="Radio2" name="Mode" runat="server" /> 
        选项2<br /> 
        <input type="radio" id="Radio3" name="Mode" runat="server" /> 
        选项3
         <br /> 
        <span id="Span1" runat="server" /> 
        <br /> 
        <input type="submit" id="Button1" value="保存" 
        runat="server" onserverclick="Server_Change"/>
    </div>
</form>

2.3 HTML输入控件(2) Top

2.3.5 HtmlInputCheckBox控件
HtmlInputCheckBox控件用来控制<input type="checkbox" runat="server">元素,可以使用它在网页上建立一个选择按钮,单选或者多选都可以。同HtmlRadioButton 控件一样,它同样不会自动向服务器回送。当使用回送服务器的控件(如HtmlInputButton 控件)时,复选框的状态被发送到服务器进行处理,这时可以在后台代码里使用控件的Checked属性来获取选择框是否被选中(true选中,false 未选中)。当然,也可以直接在页面里给控件默认为选中状态(即在控件里设置checked="checked"),如代码清单2-3所示。
代码清单2-3 TestHtmlInputCheckBox.aspx
<form id="form1" runat="server">
    <div>
    <input id="Checkbox1" type="checkbox" runat="server" checked="checked" />
        选项1 &nbsp;&nbsp;
        <input id="Checkbox2" type="checkbox" runat="server" />
        选项2 &nbsp;&nbsp;
        <input id="Checkbox3" type="checkbox" runat="server" />
        选项3 &nbsp;&nbsp;
        <br />
        <span id="Span1" runat="server" />
        <br />
<input type="button" id="Save" value="保存" onserverclick="Save_Click" runat="server" />
    </div>
</form>

与HtmlInputRadioButton一样,可以使用同样的方法来获取HtmlInputCheckBox控件的选择情况,代码如下所示:
protected void Save_Click(object Source, EventArgs e)
    {
        string str = string.Empty;
        if (Checkbox1.Checked == true)
        {
            str += "选项1选中";
        }
        if (Checkbox2.Checked == true)
            str += "选项2选中";
        }
        if (Checkbox3.Checked == true)
           str += "选项3选中";
        }
        Span1.InnerHtml = str;
    }


2.3.6 HtmlInputText 和HtmlInputPassword控件
对于HtmlInputText 控件,相信大家并不陌生,因为前面的章节已经多次用到过该控件,它用来在网页上建立一个数据输入的单行文本框和用户进行交互。因此,它可以控制<input type="text" runat="server">和<input type="password" runat="server">元素。
而HtmlInputPassword 控件是从HtmlInputText 类派生出来的,用于创建一个允许用户输入密码的单行文本框。因此,它只能够控制<input type="password" runat="server">元素。当Type 属性设置为password 时,将屏蔽文本框中的输入内容,从而也对输入的密码起到保护作用。不论是HtmlInputText 控件还是HtmlInputPassword 控件,都可以通过使用MaxLength、Size 和Value 属性来分别控制可输入的字符数、控件宽度和控件内容。
关于它们的使用方法,请参考代码清单2-1,这里就不再另外举例说明。

2.3.7 HtmlInputFile控件
HtmlInputFile 控件用来控制<input type="file" runat="server">元素,该控件可以使用户能够将二进制文件或文本文件从浏览器上传到在Web 服务器上指定的目录中。目前,所有HTML 3.2 和更高版本的Web 浏览器都允许进行文件上传。使用例子如代码清单2-4所示。
代码清单2-4 TestHtmlInputFile.aspx
<form id="form1" method="post" enctype="multipart/form-data" runat="server">
    <div>
        <input id="myFile" type="file" runat="server"/>
        <br />
        <input id="Submit1" type="submit" value="上传文件"
        onserverclick="UploadBtn_Click" runat="server" />
        <br />
        <div id="fileDetails" visible="false" runat="server">
            文件名称: <span id="fileName" runat="server" />
            <br />
            文件类型: <span id="fileType" runat="server" />
            <br />
            文件大小: <span id="fileLength" runat="server" />bytes
            <br />
        </div>
        </div>
</form>

如代码清单2-4所示,页面窗体的代码实现了一个HtmlForm 控件、一个HtmlInputFile 控件(用于打开要上传的本地文件)、一个HtmlInputButton 控件(用于执行文件上传事件)和四个HtmlGenericControls控件(一个<div> 元素和三个<span> 元素,每个元素的开始标记中都包含runat="server" 属性/值对,它们用来显示上传文件的具体信息)。
其中,HtmlForm控件需要特别注意,如果要在该控件里实现文件上传功能,它的enctype 属性必须设置为"multipart/form-data",即<form id="form1" method="post" enctype= "multipart/form- data" runat="server">。设计好页面之后,下面来看UploadBtn_Click事件的后台实现代码,如下所示:
protected void UploadBtn_Click(Object sender, EventArgs e)
    {
        //获取文件相关信息
        fileName.InnerHtml = myFile.PostedFile.FileName; 
        fileType.InnerHtml = myFile.PostedFile.ContentType; 
        fileLength.InnerHtml =myFile.PostedFile.ContentLength.ToString(); 
        //显示DIV控件
        fileDetails.Visible = true; 
        //上传文件保存到服务器相关的目录
        myFile.PostedFile.SaveAs("c:\\uploadfile.txt");
    }

在上面的代码中,先获取文件的文件名、文件类型和文件大小(以字节为单位)显示在DIV控件中,同时将DIV设置为可用状态。再使用语句myFile. PostedFile. SaveAs ("c:\\uploadfile.txt")将文件本身上传到服务器上的C盘根目录下。运行结果如图2-5所示。
图2-5 代码清单2-4的运行结果


2.3.8 HtmlInputHidden控件
HtmlInputHidden控件在实际开发中应用非常广泛,它用来控制<input type="hidden" runat= "server">元素,该控件用来建立一个隐含的Input域。尽管此控件是窗体的一部分,但它永远不在窗体上显示。由于在HTML 中不保持状态,所以此控件通常与HtmlInputButton 和HtmlInputText 控件一起使用,用于存储在服务器之间发送的信息。
下面的示例演示了如何使用HtmlInputHidden 控件跨请求保存视图状态信息,如代码清单2-5所示。
代码清单2-5 TestHtmlInputHidden.aspx
<form id="form1" runat="server">
    <div> 
        <input id="txt_hiddenDoc" type="hidden" value="初始的隐藏值" runat="server" /> 
        输入值:<input id="txt_Doc" type="text" size="40" runat="server" /> 
        <br /> 
        <input id="bt_save" type="submit" value="保存" 
        onserverclick="Bt_Save_Click" runat="server" /> 
        <br /> 
        <span id="Span1" runat="server"></span>
    </div>
</form>

在代码清单2-5中,隐藏控件txt_hidden用来保存Doctxt_Doc 文本框的值,而<span> 控件用于显示存储在与当前请求紧邻的前一个Web 请求的隐藏字段中的文本。后台实现代码如下所示:
protected void Page_Load(object sender, EventArgs e)
{
    if (Page.IsPostBack)
    {
        Span1.InnerHtml = "隐藏值: <b>"+txt_hiddenDoc.Value + "</b>";
    }
}
protected void Bt_Save_Click(object Source, EventArgs e)
{
    txt_hiddenDoc.Value = txt_Doc.Value;
}

编译运行程序,会看到如图2-6所示的运行结果。在图2-6中,隐藏控件txt_hiddenDoc已经保存了它的初始值“初始的隐藏值”。这时,在“输入值”文本框里面添加文本“我爱ASP.NET”,单击“保存”按钮,会发现Span1控件显示的不是“我爱ASP.NET”,而是“初始的隐藏值”,如图2-7所示。

图2-6 代码清单2-5的运行结果

图2-7 第一次单击“保存”按钮运行结果
再次单击“保存”按钮,这时候的隐藏控件txt_hiddenDoc里已经保存了txt_Doc文本框的值,所以能够看到如图2-8所示的结果。

图2-8 第二次单击“保存”按钮运行结果
其实,根据上面的运行结果我们不难发现,这个程序有两个事件处理程序。第一个事件在页被回送到服务器时发生,事件处理程序获取存储在前一个发送请求的隐藏字段中的文本,并将它显示在<span> 控件中,即显示“隐藏值:初始的隐藏值”。第二个事件在单击submit 按钮时发生,该事件处理程序获取文本框的内容,并将它存储在网页上的隐藏字段中。

2.4 HTML容器控件 Top

2.4 HTML容器控件
HtmlSelect 和HtmlTextArea 控件是HTML容器控件中日常开发使用最多的控件,且使用难度高于其他的容器控件。为了能够更好地掌握它们,本部分将重点讨论这两个控件的使用方法。
2.4.1 HtmlTextArea 控件
HtmlTextArea 控件用来控制<textarea runat="server">元素,可以使用它在网页上创建一个多行文本框,文本框的尺寸由Cols 和Rows 属性控制。其中,Cols 属性确定控件的宽度,而Rows 属性确定控件的高度。如:
<textarea id="TextArea1" cols="40" rows="4" runat="server" />
而在后台代码里,只要使用该控件的Value 属性就可以获取到它的值,如TextArea1.Value 。与HtmlInputText 控件一样,该控件也包含onserverchange事件,当控件的内容在对服务器进行发送之前更改时,将引发该事件。通常,该事件用于验证在控件中输入的文本。
2.4.2 HtmlSelect控件
HtmlSelect控件用来控制<select runat="server">元素,可以使用它在网页上创建一个数据下拉列表选项框。看下面的例子,如代码清单2-6所示。
代码清单2-6 TestHtmlSelect.aspx
<form id="form1" runat="server">
    <div>
        选择一个颜色:<br />
        <select id="sl_Color" runat="server">
            <option>SkyBlue</option>
            <option>LightGreen</option>
            <option>Gainsboro</option>
            <option>LemonChiffon</option>
        </select>
        <input id="submit1" type="Submit" runat="server"
        value="提交" onserverclick="Bt_Submit_Click" />
        <br />
    <input type="text" id="txt_Color" runat="server" />
    <input id="adToSelect" type="Submit" runat="server"
    value="添一个颜色选项到HtmlSelect控件"
    onserverclick="Bt_AddToSelect_Click" />
        <p />
        <span id="Span1" runat="server">颜色变换演示区域</span>
    </div>
</form>

在代码清单2-6中,需要使用sl_Color下拉列表选项框中的项(option)通过Bt_Submit_Click事件来为Span1 控件设置背景色。与此同时,还需要将txt_Color 文本框里的内容通过Bt_ AddToSelect_Click 事件动态地添加到sl_Color下拉列表选项框,以供程序选择使用。后台的实现代码如下所示:
protected void Bt_Submit_Click(object Source, EventArgs e)
{
    Span1.Style["background-color"] = sl_Color.Value;
}
    protected void Bt_AddToSelect_Click(object Source, EventArgs e)
sl_Color.Items.Add(txt_Color.Value);
}

在上面的代码中,语句sl_Color.Items.Add(txt_Color.Value) 为txt_Color控件动态添加一个颜色选项。在这里需要注意的是,Items 属性属于ListItemCollection 类型,因此可以访问它的Add 方法将新的选项添加到下拉列表选项框中。而sl_Color.Value 语句则用来获取txt_Color控件的选项值,代码的运行结果如图2-9所示。

图2-9 代码清单2-6的运行结果
默认情况下,此控件呈现为下拉列表选项框。但是,如果允许多重选择(通过指定Multiple 属性)或为Size 属性指定大于1 的值,则该<se控件将显示为列表框。如:
lect id="sl_Color" runat="server" size="5">

当给控件添加一个size="5"属性时,运行界面如图2-10所示。

图2-10 添加size=“5”属性的运行结果
其实,在实际开发中,除了可以直接在页面设置选项之外,经常还需要将该控件动态绑定到数据源,以便于在后台能够灵活地控制HtmlSelect控件的选项数据。这时,可以设置DataSource 属性以指定要将其绑定到该控件的数据源。如:
ArrayList values = new ArrayList();
values.Add("#0066CC");
values.Add("#0099CC");
values.Add("#003366");
sl_Color.DataSource = values;
sl_Color.DataBind();

在将数据源绑定到该控件后,可以通过设置DataValueField 和DataTextField 属性,分别指定将哪个字段绑定到控件的Value 和Text 属性。
  • 大小: 72.5 KB
  • 大小: 51.7 KB
  • 大小: 14.3 KB
  • 大小: 18.6 KB
  • 大小: 15.5 KB
  • 大小: 17 KB
  • 大小: 19.5 KB
  • 大小: 14 KB
  • 大小: 23.2 KB
  • 大小: 18 KB
  • 大小: 25.7 KB
  • 大小: 42.2 KB
  • 大小: 25.9 KB
  • 大小: 19.9 KB
  • 大小: 51.4 KB
  • 大小: 26.1 KB
  • 大小: 47.1 KB
  • 大小: 27 KB
  • 大小: 17.5 KB
  • 大小: 20.9 KB
  • 大小: 20 KB
  • 大小: 22.5 KB
  • 大小: 22.4 KB
  • 大小: 25.5 KB
  • 大小: 25.3 KB
  • 大小: 29.5 KB
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

文章信息

Global site tag (gtag.js) - Google Analytics