在ASP.ET 1.x
![](/icons/65878de.gif)
时候
![](/icons/65878dou.gif)
很多朋友可能需要进行跨页提交
![](/icons/65878de.gif)
处理
![](/icons/65878dou.gif)
也就是从页面A能够提交到页面B
![](/icons/65878dou.gif)
甚至区别
![](/icons/65878de.gif)
Control其目标处理页面也各不相同
![](/icons/65878dou2.gif)
尤其是从ASP/JSP/PHP转过来
![](/icons/65878de.gif)
开发人员
![](/icons/65878dou.gif)
可能更有这种需求
![](/icons/65878dou2.gif)
但很不幸
![](/icons/65878dou.gif)
在ASP.NET 1.x
![](/icons/65878de.gif)
时候
![](/icons/65878dou.gif)
处理这种跨页请求是十分丑陋
![](/icons/65878de.gif)
![](/icons/65878dou.gif)
需要非常多
![](/icons/65878de.gif)
“窍门技巧化”处理
![](/icons/65878dou2.gif)
在ASP.NET 2.0
![](/icons/65878de.gif)
时候
![](/icons/65878dou.gif)
对于跨页提交已经有了非常合理
![](/icons/65878de.gif)
解决方案
![](/icons/65878dou.gif)
以下就是
![](/icons/65878yi.gif)
个举例
![](/icons/65878dou2.gif)
SourcePage.aspx: 请注意Button1
![](/icons/65878de.gif)
PostBackUrl属性设置
<%@ Page Language="C#" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><script runat="server"> public
![](/icons/65878string.gif)
YourName { get {
![](/icons/65878return.gif)
this.TextBox1.Text; } }</script><html xmlns="http://www.w3.org/1999/xhtml" ><head runat="server"> <title>Untitled Page</title></head><body> <form id="form1" runat="server"> <div> <asp:Label ID="Label1" runat="server" Text="请输入您
![](/icons/65878de.gif)
姓名" Width="183px"></asp:Label> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> <asp:Button ID="Button1" runat="server" Text="提交" PostBackUrl="~/TargetPage.aspx" /></div> </form></body></html>
TargetPage.aspx:请注意PreviousPageType
![](/icons/65878de.gif)
属性设置
<%@ Page Language="C#" %><%@ PreviousPageType VirtualPath="~/SourcePage.aspx" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><script runat="server"> protected void Page_Load(object sender, EventArgs e) { this.Label1.Text = PreviousPage.YourName; }</script><html xmlns="http://www.w3.org/1999/xhtml" ><head runat="server"> <title>Untitled Page</title></head><body> <form id="form1" runat="server"> <div> <asp:Label ID="Label1" runat="server" ></asp:Label> </div> </form></body></html>
OK
![](/icons/65878dou.gif)
就通过这么简单
![](/icons/65878de.gif)
两个属性设置
![](/icons/65878dou.gif)
就可以非常方便
![](/icons/65878de.gif)
得到跨页提交
![](/icons/65878de.gif)
特性
![](/icons/65878dou2.gif)
读取源页面
![](/icons/65878de.gif)
信息
ASP.NET 2.0中
![](/icons/65878dou.gif)
ButtonControl控件有个新增
![](/icons/65878de.gif)
属性PostBackUrl
![](/icons/65878dou.gif)
用来设置需要提交
![](/icons/65878de.gif)
目标页面
![](/icons/65878dou2.gif)
![](/icons/65878yinwei.gif)
只要指定ButtonControl控件
![](/icons/65878de.gif)
PostBackUrl属性就可以提交到其它页面
![](/icons/65878dou.gif)
我们可以在页面中使用多个Control控件配置其PostBackUrl
![](/icons/65878de.gif)
属性
![](/icons/65878dou.gif)
提交到区别
![](/icons/65878de.gif)
页面
![](/icons/65878dou2.gif)
当然也可配置多个页面提交到同
![](/icons/65878yi.gif)
个页面
![](/icons/65878dou2.gif)
在跨页面提交的后
![](/icons/65878dou.gif)
通常我们需要从源页面中读取Control控件
![](/icons/65878de.gif)
信息(即由浏览器发送
![](/icons/65878de.gif)
信息)
![](/icons/65878dou.gif)
以及源页面
![](/icons/65878de.gif)
公共属性
![](/icons/65878dou2.gif)
读取Control控件
![](/icons/65878de.gif)
值
ASP.NET 2.0
![](/icons/65878de.gif)
Page类新增了
![](/icons/65878yi.gif)
个PreviousPage属性
![](/icons/65878dou2.gif)
顾名思义
![](/icons/65878dou.gif)
目标页面中
![](/icons/65878de.gif)
这个属性包含对源页面
![](/icons/65878de.gif)
引用
![](/icons/65878dou2.gif)
这样就可以在目标页面中通过PreviousPage属性访问源页面
![](/icons/65878de.gif)
信息
![](/icons/65878dou.gif)
我们
![](/icons/65878yi.gif)
般使用FindControl思路方法来查找源页面上
![](/icons/65878de.gif)
Control控件并读取这些Control控件
![](/icons/65878de.gif)
值
![](/icons/65878dou2.gif)
下面
![](/icons/65878de.gif)
代码介绍说明了该思路方法
![](/icons/65878de.gif)
使用:
![](/icons/65878if.gif)
(Page.PreviousPage != null){ TextBox txtName = (TextBox)Page.PreviousPage.FindControl("txtName");
![](/icons/65878if.gif)
(txtName != null) { Label1.Text = txtName.Text; }}
当我们想查找源页面中Control控件属于另
![](/icons/65878yi.gif)
个Control控件或者是模板的中
![](/icons/65878dou.gif)
就不能直接使用FindControl思路方法来读取它
![](/icons/65878dou.gif)
而是应该先获取对该容器
![](/icons/65878de.gif)
引用
![](/icons/65878dou.gif)
然后才能在该容器中查找要获取
![](/icons/65878de.gif)
Control控件
![](/icons/65878dou2.gif)
下面
![](/icons/65878de.gif)
例子中
![](/icons/65878dou.gif)
FirstPage.aspx页面中包含
![](/icons/65878yi.gif)
个PanelControl控件
![](/icons/65878dou.gif)
其ID为MainPanel
![](/icons/65878dou.gif)
它还包含ID为UserName
![](/icons/65878de.gif)
TextBoxControl控件
![](/icons/65878dou2.gif)
具体代码如下:
Panel MainPanel = (Panel)PreviousPage.FindControl("MainPanel");
![](/icons/65878if.gif)
(MainPanel != null){ TextBox UserName = (TextBox)MainPanel.FindControl("UserName");
![](/icons/65878if.gif)
(UserName != null) { Label1.Text = UserName.Text; }}
![](/icons/65878else.gif)
{ Label1.Text = "Cannot find UserName control.";}
读取源页面
![](/icons/65878de.gif)
公共属性
![](/icons/65878yi.gif)
旦在目标页面中获取了PreviousPage
![](/icons/65878de.gif)
引用
![](/icons/65878dou.gif)
就能访问源页面中公共Control控件
![](/icons/65878de.gif)
属性
![](/icons/65878dou.gif)
同样也可访问源页面中
![](/icons/65878de.gif)
公共属性
![](/icons/65878dou2.gif)
当然
![](/icons/65878dou.gif)
我们需要预先在源页面中公开需要被访问
![](/icons/65878de.gif)
属性方可在目标页面中访问
![](/icons/65878dou2.gif)
若要获取源页面
![](/icons/65878de.gif)
公共成员
![](/icons/65878dou.gif)
必须先获取对源页面
![](/icons/65878de.gif)
强类型引用
![](/icons/65878dou2.gif)
就像第
![](/icons/65878yi.gif)
个例子中
![](/icons/65878dou.gif)
我们可以使用@PreviousPageType指令来指定源页面
![](/icons/65878dou.gif)
它有两个属性分别为:VirtualPath和TypeName
![](/icons/65878dou2.gif)
使用VirtualPath属性指定来源页
![](/icons/65878de.gif)
虚拟路径(包含文件名)
![](/icons/65878dou.gif)
也可以使用TypeName指定源页面
![](/icons/65878de.gif)
属性
![](/icons/65878dou2.gif)
注意只能指定其中
![](/icons/65878de.gif)
![](/icons/65878yi.gif)
个
![](/icons/65878dou.gif)
两者都指定就会失效
![](/icons/65878dou2.gif)
如第
![](/icons/65878yi.gif)
个例子中所示:
<%@ PreviousPageType VirtualPath="~/FirstPage.aspx" %>
如果使用了@PreviousPageType指令
![](/icons/65878dou.gif)
目标页面中
![](/icons/65878de.gif)
PreviousPage 属性被强类型化为源页面
![](/icons/65878de.gif)
类
![](/icons/65878dou2.gif)
因此
![](/icons/65878dou.gif)
可以直接引用源页面
![](/icons/65878de.gif)
公共成员
![](/icons/65878dou2.gif)
要获取对源页面
![](/icons/65878de.gif)
强类型引用
![](/icons/65878de.gif)
另
![](/icons/65878yi.gif)
种思路方法是在目标页面中包含
![](/icons/65878yi.gif)
个@Reference 指令
![](/icons/65878dou.gif)
就像引用要在页面中使用
![](/icons/65878de.gif)
其它任何类型
![](/icons/65878yi.gif)
样
![](/icons/65878dou2.gif)
在这种情况下
![](/icons/65878dou.gif)
你可以在目标页面中获取目标页面
![](/icons/65878de.gif)
PreviousPage属性并将其强制转换为源页面
![](/icons/65878de.gif)
类型
![](/icons/65878dou.gif)
如下面
![](/icons/65878de.gif)
代码所示:
SourcePage_aspx sourcePage;sourcePage = (SourcePage_aspx) PreviousPage;Label1.Text = sourcePage.UserName;
读取源页面中
![](/icons/65878de.gif)
Form信息
如果源页面和目标页面属于同
![](/icons/65878yi.gif)
个 ASP.NET 应用
![](/icons/65878chengxu.gif)
![](/icons/65878dou.gif)
则目标页中
![](/icons/65878de.gif)
PreviousPage属性包含对源页面
![](/icons/65878de.gif)
引用
![](/icons/65878dou2.gif)
在没有使用@PreviousPageType指令
![](/icons/65878de.gif)
情况下
![](/icons/65878dou.gif)
目标页面中PreviousPage 属性类型化为Page
![](/icons/65878dou2.gif)
注意
![](/icons/65878dou.gif)
如果该页不是跨页发送
![](/icons/65878de.gif)
目标页面或者目标页面位于区别
![](/icons/65878de.gif)
应用
![](/icons/65878chengxu.gif)
中
![](/icons/65878dou.gif)
则不会
![](/icons/65878chushi.gif)
化PreviousPage属性
![](/icons/65878dou2.gif)
如果源页面和目标页面属于区别
![](/icons/65878de.gif)
应用
![](/icons/65878chengxu.gif)
![](/icons/65878dou.gif)
甚至是区别
![](/icons/65878de.gif)
网站WebSite
![](/icons/65878dou.gif)
那就无法直接获取源页面上Control控件
![](/icons/65878de.gif)
值
![](/icons/65878dou.gif)
但可以从Request.Form中读取发送
![](/icons/65878de.gif)
数据
![](/icons/65878dou2.gif)
还有
![](/icons/65878yi.gif)
个需要注意
![](/icons/65878de.gif)
问题
![](/icons/65878dou.gif)
![](/icons/65878yinwei.gif)
源页面
![](/icons/65878de.gif)
视图状态经过Hash处理
![](/icons/65878dou.gif)
所以不能从源页面中读取视图状态
![](/icons/65878dou2.gif)
如果要在源页面中存储值并让这些值可供其他应用
![](/icons/65878chengxu.gif)
中
![](/icons/65878de.gif)
目标页使用
![](/icons/65878dou.gif)
可以将这些值作为
![](/icons/65878zifu.gif)
串存储在源页面
![](/icons/65878de.gif)
隐藏字段中
![](/icons/65878dou.gif)
并在目标页面中通过 Request.Form 来访问它们
![](/icons/65878dou2.gif)
判断是否为跨页面提交
跨页面提交
![](/icons/65878de.gif)
时候
![](/icons/65878dou.gif)
源页面Control控件
![](/icons/65878de.gif)
内容被提交到目标页面
![](/icons/65878dou.gif)
然后浏览器执行POST操作(注意
![](/icons/65878dou.gif)
不是GET)
![](/icons/65878dou2.gif)
在ASP.NET 1.x中由于页面都是自己提交给自己
![](/icons/65878dou.gif)
可以通过Page
![](/icons/65878de.gif)
IsPostBack属性来判断是否为页面提交
![](/icons/65878dou2.gif)
但是在跨页面提交
![](/icons/65878de.gif)
时候
![](/icons/65878dou.gif)
目标页面
![](/icons/65878de.gif)
IsPostBack属性为false
![](/icons/65878dou2.gif)
如果要判断是否为跨页面提交
![](/icons/65878dou.gif)
可以对目标页面
![](/icons/65878de.gif)
PreviousPage属性返回
![](/icons/65878de.gif)
引用页面
![](/icons/65878de.gif)
IsCrossPagePostBack属性进行判断
![](/icons/65878dou.gif)
如下面
![](/icons/65878de.gif)
代码所示:
![](/icons/65878if.gif)
(PreviousPage != null){
![](/icons/65878if.gif)
(PreviousPage.IsCrossPagePostBack
![](/icons/65878dd.gif)
true) { Label1.Text = "跨页面提交"; }}
![](/icons/65878else.gif)
{ Label1.Text = "非跨页面提交";}