整合:asp.net 中的跨页面(页面重定向)和跨页面提交问题

来源:互联网 发布:大数据辛金日元 编辑:程序博客网 时间:2024/05/29 18:35

(页面重定向)方法:Server.Transfer,Response.Redirect,Server.Execute的区别

在asp.net4.5中可以采用<a>元素.HyperLink控件,Response.Rediret(),Server.Execute()和Server.Transfer()方法实现页面重定向
其中Server.Transfer(ASP 3.0 以上) 和 Response.Redirect 在以前的 ASP 中就存在了,区别在于: 
1、Server.Transfer – (实际发生在服务器端,URL不变)
只能重定向到同一网站的不同页面
页面信息流的方向是:  
服务器->服务器->客户端
Server.Transfer("web2.aspx");   //页面转向(服务器上执行). 
服务器停止解析本页,保存此页转向前的数据后,再使页面转向到web2.aspx, 
并将转向
前数据加上web2.aspx页结果返回给浏览器.  
用于把处理的控制权从一个页面转移到另一个页面,
在转移的过程中,没有离开服务器,内部控件(如:request, session 等)的保存的信息不变,
因此,你能从页面 A 跳到页面 B 而不会丢失页面 A 中收集的用户提交信息。
参数使用:
Server.Transfer 方法一个参数——"preserveForm"。设置 True,比如:Server.Transfer("Web2.aspx", True), 
那么 Querystring 和任何 变量都会同时传递到你定位的页面。通常情况下,当试图传递 变量 或 query string 值时会发生错误。
非官方的解决办法是在你要传递的目的页面中设置 enableViewStateMac 属性为 True,然后再将其设置回 False。
2、Response.Redirect – (在服务器端执行,重定向实际发生在客户端,浏览器的 URL 栏不变)
传递数据时状态管理采用查询字符串形式
可重定向到同一网站的不同页面,也可重定向到其他网站的页面
页面信息流的方向是:  
服务器->客户端->服务器->客户端
当浏览器请求aspx页面时,碰到Redirect(url)方法, 
相当于告诉浏览器,你先需访问某页面,于是浏览器再向服务器发送一个到此页面的请求. 
将无法保存所有的内部控件数据,页面 A 跳转到页面 B,页面 B 将无法访问页面 A 中 变量提交的数据。
重定位是通过浏览器执行的,在服务器和浏览器之间会产生额外的往返过程。
优缺:
在网络状态较好的情况下,Redirect(url)方法效率最高
在网络状况不是很好的情况下,两次请求会大大的,降低应用程序的反应速度,甚至占用多余的带宽. 

3.Server.Execute方法-状态管理方式与button控件的跨页面提交方式相同
只能重定向到同一网站的不同页面
Server.Execute("web2.aspx"); 
服务器保存此页转向前的数据后,使页面转向到web2.aspx执行, 
返回本页继续执行.再将三者结果合并后返回给浏览器. 
以上都是服务器端页面转向所以浏览器不出现页更改记录(显示的地址不变). 
因此,如果用户刷新此页,也许会出现一些其它意外情况. 
此类页转向,可完成一些其它功能,比如访问到前一页面中的服务端控件.  

总结: 
在网络状态较好的情况下,Redirect(url)方法效率最高!! 
Server.Transfer方法和Server.Execute方法最灵活!! 
Server.Execute方法占用资源最多.

注意:

1、Response.Redirect()能够传递的数据以2KB为限。2、传递的数据超过2KB时,务必使用Server.Transfer()

ASP.NET页面之间传递值的几种方式

QueryString,session,cookies,application,server.Transfer,respose.redictor.

附:Page.Navigate (仅供了解)
Page.Navigate –
是 ASP.NET Beta 1 提供的功能 Page.Navigate 实现的功能和 Response.Redirect 差不多,它实际上包括三个步骤:
首先调用 Response.Redirect,其次依次卸载所有的控件,最后调用 Response.End。 特别要注意的是:在 .NET Beta 2 中,Microsoft 将不再包括 Page.Navigate 这个功能,大家应该现在就用 Response.Redirect 来代替 Page.Navigate,以节省将来升级时的时间。

跨页面提交

Button类型
(在源页面)将button类型控件的postbackurl属性值设置为目标页面的路径,在目标页面,需要在页面头部添加@previouspagetype(前页类型)指令,并设置virtualpath(虚拟路径)属性值为源页面路径
<%@ PrevioousPageType VirtualPath="地址" %>
目标页面上访问源页面中的数据的方法有两种
一是利用previouspage.findControl()方法访问源页面控件;
二是先在源页面上定义公共属性,再在目标页面上利用“previouspage.属性名”获取源页面中的数据。
使用server.execute()和server.transfer()方法时,目标页面也是通过previouspage访问源页面的。
区分是跨页面提交还是调用了server.execute()或server.transfer()方法?需要在目标页面的.CS文件中判断PreviousPage.IsCrossPagePostBack(交叉回发)的属性值
true为跨页面提交,false则为调用了server.execute()或server.transfer()方法
原创粉丝点击