知识点: 理解 ASP.NET 的控件的分类、 掌握服务器控件和页面回发的原理、 掌握基本的 Web 服务器控件、 掌握服务器控件的客户端事件处理。
在第一课【使用ASP.NET开发Web项目】第一课——初识ASP.NET中,我么创建了第一个ASP.NET程序,也已经初步认识到了 ASP.NET WebForm 中的 Button、Label 和 TextBox 控件。Asp.net之所以开发方便和快捷,关键是它有一组强大的控件库,包括 HTML 控件、HTML 服务器控件和 Web服务器控件。
我们经常使用的是 Web 服务器控件,根据它们功能的侧重点不同,Web 服务器控件可以分为标准控件、具有强大数据绑定功能的数据控件、用于检测输入的验证控件等。通过本章的学习,可以掌握所有 ASP.NET 控件的共有特性、常用的标准控件及服务器控件的客户端事件处理的方式。
在 ASP.NET 中,控件分为 HTML 控件、HTML 服务器控件和 Web 服务器控件。不管什么控件,最终会生成 HTML 代码,由浏览器根据 HTML 代码解析后呈现。
客户端一般由浏览器来充当,服务端一般由IIS 这类的服务器和网站代码来实现! 用于提供浏览服务的服务器端软件,称为 Web 服务器。
常用的web服务器: IIS 微软集成在Windows Server 服务器上的 Web 服务器软件,全称为 Internet Information Server,又称互联网信息服务器。 ASP.NET Development Server 集成在 Visual Studio 2005 和 2008 中的 Web 服务器,可以处理本机的请求,用于 Web 应用程序开发中使用。
HTML 标签,比如是一个文本框标签,在 ASP.NET 中,这种标签称作 HTML 控件。ASP.NET 不会对这种控件做处理,即在客户端运行,我们也无法为 HTML 控件绑定服务器端事件,即在服务器端无法用代码捕获它,只能在客户端通过 javascript 等程序语言来控制。因为 HTML 控件不消耗服务器资源,所以如果仅仅强调客户端的应用,那么用 HTML 控件即可。
我们可以将 HTML 控件转换为 HTML 服务器控件,方法是在 HTML 标签中添加runat="server"的属性,这个属性声明了该控件在服务器端运行。在 ASP.NET 执行的过程中,ASP.NET 将创建包含runat="server"属性的元素实例,如果需要在后置代码中使用此实例,则需要为控件分配id 属性。
示例效果:用户在输入框里输入姓名,点击【确定】按钮时,输出针对该姓名的欢迎语。
第一步:在VS中新建asp.net web项目,并添加一个web窗体,使用HTML服务器控件,制作基本界面。
代码提示:
第二步:在解决方案资源管理器中,找到当前WebForm1.aspx,点击左侧的三角形,双击打开文件WebForm1.aspx.cs,编写代码。
protected void btnSure_ServerClick(object sender, EventArgs e)
{
Response.Write("欢迎您!" + txtName.Value);
}
注意:这里的事件,需要自己在WebForm1.aspx.cs文件里写。
与 HTML 服务器控件不同,Web 服务器控件不是由 HTML 元素直接转换而来的,而是微软重新定义的一套控件。第一章使用的 TextBox、Label 和 Button 都是 Web 服务器控件。Web 服务器控件提供统一的编程模型、包含方法以及与之相关的事件处理程序,并且这些代码都在服务器端执行。在 ASP.NET 中,我们平时使用的都是 Web 服务器控件。Web 服务器控件的标签都是以“asp:” 开头,称为标记前缀,后面是控件类型,如:
注意:虽然runat="server"是 Web 服务器控件的默认属性,但该属性不能省略不写,否则会出现编译错误。
HTML 服务器控件和 Web 服务器控件都是在服务器端运行,它们通过设置 id 属性,在服务器端用id来自动捕获它们。
Label 控件是 ASP.NET 中最常用的控件之一,用于将文本内容显示在网页上,支持以编程方式动态修改显示的内容。Label 控件常用的成员如表所示。
成员名称 |
成员类型 |
说明 |
Text |
属性 |
获取或者设置控件的文本内容 |
AccessKey |
属性 |
导航到其他控件的快捷键 |
AssociatedControlID |
属性 |
使用快捷键导航的目的控件ID |
Visible |
属性 |
布尔值,设置控件是否可见 |
示例效果:网页运行后,用户通过快捷键“Alt+U”,快速访问文本框。
第一步:在当前项目中,新添加一个web窗体,并命名为Example2,如下图所示
第二步:Web窗体添加成功后,默认打开源代码界面,我们可以单击下方的【设计】,切换界面。然后从工具箱里分别拖一个Label控件和一个TextBox控件,并进行相关属性设置。
第三步:启动运行调试,查看效果。效果出现后,可以在VS中,回到【源代码】界面,查看代码的变化。
注意:当我们在设计界面拖放控件,并设置属性时,会自动在aspx页面生成对应代码。
提示:Label控件的Text属性中如果包含HTML标签,则会被浏览器解析并执行。
思考:在浏览器中查看页面源代码,看看两个源代码之间有什么区别,为什么?
在页面中,使用 TextBox 控件收集用户输入的信息或者显示文本。它可以配置为单行、多行或者密码类型。TextBox 常用的成员如表所示。
成员名称 |
成员类型 |
说明 |
AutoPostBack |
属性 |
布尔值,规定当内容改变时,是否回传到服务器。默认是 false |
Text |
属性 |
获取或者设置控件的文本内容 |
TextMode |
属性 |
设置 TextBox的模式(单行、多行或密码等) |
ReadOnly |
属性 |
布尔值,设置能否改变文本框中的文本 |
MaxLength |
属性 |
在 TextBox 中所允许的最大字符数 |
Rows |
属性 |
设置TextBox 的高度(仅在 TextMode="Multiline" 时使用) |
Columns |
属性 |
设置TextBox 的宽度 |
OnTextChanged |
事件 |
当 TextBox 中的文本被更改时所触发的事件 |
示例效果:网页运行后,用户按照提示输入用户名、密码和留言,当用户留言结束离开TextBox控件时(失去焦点),触发OnTextChanged事件,显示欢迎语。
第一步:在当前项目中,新添加一个web窗体,并命名为Example3,然后在body里写一个4行2列的表格,做基础界面设计。
第二步:在head标签里,写一对style标签,写css样式,来控制表格的样式。
第三步:点击【设计】,进入设计界面,选中留言对应的TextBox控件(ID属性被设置为txtContent),在属性面板点击【事件】,找到该控件的TextChanged事件,双击进入。(注意,这时候事件后面有事件名,是因为我们在第一步写源代码时,已经写好了事件名称。)
在txtContent_TextChanged事件中,编写代码:
protected void txtContent_TextChanged(object sender, EventArgs e)
{
lblInfo.Text = "您好:" + txtName.Text + ",您的留言是:" + txtContent.Text;
}
第四步:启动运行调试,查看效果。
示例代码分析:
(1)OnTextChanged 事件在输入焦点离开 TextBox 时才被引发。
(2)AutoPostBack 属性用于设置当触发文本框的 OnTextChanged 事件时,是否自动产生向服务器的回发。为了避免由于回发引起页面的刷新,默认把 AutoPostBack 属性设置为false。
(3)本例中,将用于输入留言的 TextBox 的 AutoPostBack 属性设置为 true,使 TextBox失去焦点后自动回发到服务器,以便立即处理 OnTextChanged 事件。
开发网站时,常常用到各种图片。Image 控件用于在网页上呈现图片,最终生成元素,支持以编程的方式管理显示的图片。Image 控件常用成员如表所示。
成员名称 |
类型 |
说 明 |
ImageUrl |
属性 |
显示的图片所在的URL地址 |
ToolTip |
属性 |
当鼠标指向图片时的说明性文字 |
AlternateText |
属性 |
图像不可用时取代图像显示的文字 |
示例效果:网页运行后,会随机显示一张图片,鼠标移动到图片上面,会出现该图片的说明性文字。刷新页面,会随机显示新的图片,同样,鼠标移动到该图片上也有提示文字。
第一步:在当前项目中,新添加一个web窗体,并命名为Example4,然后在设计界面,拖放一个Image控件,并设置属性。ID属性:imgWuhan、Height属性:200px、Width属性:300px
切换到源代码模式,会看到我们添加的Image控件,已经被自动添加。
第二步:在解决方案资源管理器中,鼠标右键单击当前项目名称WebApplication2,依次选择【添加】——【新建文件夹】——【将新建的文件夹命名为img】。然后鼠标右键单击文件夹【img】,再单击【在文件资源管理器中打开文件夹】,然后将自己需要的图片,存放在该文件夹里。
第三步:在解决方案资源管理器中,鼠标单击Example4.aspx文件前面的三角形,找到他对应的Example4.aspx.cs文件,双击进入,在Page_Load事件里编写代码。
protected void Page_Load(object sender, EventArgs e)
{
Random num = new Random();
int i = num.Next(1, 5);//随机产生1到5之间的整数
imgWuhan.ImageUrl = "img/" + i + ".jpg";//构造图片的相对路径
switch (i)
{
case 1:
imgWuhan.ToolTip = "凌波门";//设置图片的ToolTip属性
break;
case 2:
imgWuhan.ToolTip = "武汉关";
break;
case 3:
imgWuhan.ToolTip = "黄鹤楼";
break;
case 4:
imgWuhan.ToolTip = "鹦鹉洲大桥";
break;
}
}
第四步:启动运行调试,查看效果。
HyperLink 控件用于在网页上以图片或文本方式呈现一个链接,常用成员如表所示。
成员名称 |
成员类型 |
说明 |
Text |
属性 |
显示链接的文本 |
ImageUrl |
属性 |
显示链接的图片所在的URL地址 |
NavigateUrl |
属性 |
链接的目的页面的URL地址 |
ToolTip |
属性 |
当鼠标指向链接时的说明性文字 |
示例效果:网页运行后,看到一个文本超链接“百度首页”、一张图片超链接,分别点击他们,都可以打开百度首页。
第一步:在当前项目中,新添加一个web窗体,并命名为Example5,然后在设计界面,拖放一个HyperLink控件,并设置属性。ID属性:hlkText、NavigateUrl属性:http://www.baidu.com、Target属性:_blank、Text属性:百度首页。
第二步:在设计界面,继续拖放一个HyperLink控件,并设置属性。ID属性:hlkImage、ImageHeight属性:100px、ImageUrl属性:img/baidu.png、ImageWidth属性:200px、NavigateUrl属性:http://www.baidu.com、Target属性:_blank。
(注意:这里设置ImageUrl属性时,采用的是相对路径,可以提前在自己项目的img文件夹中存放一张图片。如果自己练习时的图片名称、格式等不一致时,要学会自己更改,否则可能会导致图片不可见)
第三步:启动运行调试,查看效果。(可以切换到源代码界面,查看代码)
HyperLink 使用 Text 属性时,呈现一个文本方式的链接,最终会生成一个包含文本的标签(百度首页 )。同时使用 ImageUrl 属性和Text 属性时,程序会优先显示 ImageUrl 属性中的图片,当图片不可用时则显示 Text 属性中的文字,HyperLink 控件会为 ImageUrl 属性生成标签,并使用标签嵌套( )。
在 ASP.NET WebForm 中,单选按钮主要有 RadioButton 控件提供。RadioButton 控件用于在页面创建一个单选项,可以使用GroupName属性,将多个单选项分为一组来创建多个互斥的选项。RadioButton 常用成员如表 所示。
成员名称 |
成员类型 |
说明 |
Text |
属性 |
获取或者设置单选按钮的文本 |
TextAlign |
属性 |
设置文本和单选按钮的对齐方式 |
GroupName |
属性 |
分组的名称 |
Checked |
属性 |
获取或者设置是否选中控件 |
CheckedChanged |
事件 |
选择状态改变时触发 |
示例效果:网页运行后,有一组单选按钮选项,默认选项“男”被选中,用户可以根据需要,点选不同的选项,每次只能选中一个。
第一步:在当前项目中,新添加一个web窗体,并命名为Example6,然后在设计界面,写上文字“性别:”,再文字后面拖放一个RadioButton控件,并设置属性。ID属性:rdoSexM、Checked属性:True、GroupName属性:gender、Text属性:男。
第二步:在当前设计界面,继续拖放一个RadioButton控件,并设置属性。ID属性:rdoSexW、GroupName属性:gender、Text属性:女。
第三步:启动运行调试,查看效果。(可以切换到源代码界面,查看代码)
在 ASP.NET WebForm 应用程序中,CheckBox 控件用来在页面中创建复选框,常用成员见表 所示。
成员名称 |
成员类型 |
说明 |
Text |
属性 |
获取或者设置单选按钮的文本 |
TextAlign |
属性 |
设置文本和单选按钮的对齐方式 |
Checked |
属性 |
获取或者设置是否选中控件 |
CheckedChanged |
事件 |
选择状态改变时触发 |
示例效果:网页运行后,有一组复选框按钮选项,默认选项“篮球”被选中,用户可以根据需要,点选不同的选项,选中以后,单击确定按钮,会输出用户选中的选项。
第一步:在当前项目中,新添加一个web窗体,并命名为Example7,然后在设计界面,写上文字“请选择你喜欢的运动:”,在文字后面拖放一个CheckBox控件,并设置属性。ID属性:chkSport1、Checked属性:True、Text属性:篮球。
继续添加两个CheckBox控件,分别设置他们的属性:
ID属性:chkSport2、Text属性:足球
ID属性:chkSport3、Text属性:乒乓球
第二步:在当前设计界面,换行以后,继续拖放Button控件,并设置其属性,ID属性:btnSure、Text属性:确定。
第三步:在当前设计界面,换行以后,输入文字“你选择的爱好是:”,然后再文字后面拖放一个Label控件,并设置其属性,ID属性:lblState、Text属性: (设置为空)。
可以查看一下此时的源代码:
第四步:在当前设计界面,双击Button控件,进入该控件的事件,编写代码。
protected void btnSure_Click(object sender, EventArgs e)
{
foreach (Control ct in form1.Controls)//遍历id是form1的元素中,所有的控件
{
if (ct.GetType().ToString().Equals("System.Web.UI.WebControls.CheckBox"))//如果遍历到的控件是复选框
{
CheckBox cb = (CheckBox)ct;//将ct进行强制类型转换,转换成CheckBox类型,并赋值给变量cb。因为foreach循环中的变量使用了控制的最高超类 Control ,不能直接将它赋给CheckBox的引用变量cb,因此一定要做向下转型,强制转为CheckBox类型的引用。
if (cb.Checked == true)//如果变量的Checked属性是true,代表着用户勾选了这个复选框
{
lblState.Text += cb.Text + " ";//使用cb的Text属性获取该复选框的内容,并赋值给lblState控件的Text属性
}
}
}
}
代码解析:
注意:CheckBox 最终生成的 HTML 元素是和
列表控件主要用于显示若干个选项,让用户选择其中一项或多项,具体过程取决于列表控件允许单选还是多项。列表控件常用的成员如表 所示。
成员名称 |
类型 |
说 明 |
AutoPostBack |
属性 |
获取或设置一个值,当更改选项时,是否自动产生向服务器的回发 |
Items |
属性 |
获取控件列表项的集合 |
SelectedValue |
属性 |
获取列表控件中选定项的值或设置列表控件中包含指定值的项 |
Text |
属性 |
获取或设置控件的SelectedValue属性 |
SelectedItem |
属性 |
获取列表控件中索引最小的选定项 |
SelectedIndex |
属性 |
或者或设置控件中选定项的最低序号索引 |
DataSource |
属性 |
获取或设置对象,列表控件从该对象中检索其数据项列表 |
DataTextField |
属性 |
获取或设置为列表项提供文本内容的数据源字段 |
DataValueField |
属性 |
获取或设置为列表项提供值的数据源字段 |
DataBind |
方法 |
将数据源绑定到控件及其所有子控件中 |
在 ASP.NET 中,列表控件包括 DropDownList 控件、ListBox 控件、RadioButtonList 控件和CheckBoxList 控件。
除了列表控件常用的成员之外, RadioButtonList 与 CheckBoxList 的常用成员见表所示。
成员名称 |
成员类型 |
说明 |
TextAlign |
属性 |
文字与控件的对齐方式 |
RepeatDirection |
属性 |
列表显示时排列的方向 |
RepeatColumns |
属性 |
列表显示的列数 |
示例效果:网页运行后,显示各种类型的列表控件,用户可以根据需要进行选择。
第一步:根据案例要求准备好数据库文件。(推荐阅读:SQL Server数据库第三课2:使用create语句新建数据库、数据库表)
--创建数据库
create database CarSYS;
--使用数据库
use CarSYS;
--创建数据库表
create table Brand(
BrandId int primary key identity(1,1), --编号列
BrandName nvarchar(100) not null --品牌名称列
);
--向表中插入数据
insert into Brand (BrandName)
select '红旗' union
select '宝马' union
select '奥迪' union
select '保时捷' union
select '宾利' ;
第二步:设计前台界面,在当前项目中,新添加一个web窗体,并命名为Example8。
在设计界面,写上文字“DropDownList控件:”,在文字后面拖放一个DropDownList控件,并设置属性。ID属性:ddlCarType、Height属性:30px、Width属性:176px。
换行以后继续输入文字“ListBox控件:”,然后在文字后面拖放一个ListBox控件,并设置属性。ID属性:lbCarType、Height属性:86px、Width属性:122px、Rows属性:5。
换行以后继续输入文字“RadioButtonList控件:”,然后在文字后面拖放一个RadioButtonList控件,并设置属性。ID属性:rblCarType、RepeatColumns属性:5、RepeatDirection属性:Horizontal。
换行以后继续输入文字“CheckBoxList控件:”,然后在文字后面拖放一个CheckBoxList控件,并设置属性。ID属性:cblCarType、RepeatColumns属性:5、RepeatDirection属性:Horizontal。
此时预览网页,看一下效果,由于没有绑定数据库,所以控件里的内容都是空的
第三步:连接数据库,在解决方案资源管理器中,鼠标单击Example8.aspx文件前面的三角形,找到他对应的Example8.aspx.cs文件,双击进入,在Page_Load事件里编写代码。(数据库连接操作,推荐阅读:ADO.NET数据库开发(三)DataSet 对象和DataAdapter 对象的使用)
protected void Page_Load(object sender, EventArgs e)
{
string constr = "server=LAPTOP-IN3E6IJP\\SQLEXPRESS; integrated security=true; database=CarSYS";//声明一个字符串用来存放连接数据库的信息
string sql = "select * from Brand";//声明一个字符串,用来存放查询数据库表语句
SqlConnection con = new SqlConnection(constr);//创建一个SqlConnection对象,注意要引用using System.Data.SqlClient;
try //将可能出错的语句放在try语句里
{
con.Open();//打开数据连接
SqlDataAdapter sda = new SqlDataAdapter(sql, con);//创建一个SqlDataAdapter对象,
DataSet ds = new DataSet();//创建一个DataSet对象,注意要引用using System.Data;
sda.Fill(ds);
//用DropDownList显示品牌
ddlCarType.DataSource = ds.Tables[0]; //设置表格对象,列表控件从该对象中检索其数据项列表
ddlCarType.DataTextField = "BrandName";//设置为列表项提供文本内容的数据源字段
ddlCarType.DataValueField = "BrandId";//设置为列表项提供值的数据源字段
ddlCarType.DataBind();//将数据源绑定到控件中
ddlCarType.Items.Insert(0, new ListItem("请选择", "-1"));//插入"请选择"项,必须放到数据绑定之后:
//用ListBox显示品牌
lbCarType.DataSource = ds.Tables[0];
lbCarType.DataTextField = "BrandName";
lbCarType.DataValueField = "BrandId";
lbCarType.DataBind();
//用RadioButtonList显示品牌
rblCarType.DataSource = ds.Tables[0];
rblCarType.DataTextField = "BrandName";
rblCarType.DataValueField = "BrandId";
rblCarType.DataBind();
rblCarType.SelectedIndex = 0;
//用CheckBoxList显示品牌
cblCarType.DataSource = ds.Tables[0];
cblCarType.DataTextField = "BrandName";
cblCarType.DataValueField = "BrandId";
cblCarType.DataBind();
cblCarType.SelectedIndex = 0;
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
finally
{
con.Close();//关闭数据库连接
}
}
HiddenField 控件是 ASP.NET 表单类控件,它没有用户界面,包含一个常用属性 Value。HiddenField 控件会生成“type=’hidden’”的 input 元素。
在实际项目中,为了避免页面回发时使数据恢复初始化的状态,可以使用 HiddenField 控件来保存这些数据。
示例效果:单击 Button 时,Label 显示的数据从 0 开始,以 1 的步长逐步递增的功能。
第一步:在当前项目中,新添加一个web窗体,并命名为Example9,然后在设计界面,拖放一个HiddenField控件,并设置属性。ID属性:hfNumber、Value属性:0。
继续拖放一个Label控件,并设置属性。ID属性:lblCount、Text属性为:累计到:0。
继续拖放一个Button控件,并设置属性。ID属性:btnAdd、Text属性为:累计。
第二步:在解决方案资源管理器中,鼠标单击Example9.aspx文件前面的三角形,找到他对应的Example9.aspx.cs文件,双击进入,编写代码。
public int i
{
get
{
return int.Parse(hfNumber.Value);
}
set
{
hfNumber.Value = value.ToString();
}
}
第三步:在解决方案资源管理器中,切换到Example9.aspx文件的设计界面,双击Button按钮进入Click事件,编写代码。
protected void btnAdd_Click(object sender, EventArgs e)
{
i++;
lblCount.Text = "累计到:" + i;
}
ASP.NET 事件主要是指在服务器端处理的事件,但对有些服务器控件的操作并不会触发页面回发,可以将服务器控件的 AutoPostback 属性设置为 true,使该控件立即触发页面回发,以便服务器端处理操作引发的事件。但是回发会导致整个页面的频繁刷新,降低客户的体验度,也会增加服务器的负担,所以可以将一些工作借助客户端事件进行处理。
客户端事件在浏览器中引发后立即捕获,由浏览器中的 javascript 脚本负责处理;在ASP.NET 中,服务器控件借助 Attributes 属性来支持客户端的各种事件。
Attributes 属性由 System.Web.UI.WebControls.WebControl 类提供,所有呈现为 HTMl 标签的 Web 服务器控件都拥有此属性。Attributes 属性是在服务器端为服务器控件添加客户端处理代码的解决方案。
示例效果:单击 Web 服务器控件 Button 时,首先弹出对话框,提示用户“您确认删除吗”,如果用户单击“确定”,则提示“正在执行删除操作”。
第一步:在当前项目中,新添加一个web窗体,并命名为Example10,然后在设计界面,拖放一个Button控件,并设置属性。ID属性:btnDel、Text属性:删除。
第二步:在解决方案资源管理器中,鼠标单击Example10.aspx文件前面的三角形,找到他对应的Example10.aspx.cs文件,双击进入,编写代码。
protected void Page_Load(object sender, EventArgs e)
{
//使用Attributes属性为服务器控件添加onclick客户端事件的处理
btnDel.Attributes.Add("onclick", "javascript:return confirm('您确认删除吗?')");
}
第三步:在解决方案资源管理器中,切换到Example10.aspx文件的设计界面,双击Button按钮进入Click事件,编写代码。
protected void btnDel_Click(object sender, EventArgs e)
{
Response.Write("正在执行删除操作!");
}
注意:案例中,Button 服务器控件既写了客户端单击事件, 又写了服务器端单击事件。那么当单击该 Button 时,先执行客户端单击事件“return confirm('您确认删除吗?')”,如果返回的是 false,则不会触发服务器端的单击事件,也不会导致回发。如果返回的是 true,那么在执行完客户端脚本之后进行回发。注意回发时,也要先触发 Page_Load 事件,然后再触发服务器端的单击事件。
==============这里是结束分割线===============