-
ASP.NET讲座(2)-ASP.NET控件
2.1 ASP.net 入门
通常谈一个学科,我们老是说,它入门很简单的嘛,ASP.net也是。ASP.net提出一个概念,就是认为WEB页面,也是一个窗体,所以,学习过面向对象编程的VB VC BC Dephi的朋友,学起来就简单多了。
一个ASP.net页面的后缀名是".aspx",所以,IIS在你安装完ASP.net时,也会把Default.aspx作为你的默认首页,网管朋友一定要注意了。
ASP.net 是后天编译运行的,只是在第一次运行时编译,所以,以后的运行速度比ASP执行快。
2.2 写自己第一个ASP.net的程序
激动吗?很快就开始写第一个程序了,一般学任何语言都要Hello World!一下吧,那我们也来。
在这之前写要说一下,ASP.net的程序可以用任何东西写,甚至是Windows的记事本,当初基督山也很疑惑,要不要用 V Interdev .net 来编写啊,事实证明,那玩意没手写好用。
<%@ Page Language="VB"%> '说明一下你使用的哪一种语言来写.net的,如果是VB的话,这行可以不写。
<%Reponse.Write ("Hello World")%>
命名 myfirstasp_net.aspx 来我们运行一下,果然,Hello World!
注意,Response.Write 语句,我们原来写成 Response.Write "Hello World!"也是正确的,但在.net中,必须用"("和")"。
2.3 HTML 控件
ASP.net 框架中的第一组控件称为 HTML 控件。这些控件位于 System.Web.UI.HtmlControls 命名空间中,是从 HtmlControl 基类中直接或间接派生出来的。图 1 说明了 HTML 控件的类层次结构。

图 1. ASP+ HTML 控件
几乎所有对于任何包含 runat="server" 属性的标记,都会为其生成 HTML 控件。例如,下面的 HTML 可创建一个名为"textBox1"的 HtmlInputText 控件的实例:
<input type="text" runat="server" id="textBox1" value="some text">
下表中列出了 HTML 控件以及对应的 HTML 标记。
| 控件 |
对应的标记 |
| HtmlAnchor |
<a> |
| HtmlButton |
<button> |
| HtmlSelect |
<select> |
| HtmlTextArea |
<textarea> |
| HtmlInputButton |
<input type="button"> |
| HtmlInputCheckBox |
<input type="check"> |
| HtmlInputRadioButton |
<input type="radio"> |
| HtmlInputText |
<input type="text"> 和 <input type="password"> |
| HtmlInputHidden |
<input type="hidden"> |
| HtmlInputImage |
<input type="image"> |
| HtmlInputFile |
<input type="file"> |
| HtmlForm |
<form> |
| HtmlImage |
<img> |
| HtmlTable |
<table> |
| HtmlTableRow |
<tr> |
| HtmlTableCell |
<td> |
| HtmlGenericControl |
任何其它没有对应控件的标记,如 <span>、<div> 等 |
对于现有的ASP程序,如果向ASP.net移植,毫无疑问HTML控件将发挥最大的作用。
2.4 Web 控件
ASP.net 框架中的第二组服务器控件称为 Web 控件。这些控件位于 System.Web.UI.WebControls 命名空间中,是从 WebControl 基类中直接或间接派生出来的。图 2 说明了 Web 控件的类层次结构。
Web 控件中包括传统的表单控件,如 TextBox 和 Button ,以及其它更高抽象级别的控件,如 Calendar 和 DataGrid 控件。它们提供了一些能够简化开发工作的特性,其中包括:
丰富而一致的对象模型:WebControl 基类实现了对所有控件通用的大量属性,这些属性包括 ForeColor、BackColor、Font、Enabled 等。属性和方法的名称是经过精心挑选的,以提高在整个框架和该组控件中的一致性。通过这些组件实现的具有明确类型的对象模型将有助于减少编程错误。
对浏览器的自动检测:Web 控件能够自动检测客户机浏览器的功能,并相应地调整它们所提交的 HTML,从而充分发挥浏览器的功能。
数据绑定:在 Web 窗体页面中,可以对控件的任何属性进行数据绑定。此外,还有几种 Web 控件可以用来提交数据源的内容。
在 HTML 标记中,Web 控件会表示为具有命名空间的标记,即带有前缀的标记。前缀用于将标记映射到运行时组件的命名空间。标记的其余部分是运行时类自身的名称。与 HTML 控件相似,这些标记也必须包含 runat="server" 属性。下面是一个声明的示例:
<asp:TextBox id="textBox1" runat="server" Text="基督山伯爵">
</asp:TextBox>
在上例中,"asp"是标记前缀,会映射到 System.Web.UI.WebControls 命名空间。

图 2. ASP+ Web 控件
文本显示
Label 控件用于在页面中显示只读的静态文本或数据绑定的文本:
<asp:Label runat="server" Text="Label1" Font-Italic="true">
</asp:Label>
输入控件
Web 控件组中包含的一些控件,允许最终用户输入将由服务器上的页面处理的数据。
TextBox 控件用于提供文本编辑能力。与 Label 控件相似,这里的文本也可以是数据绑定的。TextBox 控件支持多种模式,可以用来实现单行输入、多行输入和密码输入:
| <asp:TextBox runat="server" Text="TextBox1"></asp:TextBox> |
<asp:TextBox runat="server" Mode="Multiline" Rows="3"> TextBox1 </asp:TextBox> |
| <asp:TextBox runat="server" Mode="Password"></asp:TextBox> |
CheckBox 控件用于生成能够在选中和清除这两种状态间切换的复选框:
<asp:CheckBox runat="server" Text="CheckBox1" Checked="True"> </asp:CheckBox> |
RadioButton 控件与 CheckBox 控件相似,但使用时通常会与其它 RadioButton 控件组成一组,以提供一组互斥的选项:
<asp:RadioButton runat="server" Text="RadioButton1" GroupName="Group1" Checked="true"> </asp:RadioButton> <asp:RadioButton runat="server" Text="RadioButton2" GroupName="Group1"></asp:RadioButton> |
选择控件
下面的四个控件提供了允许用户从展示给他们的选项中进行选择的机制。选项列表的内容既可像下面的示例中那样是静态定义的,也可以使用数据源来动态填充。
DropDownList 控件提供了将选项显示为下拉式列表,并从中进行单项选择的能力:
<asp:DropDownList runat="server">
<asp:ListItem Text="Choice1" Value="1" selected="true"/>
<asp:ListItem Text="Choice2" Value="2"/>
</asp:DropDownList>
ListBox 控件能够以可滚动列表的形式显示选项,并允许从中选择单个或多个选项:
<asp:ListBox runat="server" SelectionMode="Multiple"> <asp:ListItem Text="Choice1" Value="1" selected="true"/> <asp:ListItem Text="Choice2" Value="2"/> </asp:ListBox> |
CheckBoxList 控件用于创建一组显示为一列或多列的 Checkbox 控件:
<asp:CheckBoxList runat="server"> <asp:ListItem Text="Choice1" Value="1" selected="true"/> <asp:ListItem Text="Choice2" Value="2" selected="true"/> </asp:CheckBoxList > |
RadioButtonList 控件与 CheckBoxList 控件非常相似。不同之处在于,它使用的是一组 RadioButton 控件以创建一组互斥的选项:
<asp:RadioButtonList runat="server"> <asp:ListItem Text="Choice1" Value="1" selected="true"/> <asp:ListItem Text="Choice2" Value="2"/> </asp:RadioButtonList > |
表单提交和回传
下列控件用于将带有用户输入值的页面提交给服务器,以便用页面中的代码对这些值进行处理。这些控件会在服务器上产生一个 Click 事件,供您在代码中使用。
Button 控件可以生成一个能够将页面再提交给服务器的三维按钮:
| <asp:Button runat="server" Text="单击我"></asp:Button> |
LinkButton 控件的行为与 Button 控件相同。但它在页面上会显示为一个超级链接:
| <asp:LinkButton runat="server" Text="单击我"></asp:Button> |
ImageButton 控件也用于提交页面。它会显示为一幅图像,并且能够提供用户单击位置的 x 坐标和 y 坐标:
| <asp:ImageButton runat="server" ImageUrl="net.gif"></asp:Button> |
导航
HyperLink 控件用于生成能够跳转到其它 URL 的链接:
<asp:HyperLink runat="server" Text="跟我来" NavigateUrl="MyPage.aspx"> </asp:HyperLink> |
图像显示
Image 控件能够在页面上显示图像:
<asp:Image runat="server" ImageUrl="net.gif"></asp:Image>

版面控件
Panel 控件常用作简单的组合控件以及动态创建的控件的容器。(请注意,Panel 控件通常不具有可见的外观。)
<asp:Panel runat="server"></asp:Panel>
Table 控件与相关的 TableRow 和 TableCell 控件相结合,可以用来以编程的方法创建表或表式版面布局:
<asp:Table runat="server" GridLines="Both" BorderWidth="1px"> <asp:TableRow> <asp:TableCell>[0,0]</asp:TableCell> <asp:TableCell>[0,1]</asp:TableCell> </asp:TableRow> <asp:TableRow> <asp:TableCell>[1,0]</asp:TableCell> <asp:TableCell>[1,1]</asp:TableCell> </asp:TableRow> </asp:Table> |
日期选择
Calendar 控件能够让用户浏览日期并进行日期选择(包括选择日期范围):
<asp:Calendar runat=server DayNameFormat="FirstLetter" ...> <property name=SelectedDayStyle> <asp:TableItemStyle Font-Bold="True" BackColor="#CCCCFF"/> </property> ... </asp:Calendar> |
列表绑定控件
列表绑定控件用于显示与其相关联的数据源或列表的内容。它们提供了创建多种自定义及标准版式的能力。关于数据邦定,我们会用一个章节的内容来完整的说它。
Repeater 控件是一个简单的列表绑定控件,它使用模板(即用于设定版式的 HTML 代码片断)来以一种"朴实无华"的,即没有预定义外观的方式显示数据源的内容:
<asp:Repeater runat="server"> <template name="HeaderTemplate"> <ol> </template> <template name="ItemTemplate"> <li> <a runat="server" href='<%# DataBinder.Eval(Container.DataItem, "SiteURL") %>'> <%# DataBinder.Eval(Container.DataItem, "SiteName") %> </a> </li> </template> <template name="FooterTemplate"> </ol> </template> </asp:Repeater> |
DataList 控件也使用模板来显示与之绑定的数据源的内容。此外,它还提供了自定义外观格式和布局的功能:
<asp:DataList runat="server"> <template name="ItemTemplate"> <%# DataBinder.Eval(Container.DataItem, "PersonName") %> ... </template> ... </asp:DataList> |
DataGrid 控件能够创建格式丰富的列表版式,用来显示与之绑定的数据源的内容。它提供了对排序、编辑和分页的支持。
<asp:DataGrid runat="server" ...> <property name="Columns"> <asp:BoundColumn HeaderText="ID" .../> ... </property> ... </asp:DataGrid> |
|

