在前面的章节中,已经介绍了标准的ASP.NET服务器控件,它们都或多或少地与传统HTML控件类似。另外,ASP.NET还提供了大量的功能更强大的控件,这些控件分别是:
MultiView和View控件
共同用于创建一组可导航的页面。
Wizard
创建一组对话框,以引导用户通过一组定义好的步骤来完成某些任务。
FileUpload
包括一个用于选择文件上传的文件浏览器及相关的基础构造。
AdRotator
当每次页面加载时呈现从列表中随机选择的图片。
Calendar
一个功能完整的用于显示和选择时间的控件。
所有这些控件都将在本章中介绍。此外,ASP.NET还提供了各种专门的控件,用以完成如验证、数据操作、安全和登录、个性化及导航等功能。它们中的每类控件都将有单独的章节进行介绍。
MultiView和View控件
MultiView and View Controls
有时可能要把一个web页面分成不同的块,而每次只显示其中一块,同时,又能方便地在块与块之间导航。该技术常用于在一个静态页面中引导用户完成多个步骤的操作,
例如,在线商店的检验过程或账户间的汇款过程。尽管已经有一个专门为此目的设计的Wizard控件,但是仍然可能使用MultiView和View控件来创建类似于向导的应用程序。
块是页面中某区域的内容,ASP.NET提供了View控件对块进行管理。每个块对应一个View控件,所有View对象包含在MultiView对象中。MultiView中每次只显示一个View对象。这个对象称为活动视图。
如图3-4a所示,View和MultiView控件并不是继承自WebControl,而是从System. Web. UI.Control类继承。
MultiView控件有一个类型为ViewCollection的只读属性View。使用该属性可获得包含在MultiView中的View对象集合。与所有的.NET集合一样,该集合中的元素被编入索引。MultiView控件包含ActiveViewIndex属性,该属性可获取或设置以0开始的,当前活动视图的索引。如果没有视图是活动的,那么ActiveViewIndex为默认值-1。
表5-1中列出了MultiView控件的4个CommandName字段。为按钮的CommandName属性赋值,能够实现视图导航。
表5-1 MultiView控件的CommandName字段
|
字 段 |
默认命令名 |
说 明 |
|
NextViewCommandName |
NextView |
导航到下一个具有更高ActiveViewIndex值的视图。如果当前位于最后的视图,则设置Active- ViewIndex为-1,不显示任何视图 |
|
PreviousViewCommandName |
PrevView |
导航到低于ActiveVie- wIndex值的视图。如果当前位于第一个视图,则设置ActiveViewIndex为-1,不显示任何视图 |
|
SwitchViewByIDCommandName |
SwitchViewByID |
导航到指定ID的视图,可以使用CommandArg- ument指定ID值 |
|
SwitchViewByIndexCommandName |
SwitchViewByIndex |
导航到指定索引的视图,使用CommandArgument属性指定索引 |
例如,将Button、ImageButton或LinkButton控件的CommandName属性设置为NextView,单击这些按钮后将自动导航到下一个视图,而不需要额外的代码。开发者不需要为按钮编写单击事件处理程序。
通过调用MultiView控件的SetActiveView或GetActiveView方法也可以设置或获取活动视图。SetActiveView使用View对象作为参数,而GetActiveView则返回一个View对象。
提示:记住,即使视图不可见,它所包括的所有控件对于应用程序和服务器端也都是可用的。不仅在代码中可用,而且还具有自己的视图状态,并作为页面的控件集合的一部分。
每次视图发生变化时,页面都会被提交到服务器,同时MultiView控件和View控件将触发多个事件。
活动视图发生变化时,MultiView控件将触发ActiveViewChanged事件。与此同时,新的活动视图将触发Activate事件,原活动视图则触发Deactivate事件。
所有的事件都包含一个EventArgs类型的参数。该参数只是一个占位符,它没有提供与事件相关的附加信息。然而,与所有的事件处理程序一样,对事件源的引用将传递给事件处理程序。
View控件包含一个Boolean类型的Visible属性,设置该属性可以控制特定View对象的可见性,或以编程方式确定哪一个View是可见的。
MultiView和View控件都没有样式属性。对于MultiView控件而言,这没什么可大惊小怪的。毕竟它只不过是View控件的容器而已。对于View控件而言,如果要使用样式属性,则必须将样式应用到每一个它包含的控件中。还有一种方法是在View控件中嵌入一个Panel控件,并设置Panel的样式属性。
下一个示例MultiViewDemo说明了MultiView和View控件的诸多特征。经过几次导航后的页面如图5-1所示。

