积极答复者
跨页投递,1个奇怪的问题?望有高手指点?

问题
-
简诉: 看了《跟我一起学2005 ASP.NET 内部改进(6)》,自己在测试的时候出现1个问题如下:
1,我首先创建2个页面 source.aspx, cross.aspx
----第一个页面:source.aspx---------------------------------------------------------------------------------
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Source.aspx.cs" Inherits="Source" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox></div>
<asp:Button ID="Button1" runat="server" Text="Submit to Cross Page" Width="188px" PostBackUrl="~/Cross.aspx" /><br />
<br />
<asp:Button ID="Button2" runat="server" Text="Transfer to Cross Page" Width="186px" /> <br />
<br />
<asp:Button ID="Button3" runat="server" Text="Source to Cross" Width="181px" /></form>
</body>
</html>
----第一个页面:source.aspx 的后台代码 ---------------------------------------------------------------------------------
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;public partial class Source : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if(IsPostBack)
{
Response.Redirect("Cross.aspx"); //在source.aspx页点击跨页投递时,按道理会直接投递到cross.aspx页面,而这句代码是不会执行
// 但是只要加了这句话,cross.aspx 的TextBox sourceTextBox = (TextBox)Page.PreviousPage.FindControl
// ("TextBox1"); 就会是异常,得到null 引用?????? 反之就是正常获取前一页。这里非常疑惑?????
//Server.Transfer("Cross.aspx");
}
}
}
----第二个页面:cross.aspx ---------------------------------------------------------------------------------
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Cross.aspx.cs" Inherits="Cross" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</div>
</form>
</body>
</html>
----第二个页面:cross.aspx 的后台代码 ---------------------------------------------------------------------------------
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;public partial class Cross : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//跨页传递来,找到前一页
TextBox sourceTextBox = (TextBox)Page.PreviousPage.FindControl("TextBox1");
if (sourceTextBox != null)
{
this.Label1.Text = sourceTextBox.Text;
}
}
}
还请高人指点,source.aspx页面的 Response.Redirect("Cross.aspx"); 代码根本就没执行,但为什么跨页投递时,Cross.aspx页会是null引用
而不加这句代码,一切都是正常的?????????????????????不知道是不是我的理解出错。
理解如下:
在source.aspx页投递到cross.aspx,指将source.aspx信息以http post方式,发送到cross.aspox页面,对吗? 如果我理解没错,那source.aspx后台的转向代码是不会执行的啊, 那cross.aspx也应该能获取到 前一页(source.aspx)的信息啊。我这里是疑惑,并不是一定要在项目中这样使用。研究问题
出错的可能我分析: 也许是在点击source.aspx跨页投递按钮时,会先回发到source.aspx页,然后转向到cross.aspx,那么就会有null异常。
而视频里是说,会直接post到cross.aspx页面。
1, 可以设1个断电到 转向代码处 调试,跨页投递时会先进入转向代码再进cross.aspx.2, 但如果你2个页面都设置断点,将不会进入source.aspx的断点处,很奇怪。
到底跨页投递时,是先回发到source.aspx页,还是直接post到cross.aspx页????????- 已编辑 favesing 2009年8月17日 8:01
答案
全部回复
-
加了PostBackUrl就可以了,cs里无需写代码转向两种做法Source<%@ 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">protected void Button2_Click(object sender, EventArgs e){Server.Transfer("Cross.aspx");}</script><html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"><title></title></head><body><form id="form1" runat="server"><div><asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br /><br /><br /><asp:Button ID="Button1" runat="server" PostBackUrl="Cross.aspx" Text="Submit to Cross Page" /><br /><br /><asp:Button ID="Button2" runat="server" Text="Transfer to Cross Page" Width="186px"OnClick="Button2_Click" /><br /><br /></div></form></body></html>Cross.aspx<%@ 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">protected void Page_Load(object sender, EventArgs e){if (Page.PreviousPage != null){TextBox t = PreviousPage.FindControl("TextBox1") as TextBox;Response.Write(t.Text);}}</script><html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"><title></title></head><body><form id="form1" runat="server"><div></div></form></body></html>
【孟子E章】 -
----第二个页面:cross.aspx ---------------------------------------------------------------------------------
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Cross.aspx.cs" Inherits="Cross" %>
<%@ PreviousPageType VirtualPath="~/source.aspx" %> 加上这个
另外参考http://blog.csdn.net/livening/archive/2009/07/19/4361040.aspx -
不知道是不是我的理解出错。
理解如下:
在source.aspx页投递到cross.aspx,指将source.aspx信息以http post方式,发送到cross.aspox页面,对吗? 如果我理解没错,那source.aspx后台的转向代码是不会执行的啊, 那cross.aspx也应该能获取到 前一页(source.aspx)的信息啊。我这里是疑惑,并不是一定要在项目中这样使用。研究问题
出错的可能我分析: 也许是在跨页投递时,会先回发到source.aspx页,然后转向到cross.aspx,那么就会有null异常。
而视频里是说,会直接post到cross.aspx页面。 你们可以调试一下。
-
说了也许你不相信。
如果你按我上面的页面测试,你会发现,在cross.aspx页的不能判断Page.PreviousPage 是否为null,再判断 IscrossPgePostBack 属性。
而是直接在输出窗口提示如下信息并返回1个空的页面:
在 System.Threading.ThreadAbortException 中第一次偶然出现的“mscorlib.dll”类型的异常
“System.Threading.ThreadAbortException”类型的异常在 mscorlib.dll 中发生,但未在用户代码中进行处理
在 System.Threading.ThreadAbortException 中第一次偶然出现的“System.Web.dll”类型的异常
“System.Threading.ThreadAbortException”类型的异常在 System.Web.dll 中发生,但未在用户代码中进行处理
在 System.NullReferenceException 中第一次偶然出现的“App_Web_ha8mqvyl.dll”类型的异常
虽然在跨页投递时,并不会执行source.aspx的 Response.Redirect("cross.aspx");代码, 但是只要取掉这句,就正常了。真是搞不懂,为什么加1句不执行的代码就不正常
除非跨页时,它先回发到本身的页面那就会出错,可是也不应该是上面这些错误提示啊? 不知道微软怎么整的。
(不好意思,我算个新手,以前做winform,现在自学一下web方面的东西。)- 已编辑 favesing 2009年8月17日 8:16