Validation 控件
Validation 控件简化了对用户输入的内容进行验证的工作。它们能自动为上层浏览器生成客户机端脚本,以便在进行回传前,在用户的计算机上进行验证,从而实现了交互性和对用户友好性更加良好的页面。与此同时,它们也能在服务器上作为第二道防线来完成同样的工作。"有关的参考资料"一节中列出的其它文章对此进行了详细说明。
RequiredFieldValidator 控件用于确保用户填写了必须输入的那些输入控件。
RangeValidator 控件用于检查用户输入的内容在有效取值范围之内。这对于数字或日期类型的输入内容十分有用。
CompareValidator 控件用于对比一个控件中的输入内容与另一个控件中的输入内容。
RegularExpressionValidator 控件能够检查用户输入的内容是否符合作为标准的规范表达式(或字符串模式)。
CustomValidator 控件允许您提供自定义的服务器端和客户机端验证逻辑。
ValidationSummary 控件能够提供由验证控件生成的所有错误信息的概要。
零杂控件
这个,我们会在第四讲,验证表单内容中详细阐述
AdRotator 控件用于显示广告或横幅。广告的有关信息(包括其图像的 URL)使用 XML 文件来定义:
<asp:AdRotator runat="server" AdvertisementFile="AdsList.xml"> </asp:AdRotator> |
2.5 HTML 控件,WEB控件,都可以产生一样的效果,到底谁优谁劣?
在开发这些控件时,我们反复地问自己,是否真的有必要同时提供具有一些重复功能的 HTML 控件组和 Web 控件组。您肯定也想了解 HTML 控件和 Web 控件究竟有什么异同,以及它们各自适用的场合。 这两组控件的异同可以通过以下方面来比较。
控件抽象
HTML 控件不具备任何抽象能力。每种控件与 HTML 标记都是一一对应的(请参见表 1)。
Web 控件创建了更高级别的抽象,它们没有任何对应的 HTML 标记(如 Calendar 和 DataGrid)。因为它们不直接映射为 HTML 标记,所以 Web 控件还能够在适当的场合起到合并功能的作用(例如用一个 TextBox 控件来代替多个标记)。这种抽象为使用第三方提供的种类丰富的控件工具箱打开了方便之门。
对象模型
HTML 控件提供了以 HTML 为中心的对象模型。每种控件都包括一个属性集,可以使用该属性集来控制标记的属性。这个属性集使用了字符串名/值对,并且不是强类型的。
在使用 HTML 控件时,您的编程方式与使用传统的 ASP 进行编程十分类似。因而,HTML 控件提供了一条快捷的移植途径 - 可以通过添加一个 runat="server" 属性来将一个标记转变为一个服务器控件。
Web 控件提供了基于表单的、类似于 Visual Basic 的编程模式。它们也提供了属性集,但它们的主要目标在于提供一种格式丰富、类型安全且具有一致性的对象模型。每种 Web 控件都包含一组标准的属性,如 ForeColor、BackColor、Font 等。
这种对象模型还在像 Visual Studio .NET 这样的设计工具中提供了更丰富的设计时体验。
目标浏览器
HTML 控件不会自动检测请求页面的浏览器的能力,也不会修改它们提供的 HTML。在使用这组控件时,您要负责确保您的页面能同时在高级和低级浏览器上工作。
Web 控件能够自动对它们生成的结果进行调整,以确保输出结果在高级浏览器和低级浏览器上的工作同样出色。Web 控件还能够针对不同的浏览器提供不同的行为,从而充分发挥浏览器的潜力。例如,validation 控件还可以通过客户端的脚本来创建用于高级浏览器的具有高度交互性的页面。 对生成的 HTML 的控制
HTML 控件允许您完全控制所显示的内容以及发送到客户机浏览器的内容。
Web 控件提供了更为丰富的对象模型,以及适应多种浏览器的能力。因而,它们没有提供对输出结果的相同程度的控制能力。
在您开发 Web 应用程序时,您可以根据这两组控件的能力以及您的需求来从中进行选择。您还可以选择在同一页上混合使用这两组控件,使用一种类型的控件并不妨碍您同时使用另一种类型的控件。
2.6 修饰和打扮你的控件
<span style="font: 12pt verdana; color:orange;font-weight:700" runat="server"> This is some literal text inside a styled span control </span>
注意画线部分,漂亮的字
<button style="font: 8pt verdana;background-color:lightgreen;border-color:black;width:100" runat="server">Click me!</button>
漂亮的按钮,有圆角,很Cool,不用自己用Photoshop做了
<input type="text" value="One, Two, Three" style="font: 14pt verdana;background-color:yellow;border-style:dashed;border-color:red;width:300;" runat="server"/>
虚线框哦,也不用Photoshop就可以做了,style很强大。
asp:Calender 控件中
<form runat="server"> <ASP:Calendar runat="server" BackColor="Beige" ForeColor="Brown" BorderWidth="3" BorderStyle="Solid" BorderColor="Black" Height="450" Width="450" Font-Size="12pt" Font-Name="Tahoma,Arial" Font-Underline="false" CellSpacing=2 CellPadding=2 ShowGridLines=true /> </form>
注意有颜色部分,这部分就是对控件的修饰,它的作用,就是让你的Web窗体更漂亮。
再给一个例子
<ASP:Calendar CssClass="calstyle" runat="server"
BackColor="Beige" ForeColor="Brown" BorderWidth="3" BorderStyle="Solid" BorderColor="Black" Height="450" Width="450" Font-Size="12pt" Font-Name="Tahoma,Arial" Font-Underline="false" CellSpacing=2 CellPadding=2 ShowGridLines=true
TitleStyle-BorderColor="darkolivegreen" TitleStyle-BorderWidth="3" TitleStyle-BackColor="olivedrab" TitleStyle-Height="50px"
DayHeaderStyle-BorderColor="darkolivegreen" DayHeaderStyle-BorderWidth="3" DayHeaderStyle-BackColor="olivedrab" DayHeaderStyle-ForeColor="black" DayHeaderStyle-Height="20px"
DayStyle-Width="50px" DayStyle-Height="50px"
TodayDayStyle-BorderWidth="3"
WeekEndDayStyle-BackColor="palegoldenrod" WeekEndDayStyle-Width="50px" WeekEndDayStyle-Height="50px"
SelectedDayStyle-BorderColor="firebrick" SelectedDayStyle-BorderWidth="3"
OtherMonthDayStyle-Width="50px" OtherMonthDayStyle-Height="50px" />
是不是更漂亮,设置也很简单,一看就能明白。
2.7 最重要的两个注意事项
注意,.net支持的语言不是VBScript 而是VB,所以声明变量的时候,不是简单的Dim就行了。
注意 你写程序有99.9999999999999999%的可能不能正常显示中文,解决的方法就是:在D:\WINNT\Microsoft.NET\Framework\v1.0.2204(具体目录有可能不是这个,自己看着像就是了)有一个config.web的文件,在这个文件里面把 <globalization requestencoding="iso-8859-1" responseencoding="iso-8859-1" />改为<globalization requestencoding=" gb2312" responseencoding="gb2312"/> 好了,去体验一下中文的乐趣(同时大骂M$,应该把作为缺省语言啊!)
|
-
ASP.NET讲座(1)-ASP.NET简介
从今天开始起,基督山将和大家一起进入ASP.net 诸多程序的学习中,老实说,.net到底是法宝还是垃圾,我们拭目以待。有任何问题,联络基督山 seaman@163.com
什么是ASP.net,ASP.net的安装
1.1 什么是ASP.net
ASP.net 是一种建立在通用语言上的程序构架,能被用于一台Web服务器来建立强大的Web应用程序。ASP.net提供许多比现在的Web开发模式强大的的优势。
执行效率的大幅提高
ASP.net是把基于通用语言的程序在服务器上运行。不像以前的ASP即时解释程序,而是将程序在服务器端首次运行时进行编译,这样的执行效果,当然比一条一条的解释强很多。
世界级的工具支持
ASP.net构架是可以用Microsoft(R)公司最新的产品 Visual Studio.net开发环境进行开发,WYSIWYG(What You See Is What You Get所见即为所得)的编辑。这些仅是ASP.net强大化软件支持的一小部分。
强大性和适应性
因为ASP.net是基于通用语言的编译运行的程序,所以它的强大性和适应性,可以使它运行在Web应用软件开发者的几乎全部的平台上(笔者到现在为止只知道它只能用在Windows 2000 Server上)。通用语言的基本库,消息机制,数据接口的处理都能无缝的整合到ASP.net的Web应用中。ASP.net同时也是language-independent语言独立化的,所以,你可以选择一种最适合你的语言来编写你的程序,或者把你的程序用很多种语言来写,现在已经支持的有C#(C++和Java的结合体),VB,Jscript。将来,这样的多种程序语言协同工作的能力保护您现在的基于COM+开发的程序,能够完整的移植向ASP.net。
简单性和易学性
ASP.net是运行一些很平常的任务如表单的提交客户端的身份验证、分布系统和网站配置变得非常简单。例如ASP.net页面构架允许你建立你自己的用户分界面,使其不同于常见的VB-Like界面。另外,通用语言简化开发使把代码结合成软件简单的就像装配电脑。
高效可管理性
ASP.net使用一种字符基础的,分级的配置系统,使你服务器环境和应用程序的设置更加简单。因为配置信息都保存在简单文本中,新的设置有可能都不需要启动本地的管理员工具就可以实现。这种被称为"Zero Local Administration"的哲学观念使Asp.net的基于应用的开发更加具体,和快捷。一个ASP.net的应用程序在一台服务器系统的安装只需要简单的拷贝一些必须得文件,不需要系统的重新启动,一切就是这么简单。
多处理器环境的可靠性
ASP.net已经被刻意设计成为一种可以用于多处理器的开发工具,它在多处理器的环境下用特殊的无缝连接技术,将很大的提高运行速度。即使你现在的ASP.net应用软件是为一个处理器开发的,将来多处理器运行时不需要任何改变都能提高他们的效能,但现在的ASP确做不到这一点。
自定义性,和可扩展性
ASP.net设计时考虑了让网站开发人员可以在自己的代码中自己定义"plug-in"的模块。这与原来的包含关系不同,ASP.net可以加入自己定义的如何组件。网站程序的开发从来没有这么简单过。
安全性
基于Windows认证技术和每应用程序配置,你可以确性你的原程序时绝对安全的。(但是Asp的经验告诉我们,不能这么自信,M$老是会出Bug的)
1.2 本篇教程的主要内容
ASP.net 的语法
ASP.net 的语法有可能对老的ASP程序员来说很熟悉,但也有一些是全新的东西,QuickStart教程将在细节上全部谈到它们。
ASP.net 的结构和特征
介绍ASP.net的所有特性,是ASP开发者可以编写交互性的世界级的应用软件,用比以前少的多时间和精力。
最佳话的练习
引用了一些练习题和如何回避在程序开发中潜在地容易犯的错误的方法,是开发更加顺利。
为那些人编写的
如果你从来没有开发过网站程序,那么这不适合你,你应该至少掌握一些HTML语言和简单的Web开发术语。你不需要先前的ASP开发经验(当然有经验更好),但是你必须了解交互式Web程序开发的概念,包含窗体,脚本,和数据接口的概念。
1.3 安装 ASP.net
跟基督山一起检查你们的计算机哦
CPU Pentium II 450以上,推荐733
内存 256M 推荐 512M
硬盘空间 1G 或者更多
操作系统 Windows 2000 Pro Server AD Server 都可以,并安装 IIS 5 和 Windows 2000 SP1
但基督山的机器配置 C266 超 333 内存 128M 硬盘 2G 还是安装成功了。
检查一下大家是不是都用IE 5.5 了?
我们还需要 MDAC(ADO)2.6以上版本(可以在微软网站下面下载。)
最后,就是我们讲座的主角 Microsoft .Net Framework SDK 诶,在http://msdn.microsoft.com/net下可以下载,绝对地址在:http://download.microsoft.com/download/VisualStudioNET/Install/2204/NT5/EN-US/setup.exe 111M ,还好带宽不小ADSL的朋友可以达到全速(如果down不了的朋友,基督山可以帮着刻一张光盘,包括MDAC iIE5.5 SP1,.net SDK。)
注意:教育网络上的朋友么,呵呵,在北京科技大学的服务器上面,有完整的文件可以下载,速度还不错,地址是:ftp://bbs.ustb.edu.cn/incoming/newsoft
终于down完了,运行安装程序,.net安装到你的计算机里面去。
1.4 安装 .NET Framework 的快速入门示例
打开 SDK Overview 链接 (.NET Framework SDK Overview),该链接已在 SDK 安装过程中添加至您的桌面。
HTML 页面打开后,单击 .NET Framework Samples 链接。
按照安装步骤来安装示例。
安装完成后,您可以在 http://localhost/quickstart/default.htm 访问示例。
最后,在浏览默认文档时,您可以选择页面顶端的 ASP.NET 链接。此链接包含了 ASP.NET 示例的列表。这个教程是目前国际上面唯一的完全教程,也是Microsoft提供给我们学习ASP.net的唯一教程,可惜是全英文的,ASP.net的先行者,全靠它了。
1.5 学习ASP.net 的过程中如何求助--加入 ASPNG 讨论列表
Charles Carroll 作为不断壮大的 ASP.NET 社团的领导者之一,一直尽心尽力地主持着基于电子邮件的 ASP.NET 讨论列表。事实上,从七月初专业开发人员会议 (PDC) 的第一天开始,这个讨论列表就一直存。/在。
此讨论列表是学习和发布日益丰富的 ASP.NET 开发人员知识的最佳选择。Charles 会检查和筛选所有的消息,确保发布的文章都与此列表相关,从而使讨论不脱离主题。
除了社区方面的列表以外,Microsoft .NET Framework 小组还定期参加讨论并发布示例代码。最近一次是 Scott Guthrie 发布了一个动态生成图像的 ASP.NET 示例。
要加入讨论列表,只需访问 http://www.asplists.com/asplists/aspng.asp (英文)。在此页面上,您可以找到与 ASP.NET 相关的不同主题的电子邮件讨论列表的完整列表。最活跃的列表是 ASPNGBeta,我们推荐您加入这个列表。请从列表中选择 ASPNGBeta。您也可以直接访问 http://www.asplists.com/asplists/aspngbeta.asp (英文),选择所需的接收电子邮件分发的选项。
1.6 完整的.NET 解决方案演示
IBuySpy Microsoft ASP.NET 示例应用程序
IBuySpy(英文)是功能全面的电子商务应用程序,它详细介绍了如何使用 ASP.NET 创建高性能、可伸缩的 Web 应用程序。您可以联机浏览示例应用程序(包括完整的源代码和文档),也可以下载完整的 C# 或 Visual Basic.NET 版本的应用程序。
http://www.ibuyspy.com/
1.7 免费的.net空间
Brinkster Inc.(英文)是最大的免费 ASP Web 主机服务提供商,它提供免费 ASP.NET 主机服务。加入的每个成员可获得 5 MB 空间用于测试和学习 ASP.NET。用于测试和学习的成员身份,给开发人员提供了了解这项新技术的机会。Brinkster 提供免费 ASP 主机服务已经有一年多的时间,在 ASP/ASP.NET 主机服务市场处于领先地位。
http://www.brinkster.com/ (速度不是很理想)
1.8 国外相关的技术支持网站
http://www.aspfree.com (英文)是比较全面的 ASP.NET 社区站点之一,由 Steve Schofield 管理。您可以在这里找到十多篇关于 ASP.NET 的文章,以及联机的 ASP.NET 快速入门示例。如果您不能安装 NET.SDK,这是您学习 ASP.NET 的不错的选择。作为奖励,您还可以得到 Wrox Press 出版的 A Preview of ASP.NET 第 1 章的联机版本。
http://www.aspng.com (英文)是另外一个比较全面的 ASP.NET 相关站点。ASPNG 包括至以下内容的链接:Charles Carroll 上载的 ASP.NET 类和 Stephen Walther 上载的 ASP.NET Workshop。最后,ASPNG 还包括一个比较活跃的电子邮件讨论列表。相关信息请参见 http://www.asplists.com (英文)。
http://www.ASP101.com (英文)几篇 ASP.NET 相关文章,以及按线索组织的、基于 Web 讨论的 ASP.NET 论坛。
http://www.asptoday.com (英文)Wrox Press 的联机杂志已经有 10 篇关于 ASP.NET 的文章,范围从 ADO+ 到生成服务器控件。
http://www.4guysfromrolla.com (英文)4GuysFromRolla 包括一些文章和其他相关资源。文章内容涉及 ADO+ 和 ASP.NET 本身的概述。
http://www.devx.com (英文)最后,devx.com 包含比较全面的 ASP.NET 列表和可用的 .NET 相关资源。从书籍、Web 站点到活动,您都可以在这里找到感兴趣的东西。
-
ASP.NET讲座(4)-数据绑定DataBind
这一讲是ASP.net系列讲座中最重要的一讲,包括服务器控件,数据库操作等所有涉及操作数据的控件都会用到 DataBind,也就是说DataBind这一讲,已经开始讲ASP.net核心的问题了。其实DataBind的概念已经提出很长时间了,在ASP中也有应用,只是大家不是很注意而已。但在ASP.net中,已经把它提升到了一个核心的高度。
4.1 简单介绍 DataBind
DataBind包括三大方法,Repeater,DataList和DataGrid,这些控件都位于 System.Web.UI.WebControls 命名空间中,从 WebControl 基类中直接或间接派生出来的。这些方法都是通过HTML来显示数据的内容。
4.2 建立DataBind
所有的DataBind都应该用DataBind() 函数来建立(注意如果你用的是C#,请注意大小写)数据绑定,是整个页面PAGE和所有控件的一个方法,也就是说,他可以被所有的控件使用,你建立数据绑定的时候,DataBind可以作为控件的一个子项,比如DataList1.DataBind(),再比如 Page.DataBind(),会绑定整个页面。DataBind 常在页面载入时就被绑定。下面这个例子就是这个情况。
Protected Sub Page_Load(Src As Object, E As EventArgs)
DataBind()
End Sub
4.3开始使用简单的数据绑定
看这个例子:
<script language="VB" runat="server">
Sub SubmitBtn_Click(sender As Object, e As EventArgs)
Page.DataBind
End Sub
</script>
<B>帮韦小宝选择一个老婆</B>
<form runat=server>
<asp:DropDownList id="StateList" runat="server">
<asp:ListItem>阿珂</asp:ListItem>
<asp:ListItem>曾柔</asp:ListItem>
<asp:ListItem>建宁</asp:ListItem>
<asp:ListItem>沐公主</asp:ListItem>
<asp:ListItem>双儿</asp:ListItem>
<asp:ListItem>教主夫人</asp:ListItem>
</asp:DropDownList>
<asp:button Text="Submit" OnClick="SubmitBtn_Click" runat=server/>
<p>
您帮韦小宝选择的老婆是 :
<asp:label text='<%# StateList.SelectedItem.Text %>' runat=server/>
</form>
我们看到,那个选择老婆的地方没有使用什么控件,但是他却能正确的显示我们的选择结果,这个是就捆绑的结果,注意<%# StateList.SelectedItem.Text %>这句话,正是它让我们取得了捆绑的数据。更多的地方,我们会经常看到这样的例子,好像程序里面什么都没有,但数据已经绑定在上面了。
4.4 绑定一个数组,然后把它们用列表的方法排列出来。
<%@ Import namespace="System.Data" %>
<script language="VB" runat="server">
Sub Page_Load(sender As Object, e As EventArgs)
If Not IsPostBack Then
Dim values as ArrayList= new ArrayList()
values.Add ("阿珂")
values.Add ("曾柔")
values.Add ("建宁")
values.Add ("沐公主")
values.Add ("双儿")
values.Add ("教主夫人")
Dim dt As DataTable
Dim dr As DataRow
Dim i As Integer
'create a DataTable
dt = New DataTable
dt.Columns.Add(New DataColumn("编号", GetType(Integer)))
dt.Columns.Add(New DataColumn("类型", GetType(String)))
dt.Columns.Add(New DataColumn("是否", GetType(String)))
'Make some rows and put some sample data in
For i = 1 To 5
dr = dt.NewRow()
dr(0) = i
dr(1) = values(i-1).ToString()
If (i > 3) Then
dr(2) = "是"
Else
dr(2) = "否"
End If
'add the row to the datatable
dt.Rows.Add(dr)
Next
DataGrid1.DataSource = new DataView(dt)
DataGrid1.DataBind
End If
End Sub
</script>
<form runat=server>
<B>下面是韦小宝的老婆吗?</B>
<asp:DataGrid id="dataGrid1" runat="server"
BorderColor="black"
BorderWidth="1"
GridLines="Both"
CellPadding="3"
CellSpacing="0"
HeaderStyle-BackColor="#aaaadd"
/>
</form>
在这个例子里面,我们先建立了数据表 Dim dt As DataTable然后我们建立了行的概念Dim dr As DataRow,接着我们向行里面添加了数据,最后我们把行加到数据表里面,绑定DataView DataGrid1.DataSource = new DataView(dt) DataGrid1.DataBind这就是我们所做的工作,然后用DataGrid方法,我们生成了表。
注意:接收DataBind的控件,一般有DropDownList,DataList,DataGrid,ListBox这些集合性质的控件,而被捆绑的主要是ArrayList(数组),Hashtable(哈稀表),DataView(数据视图),DataReader这四个。
注意2:我们从数据绑定中取出数据来时,程序一般都是把他们转化为String,这样在写留言簿或者聊天室这样的程序的时候,就可以不进行数据处理了,但是有的时候,还是要进行数据转化,比如,我就是要Boolean,怎么办?有下列两种方法,一种是系统提供的一个函数:
<%# String.Format("{0:c}", (Container.DataItem.(" 转换类型") %> 可以达到转换的作用
另外绑定中也自带了一个方法 <%# DataBinder.Eval(Container.DataItem, "转换类型", "{0:c}") %>
4.5 DataBind的高级应用定义栏目
DataBind提供下列可以自己定义的栏目
Bound 用来控制数据命令和读出
HyperLink 让数据以超链的形式显示
Button 建立动态的数据按钮
Template 样本模板方式输出数据
下面我们各举例子:
Bound 控制显示表格的表头 (基本命令) 命令全部都加在<ASP:DataGrid> </ASP:DataGrid>之间(还是使用上面韦小宝的例子)
<property name="Columns">
<asp:BoundColumn HeaderText="老婆的编号" DataField="编号" />
<asp:BoundColumn HeaderText="老婆的名字" DataField="名字"/>
<asp:BoundColumn HeaderText="是否" DataField="是否"/>
</property>

你是否看到你的表单重复显示了两次? 这是因为你在<ASP:DataGrid>标签中没有AutoGenerateColumns="false"命令,默认的AutoGenerateColumns是为True的,也就是说它会自己产生表头,有的时候,这个是我们不需要的。
HyperLink 我们输出数据的时候,想对每个女子的名字下面加上超链,连接到介绍这个女子的页面,我们可以用HyperLink来做。
<property name="Columns"> <asp:BoundColumn HeaderText="编号" DataField="编号" /> <asp:HyperLinkColumn HeaderText="名字" DataNavigateUrlField="名字" DataNavigateUrlFormatString="detailspage.aspx?id={0}" DataTextField="名字" Target="_new" /> <asp:BoundColumn HeaderText="是否" DataField="是否"/> </property> |
Button 这个是一个很有趣的例子
用<asp:ButtonColumn HeaderText="加入我中意的女子列表" Text="Add" CommandName="AddToCart" />
代替<asp:BoundColumn HeaderText="老婆的编号" DataField="编号" />
我们可以触发 AddToCart事件,来控制其他事件的运行。
Template 建立一个样板
<property name="Columns"> <asp:TemplateColumn HeaderText="详细资料"> <template name="ItemTemplate"> <asp:hyperlink id=HyperLink1 NavigateUrl = "detailspage.aspx?id={0}" runat="server"> 点这里查看详细资料 </asp:hyperlink> </template> </asp:TemplateColumn> <asp:BoundColumn HeaderText="老婆的名字" DataField="名字"/> <asp:BoundColumn HeaderText="是否" DataField="是否"/> </property> |
4.6 如何在DataBind生成的表中排序
在ASP:DataGrid标签中加入下面两条AllowSorting="true"
然后插入如下的子程序
Sub MyDataGrid_Sort(sender As Object, e As DataGridSortCommandEventArgs) SortField = e.SortField DataGrid1.DataBind End Sub |
OK <asp:DataGrid>下面不需要<property>就可以出现排序的选项。
-
ASP.NET讲座(3)-输入验证控件
3.1 ASP.net解决了ASP的难题:验证表单填写的正确性
如今的商业网站,或者个人网站,多少都有客户调查啊,用户注册之类的东西,必然会用到表单,这些表单的填写正确与否,明显是由手写代码的方式来控制的。我承认编写代码,是一项有趣的工作,不过每次验证表单都来手写代码,我们希望提高我们的工作效率,并不是把我们很有限的时间花在表单的验证工作上。
基于另外的一些原因,Web应用程序很不好验证用户的输入,HTML 3.2 规范可以让你控制用户的反馈,但恶意的或者技术高超的用户可以绕过,因此即使有了浏览器端的手写代码,服务器端同样也需要验证,才能保证安全。
下面是微软的工作人员,给出的商业网站用手写代码控制表单验证的弊病。
1. 尽管错误信息或图标经常与输入元素相邻,但是它们几乎总是位于表的不同单元格中。
2. 页面中经常会有一个区域来汇总所有错误。
3. 许多站点包含客户端脚本,以便提供更快捷的反馈,同时防止白白地在与服务器之间往返。
4. 许多包含客户端脚本的站点在出现错误时会显示信息框。
5. 不仅会验证文本输入,还会验证下拉列表和单选按钮。
6. 如果某个字段为空,站点通常会显示与该条目无效时不同的信息或图标。
7. 许多有效性检查可以很好地代替常用的表达式。
8. 验证通常是基于两个输入之间的比较结果。
9. 90% 或 90% 以上的验证任务是一些常见的操作,例如检查姓名或邮政编码。大多数站点似乎仍在重复进行这些工作。
10. 因为站点之间的差别通常太大,无法获得一种完美的解决方案来处理每个站点的所有验证任务。
如果你想向你的同事证实你有一种很"酷"的方法,可以禁止在姓名字段里面输入空值,记得选择ASP.net,并且看下面的教程。
3.2 ASP.net进行表单验证的过程
1. aspx文件被编译,运行
2. 用户输入数据
3. 触发Page_Load事件
4. 更改Web控件属性,提示哪里没有输入
5. 将页面用Html重新输出给用户
6. 再次提醒用户输入
3.3 Page_Load 过程
Page 对象包含一些与服务器端验证有关的重要属性和方法。下表列出了Page_Load属性的所有Collect和methed。
| Page_Load方法名 |
说明 |
| IsValid(最经常使用) |
这是最有用的属性。该属性可以检查整个表单是否有效。通常在更新数据库之前进行该检查。只有 Validators 集中的所有对象全部有效,该属性才为真,并且不将该值存入缓存 。 |
| Validators |
该页所有验证对象的集合。这是实现 IValidator 界面的对象的集合。 |
| Validate |
在验证时调用的一种方法。在 Page 对象上默认的执行方式是转至每个验证器,并要求各验证器自行评估。 |
3.4 用来验证表单的验证器(Web控件)
| RequiredFieldValidator |
检查用户是否输入或选择了任何内容 |
| RegularExpressionValidator |
根据规则表达式检查用户输入。该过程允许进行许多种类的检查,可以用于邮政编码和电话号码等的检查。 |
| CompareValidator |
将输入控件与一个固定值或另一个输入控件进行比较。例如,它可以用在口令验证字段中。也可以用来比较输入的日期和数字。 |
| RangeValidator |
与 CompareValidator 非常相似, 只是它用来检查输入是否在两个值或其它输入控件的值之间。 |
| CustomValidator |
允许用户编写自己的代码以加入到验证框架中。 |
3.5 实例说明上面所描述的控件的运作
我们建立一个最小化的.aspx页面,我们不需要华丽的修饰效果。
<p>请输入新的用户 ID 和口令</p> <form runat=server> <table> <tr> <td>用户 ID </td> <td><input type=text runat=server id=txtName></td> </tr> <tr> <td>口令 </td> <td><input type=password runat=server id=txtPWord></td> </tr> <tr> <td>请重新输入口令 </td> <td><input type=password runat=server id=txtRePWord></td> </tr> <table><br> <input type=submit runat=server id=cmdSubmit value=Submit> </form>
|
程序是一个非常苛刻的东西,所以,要强调所有的项目都填写了,我们可以这样来做。在每一个字段前添加 RequiredFieldValidator。若输入字段为空,我们要在字段前显示一个星号(*),并在旁边报告错误。
例如:
<tr> <td> <asp:RequiredFieldValidator runat=server ControlToValidate=txtName ErrorMessage="需要用户用户名。"> * </asp:RequiredFieldValidator> </td> <td>User ID:</td> <td><input type=text runat=server id=txtName></td> </tr>
|
若没有输入任何内容,则在标签旁边显示 "*"。出现出错消息。"ControlToValidate"属性指定了需要验证的控件ID。最后一步是向页面顶部显示所有的出错现象。
代码:
| <asp:ValidationSummary runat=server headerText=此页有错误:/> |
然后,我们需要用户ID必须是6-10个字符,口令必须是4-12个字母,而且必须有@#$%^&*/的字符。
代码: 这里我们增加了对ID长度的限制。
<td> <input type=text runat=server id=txtName> <asp:RegularExpressionValidator runat=server ControlToValidate="txtName" ErrorMesage="口令必须由 6-10 个字母组成。" ValidationExpression="[a-zA-Z]{6,10}" /> </td> |
接着,我们要验证两次输入的口令是否一样。
<asp:RegularExpressionValidator runat=server display=dynamic ControlToValidate="txtPWord" ErrorMessage="口令必须包含 @#$%^&*/ 中的一个。" ValidationExpression=".*[@#$%^&*/].*" /> <asp:RegularExpressionValidator runat=server display=dynamic ControlToValidate="txtPWord" ErrorMessage="口令必须是 4-12 个非空白字母。" ValidationExpression="[\S{4,12}" /> <asp:CompareValidator runat=server ControlToValidate=txtRePWord ControlToCompare=txtPWord ErrorMessage="口令不匹配。" /> |
默认情况下,CompareValidator 只做简单的字符串匹配比较。如果需要,它可进行涉及日期和数字的更复杂的比较。
3.6 几个需要注意的问题
关于脚本库
因为验证 Web 控件脚本在脚本库中,所以不必将所有客户端验证的代码直接发送到页面中,尽管表面上似乎是这样做的。主要的脚本文件引用类似如下所示:
<script language="javascript" src="/_aspx/1.0.9999/script/WebUIValidation.js"> </script> |
默认情况下,脚本文件将安装在 "_aspx" 目录中默认的根目录下,并使用相对于根的脚本 include 指令调用,该指令以正斜线开头。该引用表明每个单独的对象不必包含脚本库,同一台计算机上的所有页面可以引用同一个文件。您会注意到,该路径中还有一个公用的语言运行时版本号,以便不同的运行时版本可以在同一台计算机上运行。
如果查看一下您默认的虚拟根目录,您会找到该文件并查看其中的内容。这些文件的位置在 config.web 文件中指定。config.web 文件是一个用于大多数 ASP+ 设置的 XML 文件。以下是该文件中位置的定义:
<webcontrols clientscriptslocation="/_aspx/{0}/script/" /> |
鼓励您阅读该脚本,以便深入了解发生的事件。不过,建议您不要修改这些脚本,因为它们的功能与特定的运行时版本紧密相连。在运行时版本更新时,这些脚本可能也需要相应的更新,您将或者放弃更改,或者面临脚本不工作的问题。如果特定项目必须更改这些脚本,先备份这些脚本,然后将您的项目指向备份文件,方法是使用私有的 config.web 文件替代这些文件的位置。如果字符串中包含格式指令 "{0}",运行时版本号将替换该指令。最好将该位置更改为一个相对引用或绝对引用。
3.7 一个完整的案例
我们现在要做一个杂志订阅系统,要用户输入Email,输入两次密码,密码要一样,密码要求安全,所以必须包括(!@#$%^&*+;:),输入用户的电话,最长20位,必须选择信用卡,输入卡号,卡号为15位,程序如下,好简单的,大家看看。
<%
public sub OnSubmit(source as Object, e as EventArgs)
if Page.IsValid then
'数据入库等操作
end if
end sub
%>
<h3><font face="Verdana">订阅时尚生活杂志</font></h3>
<form runat=server>
<hr width=600 size=1 noshade>
<center>
<asp:ValidationSummary ID="valSum" runat="server"
HeaderText="您必须填写完整所有的选项"
DisplayMode="SingleParagraph"
Font-Name="verdana"
Font-Size="12"
/>
<p>
<!-- sign-in -->
<table border=0 width=600>
<tr><td colspan=3>
<table border=0 cellpadding=0 cellspacing=0 width="100%">
<tr><td>
<font face=geneva,arial size=-1><b>Sign-In Information</b>
</font>
</td></tr>
</table>
</td></tr>
<tr>
<td align=right>
<font face=Arial size=2>输入您的Email</font>
</td>
<td>
<asp:TextBox id=email width=200px maxlength=60 runat=server />
</td>
<td>
<asp:RequiredFieldValidator id="emailReqVal"
ControlToValidate="email"
ErrorMessage="您的Email. "
Display="Dynamic"
Font-Name="Verdana" Font-Size="12"
runat=server>
*
</asp:RequiredFieldValidator>
<asp:RegularExpressionValidator id="emailRegexVal"
ControlToValidate="email"
Display="Static"
ValidationExpression=
"^[\w-]+@[\w-]+\.(com|net|org|edu|mil)$"
Font-Name="Arial" Font-Size="11"
runat=server>
不是一个正确的Email 请输入一个正确的Email
</asp:RegularExpressionValidator>
</td>
</tr>
<tr>
<td align=right>
<font face=Arial size=2>密码:</font>
</td>
<td>
<asp:TextBox id=passwd TextMode="password" maxlength=20
runat=server/>
</td>
<td>
<asp:RequiredFieldValidator id="passwdReqVal"
ControlToValidate="passwd"
ErrorMessage="密码. "
Display="Dynamic"
Font-Name="Verdana" Font-Size="12"
runat=server>
*
</asp:RequiredFieldValidator>
<asp:RegularExpressionValidator id="passwdRegexBal"
ControlToValidate="passwd"
ValidationExpression=".*[!@#$%^&*+;:].*"
Display="Static"
Font-Name="Arial" Font-Size="11"
Width="100%" runat=server>
密码必须包括下面中的一个 (!@#$%^&*+;:)
</asp:RegularExpressionValidator>
</td>
</tr>
<tr>
<td align=right>
<font face=Arial size=2>请再输入一次密码:</font>
</td>
<td>
<asp:TextBox id=passwd2 TextMode="password" maxlength=20
runat=server/>
</td>
<td>
<asp:RequiredFieldValidator id="passwd2ReqVal"
ControlToValidate="passwd2"
ErrorMessage="再输入一次密码. "
Display="Dynamic"
Font-Name="Verdana" Font-Size="12"
runat=server>
*
</asp:RequiredFieldValidator>
<asp:CompareValidator id="CompareValidator1"
ControlToValidate="passwd2" ControlToCompare="passwd"
Display="Static"
Font-Name="Arial" Font-Size="11"
runat=server>
两次输入的密码怎么不一样:)
</asp:CompareValidator>
</td>
</tr>
<tr><td colspan=3> </td></tr>
<!-- personalization information -->
<tr><td colspan=3>
<table border=0 cellpadding=0 cellspacing=0 width="100%">
<tr><td><font face=geneva,arial size=-1>
<b>Personal Information</b></font>
</td></tr>
</table>
</td></tr>
<tr>
<td align=right>
<font face=Arial size=2>电话:</font>
</td>
<td>
<asp:TextBox id="phone" maxlength=20 runat="server" />
</td>
<td>
<asp:RequiredFieldValidator id="phoneReqVal"
ControlToValidate="phone"
ErrorMessage="Phone. "
Display="Dynamic"
Font-Name="Verdana" Font-Size="12"
runat=server>
*
</asp:RequiredFieldValidator>
</td>
</tr>
<tr><td colspan=3> </td></tr>
<!-- Credit Card Info -->
<tr>
<td colspan=3>
<font face=Arial size=2><b>Credit Card Information</b></font>
</td>
</tr>
<tr>
<td align=right>
<font face=Arial size=2>Card Type:</font>
</td>
<td>
<ASP:RadioButtonList id=ccType
Font-Name="Arial" RepeatLayout="Flow" runat=server>
<asp:ListItem>招商银行一卡通</asp:ListItem>
<asp:ListItem>建设银行龙卡</asp:ListItem>
</ASP:RadioButtonList>
</td>
<td>
<asp:RequiredFieldValidator id="ccTypeReqVal"
ControlToValidate="ccType"
ErrorMessage="信用卡种类. "
Display="Static"
InitialValue=""
Font-Name="Verdana" Font-Size="12"
runat=server>
*
</asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td align=right>
<font face=Arial size=2>Card Number:</font>
</td>
<td>
<ASP:TextBox id=ccNum runat=server />
</td>
<td>
<asp:RequiredFieldValidator id="ccNumReqVal"
ControlToValidate="ccNum"
ErrorMessage="信用卡号. "
Display="Dynamic"
Font-Name="Verdana" Font-Size="12"
runat=server>
*
</asp:RequiredFieldValidator>
<asp:RegularExpressionValidator id="ccNumCustVal"
ControlToValidate="ccNum"
Display="Static"
ValidationExpression="^\d{15}$"
Font-Name="Arial" Font-Size="11"
runat=server>
信用卡号错误
</asp:RegularExpressionValidator>
</td>
</tr>
</table>
<p>
<input runat="server" type=submit value="注册">
<p>
</form>
</center>
好了,表单的验证,我们就讲到这里,下一讲,我们将介绍ASP.net处理数据的核心部分,数据绑定
-
ASP.NET讲座(6)-ASP.NET的几种主要文件
使用ASP的同仁们一定经常使用这些东西,因为不管什么产品的开发都离不开与用户的互动,而在ASP中,他们三个,正是互动的桥梁。
ASP.net中,他们也受到了足够的重视,但改变不是很大。
6.1 Application
Application的生命周期
Application的生命周期,并不是是从IIS5开始启动的那一刻开始,而是从客户对服务器发出第一个Request的那个时候开始的。从那时开始一个名叫HTTPApplication的Pool开始建立,这也是Application生命周期(lifetime)的开始。此时Application_OnStart的事件也发生了。直到Application_OnEnd的事件发生,才是Application生命周期的结束。
Application写的网站计数器
<%
Application.Lock()
Application("counter") = CType(Application("counter") + 1, Int32)
Application.UnLock()
%>
与ASP中还是一样的。
Application 与ASP中的不同的地方
Application与ASP不同的地方在于 新多了两个事件 Application_OnRequestStart()和Application_OnRequestEnd() 这两个事件,在用户开始浏览一个aspx文件,和aspx文件运行结束时触发,也就是说,这两个事件,不是针对整个服务器来说的,而是对于单个程序来说。
6.2 Session
在ASP中,我们都知道,如果用户把浏览器上面的Cookies关掉,那么Session就不可能被传递了,ASP.net针对这个问题,提出Session的传递应该脱离Cookies。我们修改一下config.web,还记得这个文件吗?ASP.net的无安装化程序移植的精髓,都在这样的一个文件中。
修改如下地方:<sessionstate cookieless="false" /> 改为True就可以了
其他地方 Session和ASP没有什么区别。
6.3 Cookies
这里和ASP就有一些区别大家注意了。
建立一个Cookies
Dim cookie As New HttpCookie("user")
Cookie.Value = "yesky.com"
Response.AppendCookie(cookie)
读出一个Cookies
Dim cookie As New HttpCookie("user")
StrCookie = Cookie.Value
6.4 State
这个是一个全新的东西,它可以保存中间过程量在浏览器上面。比如,要注册一个新用户,我们往往在第一页上填写用户名,然后第二页填写联系方法,第三页填写相关的个人资料,这样三页就需要传递数据,以前通常的方法是在 <input>里面 hidden一个数据,现在通过State就好办多了。
关于State,我们不做很多的介绍,如果您感兴趣,可以参看http://www.fmexpense.com/quickstart/doc/stateoverview.aspx#sessionstate 这是它的官方说明,也比较模糊。
6.5 Global.aspx
ASP.net中,为了突出和ASP的区别,特别将Global.asp改成Global.aspx 但功能没有很大的变化。
例子:
Sub Application_Start()
Response.Write("Application is Starting...<br>")
End Sub
Sub Session_Start()
Response.Write("Session is Starting...<br>")
Session.Timeout = 1
End Sub
这个非常简单了。
-
ASP.NET讲座(5)-数据库的操作ADO.NET
自若干年前推出开放式数据库连接 (ODBC) 应用程序编程接口 (API) 以来,出现了各种各样的数据库访问技术,而 ADO.NET 是其中最新的一种。在这过程中,发生了许多有趣的事。例如,COM 闯入数据库领域,开始培植 OLE DB 的殖民进程。然后,大致相当于 OLE DB 自动化版本的 ActiveX? Data Objects (ADO) 被选来统治 Windows? 数据库开发者的 Visual Basic? 和 ASP 社区。
通过 .NET,Microsoft 正在提供通用框架(即 Framework Class Library),其中将包括所有现有的 Windows API 甚至更多的内容。特别值得一提的是,它包括大量常用的库,而这些库现在需要通过各个 COM 对象分别获得。在这些库中,您会发现 XML 和 ADO 对象模型,它们被集成到了叫做 ADO.NET 的类子树中。
ADO.NET 事实上成为构建数据感知 .NET 应用程序的基础。和 ADO 不同的是,ADO.NET 遵循更通用的原则,不那么专门面向数据库。ADO.NET 集合了所有允许数据处理的类。这些类表示具有典型数据库功能(如索引、排序和视图)的数据容器对象。尽管 ADO.NET 是 .NET 数据库应用程序的权威解决方案,但从总体设计上来看,它不象 ADO 模型那样以数据库为中心,这是 ADO.NET 的一大特点。
ADO.NET 与 ADO 有很大差异。ADO.NET 是新的数据访问编程模型,需要开发人员的全面理解、投入和新思维。然而,一旦开始掌握 ADO.NET,您将意识到:原有的 ADO 技巧非常有助于您以不同、却更巧妙和可靠的方式来创建有效的应用程序和解决各种老问题。
(以上译自 Microsoft .NET部一位官员的讲话)
5.1 目前的ADO.net
目前 ADO.NET 提供了两种托管提供程序:一种用于 SQL Server 7.0 或更高版本,另一种用于其他所有您可能已经安装的 OLE DB 提供程序。在这两种情况下您分别使用不同的类,但遵循相似的命名规则。除前缀外,名称都是相同的。前一种情况前缀为 SQL,后一种情况则是 ADO。
<% @ Import Namespace="System.Data.ADO" %>
<% @ Import Namespace="System.Data.SQL" %>
您应该使用 SQL 类访问 SQL Server 表,因为它们直接进入数据库服务器的内部 API,跳过了由 OLE DB 提供程序表示的中间层。ADO 类是 OLE DB 提供程序上的 .NET 接口,它们使用 COM Interop 桥进行工作。
5.2 连接一个数据库
Dim myConnection As New
SQLConnection("server=localhost;uid=sa;pwd=;database=pubs")
Dim myCommand As New
SQLDataSetCommand("select * from Authors", myConnection)
或者
SQLConnection myConnection = new SQLConnection();
myConnection.DataSource = "localhost";
myConnection.UserID = "sa";
myConnection.Password = "";
myConnection.ConnectionTimeout = 30;
myConnection.Open();
myConnection.Database = "pub";
myConnection.IsolationLevel = IsolationLevel.ReadCommitted
这里我们需要讲述一下Connection的方法和属性了。
ConnectionTimeout超时
DataBase 缺省数据库
DataSource DNS
UserID 原来叫UID
Password
State 取得目前连接的状态
Open() 打开
Close() 关闭
5.3 操作数据库
通过一个Command对象,我们才可以对数据库进行操作
Dim myConnection As SQLConnection = New SQLConnection("server=localhost;uid=sa;
pwd=;database=pubs")
Dim myCommand As SQLCommand = New SQLCommand("select * from Authors", myConnection)
myConnection.Open()
Dim dr As New SQLDataReader
myCommand.Execute(dr)
...
myConnection.Close()
或者 这样做
Dim myConnection As New SQLConnection("server=localhost;uid=sa;pwd=;database=pubs")
Dim mycommand As New SQLCommand( _
"UPDATE Authors SET phone='(800) 555-5555' WHERE au_id = '123-45-6789'", _
myConnection)
myCommand.ActiveConnection.Open()
myCommand.ExecuteNonQuery()
myCommand.ActiveConnection.Close()
这些都是SQLCommand的标准用法,下面列出了Command的所有属性和相关方法。
ActiveConnection 取得或设置联结Connections
CommandText 执行的SQL语句或储存过程(StoredProcedure)名
CommandTimeout 超时
CommandType Command操作的类型(StoredProcedure,Text,TableDirect)三种,默认Text
Parameters 操作储存过程时使用
Execute() 执行SQL语句或储存过程
ExecuteNonQuery() 同上,但无返回,或者说,只返回记录的数量
注意: 和ASP一样,在运行完以后一定要注意关闭Connection,否则会很耗服务器资源的。
5.4 数据的显示
在这节的讲解前,我们先建立一个数据库,名字叫 aspnet 然后里面有一张表user 结构如下:
| uid |
username |
Email |
| 1 |
User1 |
Mail1 |
| 2 |
User2 |
Mail2 |
| 3 |
User3 |
Mail3 |
SQL 语句 Select * From User
数据库语句 server=localhost;uid=sa;pwd=;database=aspnet
5.4.1 用 DataReader 方法显示数据
有两种方法可以显示数据 DataReader方法,和DataSet方法,而DataReader只能储存查询数据,我们先讲用DataReader方法显示
<script language="VB" runat="server">
Sub Page_Load(Src As Object, E As EventArgs)
Dim MyConnection As SQLConnection =
New SQLConnection("server=localhost;uid=sa;
pwd=;database=aspnet")
Dim MyCommand As SQLCommand =
New SQLCommand("select * from User", MyConnection)
MyConnection.Open()
Dim DR As SQLDataReader
MyCommand.Execute(DR)
MyDataGrid.DataSource = DR
MyDataGrid.DataBind()
MyConnection.Close()
End Sub
</script>
<ASP:DataGrid id="MyDataGrid" runat="server"
Width="700"
BackColor="#ccccff"
BorderColor="black"
ShowFooter="false"
CellPadding=3
CellSpacing="0"
Font-Name="Verdana"
Font-Size="8pt"
HeaderStyle-BackColor="#aaaadd"
/>
对于显示的控制,大家可以复习一下前一讲,数据的绑定,其实多联系也是一种很好的方法。
在定制显示中,还有一种比较使用的方法,而不用绑定
Dim DR As SQLDataReader
DR["字段名"]的方法也可以取到数据
5.4.2 用 DataSet 方法显示数据
用DataSet记录的数据其实就是一个表,而对表的操作,只是对DataSet的操作,并没有改变数据库,而要到DataSet更新的时候,才完整的写入数据库,这个往往是新手容易忽视的地方。
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SQL" %>
<html>
<script language="VB" runat="server">
Sub Page_Load(Src As Object, E As EventArgs)
Dim DS As DataSet
Dim MyConnection As SQLConnection
Dim MyCommand As SQLDataSetCommand
MyConnection = New
SQLConnection("server=localhost;uid=sa;pwd=;database=aspnet")
MyCommand =
New SQLDataSetCommand("select * from User",MyConnection)
DS = new DataSet()
~~~初始化DataSet()
MyCommand.FillDataSet(ds, "User")
~~~FillDataSet顾名思义把整个查询内容储存进DataSet中
MyDataGrid.DataSource=ds.Tables("User").DefaultView
MyDataGrid.DataBind()
~~~绑定数据
End Sub
</script>
<body>
<h3><font face="Verdana">
Simple Select to a DataGrid Control
</font></h3>
<ASP:DataGrid id="MyDataGrid" runat="server"
Width="700"
BackColor="#ccccff"
BorderColor="black"
ShowFooter="false"
CellPadding=3
CellSpacing="0"
Font-Name="Verdana"
Font-Size="8pt"
HeaderStyle-BackColor="#aaaadd"
MaintainState="false"
/>
</body>
</html>
5.5 数据的添加,修改,和删除
其实他们是在就是简单的不要再简单的东西。
添加:
DataRow dr=SQLDataSet.Tables["User"].NewRow();
dr["id"] = "4";
dr["username"] = "user4";
dr["Email"] = "mail4";
SQLDataSet.Tables.Rows.Add(dr);
修改:
SQLDataSet.Tables["user"].Rows[3]["username"]= "user5"
删除:
SQLDataSet.Tables["user"].Rows[3].Delete()
修改完之后,必须更新数据库
SQLCommand.Update(SQLDataSet, "user")
5.6 关于显示中的分页问题
这个问题,一再在论坛中给众人提出过,曾经是ASP中,一个比较难解决的问题,不过在ASP.net中,只不过是DataGrid的一个属性而已。
AllowPaging="True" 是否支持分页
PageSize="10" 每页显示多少
PagerStyle-HorizontalAlign="Left" 分页显示的定位
完整的例子:
<asp:DataGrid id="dataGrid1" runat="server"
BorderColor="black"
BorderWidth="1"
GridLines="Both"
CellPadding="3"
CellSpacing="0"
HeaderStyle-BackColor="#aaaadd"
AllowPaging="True"
PageSize="10"
PagerStyle-HorizontalAlign="Left"/>
-
ASP.NET中数据库的操作初步----DataSet操作数据库
前面我们已经说了如何操作数据库,但几乎全部是通过OleDbCommand和OleDbDataReader来做的,这次我们说说如何通过OleDbDataAdapter来操作数据库!关于OleDbDataAdapter的用法实际上我们在以前已经讲过了,由于OleDbDataAdapter是DataSet和数据源之间建立联系的一个桥梁,而DataSet用于对单层数据、XML 数据和关系数据进行存储、远程处理和编程!。
我们曾经讲过利用Command来对数据库进行增加、删除和修改操作,但是我们利用DataSet和DataAdapter能够更加方便的对数据库进行操作,基本是我们可以认为DataSet是专门为WEB而设计的,这也是ADO.NET和ADO的一个重要的区别。
下面是DataSet和SQL数据的的关系图, 通过这个图我们可以看出DataSet和DataAdapter以及SQL数据库的关系。
下面我们来讲解一下如何利用DataSet和DataAdapter来操作上据库
MyConnection.Open(); //打开数据库,请参考前面文章的内容
MyCommand.Connection = MyConnection; //设置Command,请参考前面文章的内容
MyCommand. CommandText = “select * from admin”; //设置Command,参考前面文章的内容
OleDbDataAdapter MyDataAdapter = new OleDbDataAdapter(); //定义OleDbDataAdapte对象
MyDataAdapter.SelectCommand = MyCommand; //设置OleDbDataAdapte对象的SelectCommand属性
System.Data.DataSet MyDataSet = new System.Data.DataSet(); //定义DataSet
MyDataAdapter.Fill(MyDataSet,"admin"); //通过OleDbDataAdapte对象的SelectCommand属性填充MyDataSet
MyConnection.Close(); //关闭数据库
整个过程分以下几步:
1.建立数据库连接(打开数据库,请参考前面文章的内容)
2.建立OleDbDataAdapter对象!
3.实例化OleDbDataAdapter对象!
4.建立一个DataSet对象,执行SQL语句得到的表添加到其中
5.关闭数据库连接
通过上面的步骤我们就可以使用DataBind将DataSet中的数据绑定到特定的控件上了!(下一章我们将讲解如何邦定数据库)
我们说过但是我们可以利用DataSet和DataAdapter能够更加方便的对数据库进行操作,如何通过OleDbDataAdapter来执行数据库的操作的,我们只需要对DataSet中的数据进行增加、删除、修改等操作,然后在将DataSet提交给数据库即可
//利用利用DataSet和DataAdapter操作数据库
public Boolean DoDB()
{
MyConnection.Open(); //打开数据库,请参考前面文章的内容
MyCommand.Connection = MyConnection; //设置Command,请参考前面文章的内容
MyCommand. CommandText = “select * from admin”; //设置Command,参考前面文章的内容
OleDbDataAdapter MyDataAdapter = new OleDbDataAdapter(); //定义OleDbDataAdapte对象
MyDataAdapter.SelectCommand = MyCommand; //设置OleDbDataAdapte对象的SelectCommand属性
System.Data.DataSet MyDataSet = new System.Data.DataSet(); //定义DataSet
MyDataAdapter.Fill(MyDataSet,"admin"); //通过OleDbDataAdapte对象的SelectCommand属性填充MyDataSet
OleDbCommandBuilder MyCommandBuild = new OleDbCommandBuilder(MyDataAdapter);//关联DataSet和数据库的操作的,必不可少
foreach(DataRow dr in MyDataSet.Tables["Admin"].Rows)
{
if(dr["Admin_Code"].ToString().Trim().Equals("a"))
{
dr.Delete(); //删除DataSet 中的行
}
}
MyDataSet.Tables["Admin"].Rows[0][0] = "ss";//更新DataSet中第一行第一列的值
string [] dd = new String[3]{"a","b","v"};
MyDataSet.Tables["Admin"].Rows.Add(dd);//增加一行
MyDataAdapter.Update(MyDataSet,"Admin");//将DataSet中”Admin”表中的数据提交给数据库,完成数据库的更新
MyConnection.Close();//关闭数据库
}
这个程序和我们前面用到的利用Command的delete、insert、update例程是执行同样的功能的,我这里改成了用MyDataAdapter来达到同样的效果!
要通过MyDataAdapter执行对数据库的操作,我们要有下面的几步:
1. 建立数据库连接MyConnection
2. 实例化OleDbDataAdapter对象!
3. 建立一个DataSet对象,并把执行select语句得到的记录添加到其中
4. 建立OleDbCommandBuilder对象! 并让它与我们前面的OleDbDataAdapter对象关联!语句如下:OleDbCommandBuilder MyCommandBuild = new OleDbCommandBuilder(MyDataAdapter);
5. 对DataSet中包含表的特定记录进行增加、删除、修改
6. 执行OleDbDataAdapter对象的Update命令更新数据库,语句如下: MyDataAdapter.Update(ds,"notes");
7. 关闭数据库连接
总结:
DataSet是ADO.NET中非常重要的内容,也是ADO.NET和ADO的区别的一个重要表现,特别适合成批的数据操作,也是数据棒定的重要来源。OleDbDataAdapter是DataSet和数据源之间建立联系的一个桥梁,要熟练的使用DataSet我们需要熟练的掌握OleDbDataAdapter。下一章我们将讲述Data
-
ASP.NET中数据库的操作初步----增加、删除、修改
注意:本文暂时不讲解数据库的数据调出和显示,因为他涉及的东西比较多,所以我们将另外详细讲解。本文主要要讲的是数据库的增加、删除、修改。
一、定义OleDbCommand类型变量:MyCommand
要对数据库进行增加、删除、修改的操作我们还需要根据MyConnectio的类型定义一个OleDbCommand或者SqlCommand对象(请注意如果MyConnection是OleDbConnection类型,那么只能用OleDbCommand;如果MyConnection是SqlConnection类型,那么那么只能用SqlCommand。这里假设MyConnection是OleDbConnection类)。(方法一)你可以象拖放MyConnection一样拖放一个OleDbCommand,并命名为 MyCommand。(方法二)在(关联文件).CS文件中protected System.Data.OleDb.OleDbConnection MyConnection;下面手动添加:
protected System.Data.OleDb.OleDbCommand MyCommand;
在private void InitializeComponent()中this.MyConnection = new System.Data.OleDb.OleDbConnection();的下一行下面手动添加:
this.MyCommand = new System.Data.OleDb.OleDbCommand();
即可完成对MyCommand的定义
说明:MyCommand的作用是用来执行SQL命令
二、利用定义的MyConnectio和MyCommand对数据库进行增加、删除、修改
首先我们需要连接并打开一个数据库(关于数据库的连接和打开的操作请察看我们以前的文章)。打开数据库:MyConnectio.Open();
然后我们需要给MyCommand指定要执行的SQL命令 : MyCommand.CommandText = "delete from admin";
接着我们需要给MyCommand指定数据源(对那个数据库执行SQL命令):MyCommand.Connection = MyConnection;然后我们执行MyCommand命令即可: MyCommand. ExecuteNonQuery();如果我们在执行还有"delete from admin";后需要接着执行 “insert into admin (Admin_Code,Admin_Pwd) values(‘aa’,’bb’)”,则我们只要再次指定MyCommand指定要执行的SQL命令 : MyCommand.CommandText =“insert into admin (Admin_Code,Admin_Pwd) values(‘aa’,’bb’)”,然后执行MyCommand. ExecuteNonQuery();即可。(由于数据库未关闭,所以我们不需要也不可以再次MyConnectio.Open();,同理由于没有改变MyCommand的数据源所以我们也没有必要再次指定MyCommand.Connection = MyConnection;)
下面我们将详细讲解如何在Page_Load()中对数据库的增加、删除、修改,最后我们再来总结一下ExecuteNonQuery(),ExecuteScalar(),ExecuteReader的用法
--------------------------------------------------------------
1、 增加新的记录
private void Page_Load(object sender, System.EventArgs e)
{
MyConnection.Open();’打开数据库
MyCommand1.CommandText = "insert into admin values(‘aaddq‘,‘as‘,‘ss‘)";
MyCommand1.Connection = MyConnection;
MyCommand1.ExecuteNonQuery();’由于增加了一条记录,所以返回1
//或者MyCommand1.ExecuteReader();先增加一条记录,然后返回一个System.Data.OleDb.OleDbDataReader类型的对象,该对象为:EOF
//或者MyCommand1. ExecuteScalar();先增加一条记录,返回未实列化的对象
MyConnection.Close();
}
-------------------------------------------------------------------
2、 删除现有数据
private void Page_Load(object sender, System.EventArgs e)
{
MyConnection.Open();’打开数据库
MyCommand1.CommandText = "delete * from admin";
MyCommand1.Connection = MyConnection;
MyCommand1.ExecuteNonQuery();’由于删除了n条记录,所以返回n
//或者MyCommand1.ExecuteReader();先删除n条记录,然后返回一个System.Data.OleDb.OleDbDataReader类型的对象,该对象为:EOF
//或者MyCommand1. ExecuteScalar();先删除n条记录,返回未实列化的对象
MyConnection.Close();
}
------------------------------------------------------------
3、 修改现有数据
private void Page_Load(object sender, System.EventArgs e)
{
MyConnection.Open();’打开数据库
MyCommand1.CommandText = "update admin set admin_code=’212’,Admin_pwd=’43’ where admin_code=’23’";
MyCommand1.Connection = MyConnection;
MyCommand1.ExecuteNonQuery();’由于修改了1条记录,所以返回n
//或者MyCommand1.ExecuteReader();先修改了1条记录,然后返回一个System.Data.OleDb.OleDbDataReader类型的对象,该对象为:EOF
//或者MyCommand1. ExecuteScalar();先修改了1条记录,返回未实列化的对象
MyConnection.Close();
}
三、关于MyCommand的ExecuteNonQuery(),ExecuteScalar(),ExecuteReader方法的区别:
1、ExecuteNonQuery():执行SQL,返回一个整型变量,如果SQL是对数据库的记录进行操作,那么返回操作影响的记录条数,如果是SQL="CREATE TABLE LookupCodes (code_id smallint IDENTITY(1,1) PRIMARY KEY CLUSTERED, code_desc varchar(50) NOT NULL)"那么在表创建成功后该方法返回 –1。
例如:
private void Page_Load(object sender, System.EventArgs e)
{
MyConnection.Open();’打开数据库
MyCommand1.CommandText = "CREATE TABLE LookupCodes (code_id smallint IDENTITY(1,1) PRIMARY KEY CLUSTERED, code_desc varchar(50) NOT NULL)"; MyCommand1.Connection = MyConnection;
MyCommand1.ExecuteNonQuery();’首先建立一个LookupCodes表,然后返回-1
//或者MyCommand1.ExecuteReader();首先建立一个LookupCodes表,然后返回一个System.Data.OleDb.OleDbDataReader类型的对象,该对象为:EOF
//或者MyCommand1. ExecuteScalar();首先建立一个LookupCodes表,返回未实列化的对象
MyConnection.Close();
}
2、 ExecuteScalar():执行SQL,(如果SQL是查询Select)返回查询结果的第一行第一列,如果(如果SQL不是查询Select)那么返回未实列化的对象,因为对象未实列化,所以返回结果不能ToString(),不能Equals(null),也就是说返回结果没有任何作用
3、 executeReader方法执行SQL,(如果SQL是查询Select)返回查询结果的集合,类型是System.Data.OleDb.OleDbDataReader,你可以通过此结果,获取查询的数据。如果(如果SQL不是查询Select)那么返回一个没有任何数据的System.Data.OleDb.OleDbDataReader类型的集合(EOF)
四、总结:
ASP.Net中对于数据库的操作方法很多,要实现统一个目标不同的人可能会采取不同的方法,就好像在ASP中有的人喜欢用RS.ADDNEW,有的人喜欢用”Insert Into”,主要是看个人的习惯,当然在性能上不同的方法可能会存在较大的差别,这个只能靠我们在平常的学习中一点一滴的积累经验的。另外顺便说一下ASP.Net页提供类似如下方式的操作方法:
OleDbCommand2.Parameters("au_id").Value = TextBox1.Text
OleDbCommand2.Parameters("au_lname").Value = TextBox2.Text
OleDbCommand2.Parameters("au_fname").Value = TextBox3.Text
OleDbCommand2.Parameters("phone").Value = TextBox4.Text
OleDbCommand2.Parameters("address").Value = TextBox5.Text
OleDbCommand2.Parameters("city").Value = TextBox6.Text
OleDbCommand2.Parameters("st").Value = TextBox7.Text
OleDbCommand2.Parameters("zip").Value = TextBox8.Text
OleDbCommand2.Parameters("contract").Value = CheckBox1.Checked
cmdresults = OleDbcommand2.ExecuteNonQuery()
这个方法在我们以后的文章中,我们会慢慢给大家讲解的,下一章我们要讲的是如何从数据库中读取数据
-
最佳ASP.NET编程习惯
初学编程的朋友往往喜欢收集一些很“奇妙”的编程技巧,然而,技巧的积累往往并没有提高程序质量,反而引导一些编程者一味追求奇和新,忘记了基本编程习惯的培养,不利于团队的合作,可能,这也是中国并不缺少聪明的程序员,但是缺少聪明的开发团队的一个原因吧。在ASP.NET的开发中,可以学习的技巧不少,但是,一些基本的编程习惯我们一定要养成,这样不但能根本上提高程序质量和开发效率,而且,也利于程序的阅读和团队开发。如果自己写的程序只有自己可以看懂或者只有几个人可以看懂,即使程序技巧神乎其技,对于程序的升级和维护都是致命问题。
一、 错误(以外)的处理
程序健壮性最基本要求就是程序错误的处理与捕捉,在ASP.NET中,错误的处理有和其他编程语言一样的机制,可以使用Try…Catch…Finally等方式,这一点和ASP相比具有较大的进步。而且,使用这些错误处理方法,可以大大提高程序的可读性和程序调试速度,在这几个优势结合的情况下,我们更加应该注意这一点。
关于错误的处理,我们可以参考这篇文章(英文):
http://www.123aspx.com/redir.aspx?res=28336
二、 字符串的处理
网页设计中,字符串的处理几乎是最常见的了。使用ASP.NET以后,字符串的处理比ASP的速度快,而且,在ASP.NET中,专门增加一个字符串处理类StringBulider,使用这个类可以完成一些常见的字符串操作,而最主要的,使用StringBuilder可以大大提高字符串处理速度。
在ASP.NET中,最常见的就是使用“&”来连接两个字符串:
Dim myOutputString As String = "My name is"
Dim myInputString As String = " Alex"
myOutputString = myOutputString & myInputString
Response.Write(myoutputString)
现在,我们来看看StringBuilder的使用,在使用StringBuilder的时候,我们对字符串可以做一些基本的操作,比如Append、Replace、Insert、Remove等,现在我们来看具体举例。
(1)StringBuilder中Append的使用
Append和其他语言的Append一样,就是在字符串最后增加其他字符。
Dim sb as StringBuilder = New StringBuilder()
sb.append( "<table border='1' width='80%'>" )
For i = 0 To RowCount - 1
sb.Append("<tr>")
For k = 0 To ColCount - 1
sb.Append("<td>")
sb.Append( dt.Rows(i).Item(k, DataRowVersion.Current).toString())
sb.Append( "</td>" )
Next
sb.Append("<tr>")
Next
sb.Append( "</table>")
Dim strOutput as String = sb.ToString()
lblCompany.Text = strOutput
在以上的程序中,用Append方法实现了一个表格的输出,需要注意的一点是,StringBulider必须首先使用ToString()方法将其转化为String类型才可以直接输出。在以上的举例中,我们看到的全部是Append一个直接的字符串,其实,这个方法有一个很方便的功能,那就是可以直接Append其他类型的变量,比如可以直接Appemd一个Integer类型的数值,当然,我们输出以后自动转化为一个字符串:
Sub Page_Load(Source As Object, E As EventArgs)
Dim sb As System.Text.StringBuilder
Dim varother As Integer
varother=9999
sb =new System.Text.StringBuilder()
sb.append("<font color='blue'>可以Append其他类型:</font>")
sb.append(varother)
Response.write(sb.toString())
End Sub
(2)字符串中其他方法的使用
我们还可以使用其他方法,我们来看看常见的:
Insert方法,可以在指定位置插入其他字符,使用方法:Insert(插入位置,插入字符);
Remove方法,可以在指定位置删除指定字数字符,使用方法:Remove(其实位置,字符数);
Replace方法,可以替换指定字符,使用方法:replace(被替换字符串,替换字符串)
字符串的具体介绍和使用方法可以参考以下文章(英文):
http://aspfree.com/aspnet/stringbuilder.aspx
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemTextStringBuilderClassTopic.asp
三、 数据库链接Connection和DataReader的关闭
在使用ASP编程的时候,我们就已经知道,在使用数据库连接以后,一定要将连接关闭,然后设置为NoThing。在Asp.NET中,我们仍然需要这样使用,不过,在ASP.NET中,由于使用了ADO.NET,所以,在一些相关的处理方面,实际还是有一些细微的区别,而这些区别,往往也就是我们设计的时候最需要注意的。现在,我们通过举例,来看看在常见的ADO.NET操作中,需要注意哪些问题。
(1)举例一
Dim myConnection As SqlConnection = new SqlConnection(ConfigurationSettings.AppSettings("DSN_pubs"))
Dim myCommand As SqlCommand = new SqlCommand("Select pub_id, pub_name From publishers", myConnection)
Dim myDataReader As SqlDataReader
Try
myConnection.Open()
myDataReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection)
DropDownList1.DataSource = myDataReader
DropDownList1.DataBind()
Catch myException As Exception
Response.Write("An error has occurred: " & myException.ToString())
Finally
If Not myDataReader Is Nothing Then
'关闭DataReader
myDataReader.Close()
End If
End Try
在以上的举例中,我们注意到,这里只关闭了DataReader,并没有关闭Connection。为什么呢?仔细观察以上的ExecuteReader方法,原来,设置了ExecuteReader参数,当执行完ExecuteReader以后,会自动关闭Connection。所以,这样设置以后,就没有必要再手动关闭Connection了。
(2)举例二
Dim myConnection As SqlConnection = new SqlConnection(ConfigurationSettings.AppSettings("DSN_pubs"))
Dim myCommand As SqlCommand = new SqlCommand("Select pub_id, pub_name From publishers", myConnection)
Try
myConnection.Open()
DropDownList1.DataSource = myCommand.ExecuteReader()
DropDownList1.DataBind()
Catch myException As Exception
Response.Write("An error has occurred: " & myException.ToString())
Finally
If Not myConnection Is Nothing AndAlso ((myConnection.State And ConnectionState.Open) = ConnectionState.Open) Then
myConnection.Close()
End If
End Try
在以上的举例中,我们发现,居然没有关闭DataReader。为什么呢?其实上面的代码中,没有直接生成DataReader对象,当然也就无从关闭了。需要注意一点的是,在关闭Connection之前,程序首先判断Connection是否已经打开,如果没有打开,也就没必要关闭了。
四、使用Web.Config/Maching.Config保存常用数据
一些数据我们需要时常使用,比如使用ADO.NET的时候,最常见的就是数据库连接语句,在ASP中,我们常常将这些信息保存在Application中。当然,在ASP.NET中,也可以这样,不过,ASP.NET已经提供一个配置文件WEB.Config,所以,我们最好将这些信息保存在WEB.Config中,当然,我们也可以保存在Machine.Config中,不过,这样的话,整个网站都必须使用,所以,一般我们都使用Web.Config。现在,我们来看具体这个文件的使用。
(1)Web.Config文件的设置
首先,我们来看Web.Config的设置,我们在这个文件中增加设置以下两个项目,设置如下:
<configuration>
<appsettings>
<add key="dsn" value="myserver"/>
<add key="someotherkey" value="somevalue"/>
</appsettings>
</configuration>
(2)变量的使用
以上XML文件设置了dsn和someotherkey两个变量,现在我们看看程序中怎样使用:
<html>
<script language="VB" runat=server>
Sub Page_Load(Sender as Object, E as EventArgs)
Dim AppSettings as Hashtable = Context.GetConfig("appsettings")
DSN.Text = AppSettings("dsn")
SomeOther.Text = AppSettings("someotherkey")
End Sub
</script>
<body>
DSN Setting: <asp:label id="DSN" runat=server/> <br>
Some Other Setting: <asp:label id="SomeOther" runat=server/>
</body>
</html>
上面的程序我们看到,使用这样定义的变量很简单也很方便。
五、使用.NET的方式调试程序
ASP程序的调试一直是编写ASP最难的地方,这一点,ASP程序员大概都深有体会,因为大家都是使用Response.write来调试。而这样调试最大的缺点是,当我们调试完毕,必须一个个来删除或者注释掉这些信息,想一想,如果程序代码达到几百行或者页面很多的程序,这样的工作是多么枯燥,最怕一点,忘记将这些调试用的write删除,可能在用户使用的时候就会出现一些不雅的调试信息。
使用ASP.NET以后,我们可以直接定义Trace来实现程序的调试。以上提到的麻烦可以轻松解决,熟悉,Trace可以通过具体页面和在Web.Config配置文件中来定义实现,这样,当程序调试完毕以后,直接将Trace设置为Off就可以了,这样,程序就不会有调试功能了。
(1)页面调试的实现
在一个具体的页面需要实现调试功能的时候,我们可以这样设置:
<%@ Page Language="VB" Trace="True" %>
(2)定义WEB.Config实现
在WEB.CONFIG中,我们也可以实现程序调试的打开:
<configuration>
<system.web>
<trace enabled="true" requestLimit="10" localOnly="false"/>
</system.web>
</configuration>
使用以上的设置打开Trace以后,我们在具体的程序中就可以使用Trace来调试程序了,比如:
Trace.Write("This is some custom debugging information")
或者调试程序变量:
Trace.Write("This is is my variable and it's value is:" & myVariable.ToString())
以上设置我们可以看出,在ASP.NET中,程序调试功能已经很方便简单了,我们在程序设计中如果忽略这些特点,继续采用ASP的思维来设计程序,那么我们的程序不但效率没有提高,也增加了其他开发者合作的难度。
六、总结
以上的一些程序编写习惯,我们可以慢慢养成,在程序设计的时候,不要太在意程序是否最简洁灵活,对于一般开发者而言,程序规范化和可读性可能比追求程序的灵活性更加重要。在互联网资源越来越丰富的情况下,我们可以参考一些很规范的程序源代码来学习,当然,最好的莫过于微软自己的东西,我们可以参考以下网址:http://www.asp.net,关于更多的程序编写问题,我们可以参考以下网址:
http://www.gotdotnet.com/team/asp/ASP.NET%20Performance%20Tips%20and%20Tricks.aspx
-
ASP.NET中数据库的操作初步----连接并且打开数据库
对于用过beta2版的网友来说,学习本文的内容将会是十分的简单,因为.net正式版和beta2版的差别不大,所以对于beta2中的程序你几乎可以不作修改(或者只做少量修改)就可以再正式版中正常的运行。
在这里我们来讲一下怎样打开数据库,我们不赞同利用写字本或者editplus等文本编辑器来编写asp.net,所以本文的讲述全是在VS.NET开发工具上的。
建立一个新的数据库连接,首先我们从工具箱工双击OleDbConnection 或者 双击 SqlConnection 如图所示
注意:OleDbConnection 和 SqlConnection的区别在于:OleDbConnection适合于连接任何类型的数据库(如Oracle,SQL Server,ACCESS等等),而SqlConnection是专门用来连接SQL Server(MS SQL)数据库的,据说效率比OleDbConnection高。如果你的数据库是MS SQL 那么你就双击SqlConnection吧,其他数据库就用OleDbConnection吧。同样的道理SqlDataAdapter,SqlCommand是专门用于(MS SQL)数据库的,而OleDbDataAdapter, OleDbCommand适用于所有的数据库,如果你双击的是SqlConnection,那么在今后的数据库操作中你只能用SqlDataAdapter,SqlCommand,同样的道理如果你双击的是OleDbConnection,那么在今后的数据库操作中你只能用OleDbDataAdapter, OleDbCommand。在这里我们选择OleDbConnection。
当我们双击OleDbConnection后在窗口的下端将会出现一个名为oleDbConnection1的数据库连接源
我们可以在属性窗口改变oleDbConnection1的名称为MyConnection,
连接数据库在关键的步骤为:从上图中的ConnctionStr中选择< 新建连接…> 然后将会弹出如下窗口:
选择好数据库的类型 “下一步”后 选择数据库的正确位置 如下图
(测试连接 成功后)单击确定,然后(双击编辑窗口任意空白位置)打开对应的cs文件,将会看到程序中自动加入了
protected System.Data.OleDb.OleDbConnection MyConnection;代码
而且在private void InitializeComponent()中加入了
this.MyConnection = new System.Data.OleDb.OleDbConnection();
//
// MyConnection
//
this.MyConnection.ConnectionString = @"Provider=SQLOLEDB.1;Persist Security
Info=False;User ID=sa;Initial Catalog=house;Data Source=CYH;Use Procedure
for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=CYH;Use
Encryption for Data=False;Tag with column collation when possible=False";
//
现在要打开数据库变得很简单了,你只要使用
MyConnection.Open(); //数据库就打开了
MyConnection.Close();//关闭数据库
如你可以在private void Page_Load(object sender, System.EventArgs e)打开数据库
private void Page_Load(object sender, System.EventArgs e)
{
MyConnection.Open();
// 在此处放置用户代码对数据库进行增加、删除、修改、查询等操作
MyConnection.Close();
}