图5-1:MultiViewDemo
MultiViewDemo的设计视图如图5-2所示,它由一个包含MultiView控件的页面组成。该MultiView控件名为MultiView1。MultiView1中包括4个View对象(vwFirst、vwSecond、vwThird和vwLast),以及其他用于导航的控件。该页面还包括一些用于显示MultiView和它所包含的View控件信息的控件。
每个View对象都包含导航按钮。此外,第一个View还包含一个TextBox控件。该控件用于说明当View不可见时,应用程序事件如何访问它所包含的控件。
为了创建该应用程序,可在VS2005中创建一个名为MultiViewDemo的网站。示例5-1列举了该示例的完整内容文件,其中MultiView和View都已高亮显示。首先查看源文件中MultiView和View控件,稍后再研究页面上的其他控件。

图5-2:MultiViewDemo的设计视图
示例5-1:MultiViewDemo网站的Default.aspx
<%@ Page Language=”C#” AutoEventWireup=”true” CodeFile=”Default.aspx.cs”
Inherits=”_Default” %>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.1//EN”
“http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml” >
<head runat=”server”>
<title>MultiView & View Controls</title>
</head>
<body>
<form id=”form1” runat=”server”>
<div>
<h1>MultiView & View Controls</h1>
<br />
<asp:RadioButtonList ID=”rblView” runat=”server”
AutoPostBack=”True”
OnSelectedIndexChanged=”rblView_SelectedIndexChanged”
RepeatDirection=”Horizontal” >
<asp:ListItem Value=”-1”>Nothing</asp:ListItem>
<asp:ListItem Selected=”True” Value=”0”>First</asp:ListItem>
<asp:ListItem Value=”1”>Second</asp:ListItem>
<asp:ListItem Value=”2”>Third</asp:ListItem>
<asp:ListItem Value=”3”>Last</asp:ListItem>
</asp:RadioButtonList>
<br />
Current Index:
<asp:Label ID=”lblCurrentIndex” runat=”server”></asp:Label>
<br/>
<asp:MultiView ID=”MultiView1” runat=”server”
ActiveViewIndex=”0”
OnActiveViewChanged=”MultiView1_ActiveViewChanged”>
<asp:View ID=”vwFirst” runat=”server”
OnActivate=”ActivateView”
OnDeactivate=”DeactivateView”>
<h2>First View</h2>
<asp:TextBox ID=”txtFirstView” runat=”server” />
<asp:Button ID=”btnNext1” runat=”server”
CommandName=”NextView”
Text=”Go To Next” />
<asp:Button ID=”btnLast” runat=”server”
CommandName=”SwitchViewByID”
CommandArgument=”vwLast”
Text=”Go to Last” />
</asp:View>
<asp:View ID=”vwSecond” runat=”server”
OnActivate=”ActivateView”
OnDeactivate=”DeactivateView”>
<h2>Second View</h2>
<asp:TextBox ID=”txtSecondView” runat=”server” />
<asp:Button ID=”btnNext2” runat=”server”
CommandName=”NextView”
Text=”Go To Next” />
<asp:Button ID=”btnPrevious2” runat=”server”
CommandName=”PrevView”
Text=”Go to Previous” />
</asp:View>
<asp:View ID=”vwThird” runat=”server”
OnActivate=”ActivateView”
OnDeactivate=”DeactivateView”>
<h2>Third View</h2>
<br />
<asp:Button ID=”btnNext3” runat=”server”
CommandName=”NextView”
Text=”Go To Next” />
<asp:Button ID=”btnPrevious3” runat=”server”
CommandName=”PrevView”
Text=”Go to Previous” />
</asp:View>
<asp:View ID=”vwLast” runat=”server”
OnActivate=”ActivateView”
OnDeactivate=”DeactivateView”>
<h2>Last View</h2>
<asp:Button ID=”btnPrevious4” runat=”server”
CommandName=”PrevView”
Text=”Go to Previous” />
<asp:Button ID=”btnFirst” runat=”server”
CommandArgument=”0”
CommandName=”SwitchViewByIndex”
Text=”Go to First” />
</asp:View>
</asp:MultiView>
<br />
<br />
First TextBox:
<asp:Label ID=”lblFirstTextBox” runat=”server” />
<br />
Second TextBox:
<asp:Label ID=”lblSecondTextBox” runat=”server” />
<br />
<br />
<strong><span style=”text-decoration: underline”>
View Activation History:
</span></strong>
<br />
<asp:Label ID=”lblViewActivation” runat=”server” />
</div>
</form>
</body>
</html>
示例5-1中高亮显示的MultiView控件,ID属性声明为MultiView1,ActiveViewIndex属性设置为0,这样可显示View集合中的第一个视图。如果没有设置ActiveViewIndex属性,则默认为-1,即不显示任何视图。
OnActiveViewChanged属性指向代码隐藏文件中的事件处理方法MultiView1_Active- ViewChanged(在示例5-2中列出),该事件处理方法在更改活动索引时执行。
示例5-2:MultiViewDemo网站的ActiveViewChanged事件处理程序
protected void MultiView1_ActiveViewChanged(object sender, EventArgs e)
{
lblFirstTextBox.Text = txtFirstView.Text;
lblSecondTextBox.Text = txtSecondView.Text;
rblView.SelectedIndex = MultiView1.ActiveViewIndex + 1;
}
该事件处理程序完成两个任务:一个是获取前两个视图中的文本框值,并把它们显示
在页面标签上。另一个任务是将页面顶部的RadioButtonList控件rblView设置为合适的项。这些代码相对比较简单,因为RadioButtonList.SelectedIndex和MultiView. ActiveViewIndex属性都是整型值。然而须注意,ActiveViewIndex属性最小值为-1,而RadioButtonList的最小索引值是0。也就是说,二者的偏移量为1。
该示例声明了4个View实例:vwFirst、vwSecond、vwThird和vwLast。每一个View控件都声明了OnActivate和OnDeactivate事件处理程序。
OnActivate=”ActivateView”
OnDeactivate=”DeactivateView”>
Activate事件由ActivateView方法处理,Deactivate事件由DeactivateView方法处理。示例5-3列出了这两个事件处理程序。它们保存有激活记录的Label控件的内容,并为之添加当前视图的ID和当前View的动作,然后将得到的字符串再赋值给Label控件。
示例5-3:Activate和Deactivate事件处理程序
protected void ActivateView(object sender, EventArgs e)
{
string str = lblViewActivation.Text;
View v = (View)sender;
str += “View “ + v.ID + “ activated <br/>”;
lblViewActivation.Text = str;
}
protected void DeactivateView(object sender, EventArgs e)
{
string str = lblViewActivation.Text;
View v = (View)sender;
str += “View “ + v.ID + “ deactivated <br/>”;
lblViewActivation.Text = str;
}
提示:由于sender是object的类型,它必须先转换为View类型再赋值给View的引用,然后再获取该View对象的属性,例如ID属性。
每个View对象都包含导航按钮。在 .NET Framework中创建这些控件非常简单(把它解释清楚要比实际操作更困难)。如表5-1所示,如果按钮的CommandName属性设置为默认值之一,则它所表示的动作将自动发生。因此,第一个View对象vwFirst包含了标签为“Go To Next”和“Go To Last”的两个按钮,它们的CommandName属性值分别为NextView和SwitchViewByID。第一个按钮很简单,仅仅是导航到下一个视图。
SwitchByViewID需要一个要切换到的ID,而CommandArgument属性则用于传递该参数。
CommandName=”SwitchViewByID”
CommandArgument=”vwLast”
除了导航按钮外,每个View对象还包含其他内容。这些内容包括标准的HTML元素和ASP.NET服务器控件。如同所见,这些服务器控件在View不可见时,也可以在应用程序事件中进行访问。
下一步是更新页面顶部的RadioButtonList。正如所见,SelectedIndex属性在活动视图改变时由MultiView1_ActiveViewChanged中的代码设置。当用户的操作改变SelectedIndex时,则触发SelectedIndexChanged事件,该事件的事件处理程序为rblView_SelectedIndexChanged。
OnSelectedIndexChanged=”rblView_SelectedIndexChanged”
示例5-4中的方法只有一行代码,该行代码设置MultiView控件的ActiveViewIndex属性为RadioButtonList的SelectedValue属性值。
示例5-4:RadioButtonList控件的SelectedIndexChanged事件处理程序
protected void rblView_SelectedIndexChanged(object sender, EventArgs e)
{
MultiView1.ActiveViewIndex = Convert.ToInt32(rblView.SelectedValue);
}
还有些代码包含在页面PreRender事件的事件处理程序中(在示例5-5中列出)。在这个事件处理程序中,使用当前活动视图的索引填充lblCurrentIndex。这些代码不能运行在Page_Load方法中,因为Page_Load将在标签更新前运行。
提示:关于完整的页面生命周期的介绍,可参见第6章。
示例5-5:页面的PreRender事件处理程序
protected void Page_PreRender(object sender, EventArgs e)
{
lblCurrentIndex.Text = MultiView1.ActiveViewIndex.ToString( );
}
了解了如何使用MultiView控件创建简单的分页应用程序,可以把它扩展为更复杂的应用。有时要在页面上放置一个Windows样式的向导,这时可以使用下面所讨论的Wizard控件。







