none
跨页投递,1个奇怪的问题?望有高手指点? RRS feed

  • 问题

  • 简诉: 看了《跟我一起学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>
            &nbsp;<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" />&nbsp;&nbsp;<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
    2009年8月17日 5:41

答案

全部回复

  • Response.Redirect("Cross.aspx"); 是页面转向,不是跨页投递。
    跨页投递是直接post那个页面Cross。而不是转向

    【孟子E章】
    • 已标记为答案 favesing 2009年8月17日 7:35
    2009年8月17日 5:56
    版主
  • 加了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章】
    2009年8月17日 5:56
    版主
  • ----第二个页面: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
    2009年8月17日 7:06
  • 不知道是不是我的理解出错。
    理解如下:
                在source.aspx页投递到cross.aspx,指将source.aspx信息以http post方式,发送到cross.aspox页面,对吗? 如果我理解没错,那source.aspx后台的转向代码是不会执行的啊, 那cross.aspx也应该能获取到 前一页(source.aspx)的信息啊。我这里是疑惑,并不是一定要在项目中这样使用。研究问题


    出错的可能我分析: 也许是在跨页投递时,会先回发到source.aspx页,然后转向到cross.aspx,那么就会有null异常。
                                而视频里是说,会直接post到cross.aspx页面。 你们可以调试一下。
      

    2009年8月17日 7:20
  • 自己实验结出正确就行了 不要固执理解那些视频 讲解  只是客观问题 也可能讲解失误

    你分析的问题 可以使用IsCrossPagePostBack属性 解决这个问题

    2009年8月17日 7:51
  • 说了也许你不相信。

    如果你按我上面的页面测试,你会发现,在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
    2009年8月17日 8:05