ASP.NET2.0中的一个功能在ASP.NET1.0/1.1很难实现,即进行跨页面的传送.
跨页面传送就是提交窗体,并把这个窗体和所有的控件值都传送给另一个页面.
在ASP.NET1.0/1.1中创建的页面都只传送给它自己,控件值都在这个页面实例中处理.用Page.IsPostBack区分页面的第一次请求和回送.但是开发人员仍希望把数据传送给另一个页面,并在该页面上处理第一个页面的控件值.ASP.NET2.0 实现了这个功能,并且操作过程非常简单.
要获得从前一个页面传送过来的控件值,有两种方法实现.
<1>创建该控件类型的实例,使用PreviousPage.FindControl("控件ID").
<2>创建该控件的属性.导入<%@PreviousPageType VirtualPath="Page1.aspx" %>
VirtualPath属性表示指向的页面.
<1>例子:使用Previous.FindControl 将 Page1.aspx 的控件值 传到Page2.aspx中
Page1.aspx
<body>
<form id="form1" runat="server">
<div>
在文本框输入值,点击按钮,将文本框TextBox值赋予标签Label<br />
<asp:TextBox ID="TextBox1" runat="server" ></asp:TextBox><br />
<asp:Button ID="Button1" runat="server" Text="提交到Page1.aspx" OnClick="Button1_Click" /><br />
<asp:Button ID="Button2" runat="server" Text="提交到Page2.aspx" PostBackUrl="~/Page2.aspx" /><br />
<br />
<asp:Label ID="Label1" runat="server"></asp:Label><br />
</div>
</form>
</body>
Page1.aspx.cs
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = "TextBox的值:"+TextBox1.Text;
}
Page2.aspx
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server"></asp:Label></div>
</form>
</body>
Page2.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
TextBox textBox1 = (TextBox)PreviousPage.FindControl("TextBox1");//Page1 要获得的控件ID
Label1.Text = "Page1.aspx的TextBox1的值:" + textBox1.Text;
}
<2>例子:使用创建控件属性的方法
Page1.aspx和Page.aspx.cs 并没有什么改变
Page2.aspx 添加指令
<%@PreviousPageType VirtualPath="Page1.aspx" %>
page2.aspx.cs 添加属性
public TextBox textbox1
{
get{
return TextBox1;
}
}
//为了处理Page1.aspx中的属性,必须把PreviousPage 属性强类型化为Page1.aspx.所以要使用PreviousPageType指令. 使用VirtualPath指向Page1.aspx后,就可以使用智能感应查看Page1.aspx的属性了.
注:有心人会想,如果在未使用Page1.aspx的按钮跳转到Page2.aspx.而且直接请求Page2.aspx怎么办?..答案是:报异常.可能有人会想到try...catch...来捕获不处理.其实 Microsoft 早定义了一个属性 -- IsCrossPagePostBack.此属性与IsPostBack 属性很类似,使用它可以检查请求是否来自Page1.aspx.
使用方法也和IsPostBack 一样,在PageLoad事件中
if(PreviousPage.IsCrossPagePostBack)
{
//....代码块
}