none
跨页面传值问题。 RRS feed

  • 问题

  • 我使用Server.Transfer进行跨页面投递。
    在目标页注册了这样的代码:<%@ PreviousPageType VirtualPath="~/Default2.aspx" %>
    使用这样的方法我可以正确的在Default.aspx页面中传过来,然后正确的获取值。
    但是,如果我的目标页可能接受几个页面的投递咋办呢?也就是说可能有多个页面向这个页面投递。
    :<%@ PreviousPageType ... %>这样的代码只能写一条,只能指定一个前一个页面。这样页面除了指定页面以外的其他页面投递过来值时就会出问题。
    请问有没有什么办法可以让目标页面可以接受多个页面的投递?
    我不想使用Session之类的东西传值。 使用跨页面投递会有损网站性能吗?但网站访问量很大的时候。

    还有一个问题:有时候在cs页面中我可能要设定一些全局变量,但是如果如下声明方式:
    public partial class Default3 : System.Web.UI.Page
    {
        string str = string.Empty;
        protected void Page_Load(object sender, EventArgs e)
        {
        }
    }
    又因为每次服务器返回信息的时候这段代码都会被执行,那么str又重新被置空。这样问题就出来了,达不到我需要的全局变量的效果,我的做法是这个string类型设置成static,
    虽然这样可以达到我的目的。但是仿佛会出现一些问题,能告诉我可能存在哪些问题吗?我需要怎么做才能既达到了我需要的全局变量效果,又避免性能问题?
    郭鹏
    2009年6月2日 8:40

答案

  • 你好,你可以通下下面的方式实现

    ----------------------------------------------------------------------------------------------------------------
    -- 界面 1 HTML
    ----------------------------------------------------------------------------------------------------------------
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="X200906021710.aspx.cs" Inherits="ServerTransfer_X200906021710" %>
    <!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">
            <asp:Button ID="btnParent" runat="server" Text="第一个页的按钮" PostBackUrl="~/ServerTransfer/X200906021710Transfer.aspx" />
        </form>
    </body>
    </html>
    ----------------------------------------------------------------------------------------------------------------
    -- 界面 1 后台
    ----------------------------------------------------------------------------------------------------------------
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class ServerTransfer_X200906021710 : System.Web.UI.Page
    {
        public string fText = "Page:第一个页面";
    
        protected void Page_Load(object sender, EventArgs e)
        {
    
        }
    }
    ----------------------------------------------------------------------------------------------------------------
    -- 界面 2 HTML
    ----------------------------------------------------------------------------------------------------------------
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="X200906031349.aspx.cs" Inherits="ServerTransfer_X200906031349" %>
    <!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">
            <asp:Button ID="btnParent" runat="server" Text="第二个页的按钮" PostBackUrl="~/ServerTransfer/X200906021710Transfer.aspx" />
        </form>
    </body>
    </html>
    
    
    ----------------------------------------------------------------------------------------------------------------
    -- 界面 2 后台
    ----------------------------------------------------------------------------------------------------------------
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class ServerTransfer_X200906031349 : System.Web.UI.Page
    {
        public string fText = "Page:第二个页面";
    
        protected void Page_Load(object sender, EventArgs e)
        {
    
        }
    }
    
    
    ----------------------------------------------------------------------------------------------------------------
    -- 界面 3  HTML
    ----------------------------------------------------------------------------------------------------------------
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="X200906021710Transfer.aspx.cs" Inherits="ServerTransfer_X200906021710Transfer" %>
    <%@ Reference VirtualPath="~/ServerTransfer/X200906021710.aspx"%>
    <%@ Reference VirtualPath="~/ServerTransfer/X200906031349.aspx" %>
    <!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">
        </form>
    </body>
    </html>
    
    
    ----------------------------------------------------------------------------------------------------------------
    -- 界面 3  后台
    ----------------------------------------------------------------------------------------------------------------
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class ServerTransfer_X200906021710Transfer : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (PreviousPage != null && PreviousPage.IsCrossPagePostBack)
            {
                if (PreviousPage is ServerTransfer_X200906021710)
                {
                    ServerTransfer_X200906021710 fPage = (ServerTransfer_X200906021710)PreviousPage;
                    Button fButton = (Button)fPage.FindControl("btnParent");
                    Response.Write(string.Format("类的属性-fText:{0}<br />", fPage.fText));
                    Response.Write(string.Format("按钮属性-Text:{0}<br />", fButton.Text));
                }
                else if (PreviousPage is ServerTransfer_X200906031349)
                {
                    ServerTransfer_X200906031349 fPage = (ServerTransfer_X200906031349)PreviousPage;
                    Button fButton = (Button)fPage.FindControl("btnParent");
                    Response.Write(string.Format("类的属性-fText:{0}<br />", fPage.fText));
                    Response.Write(string.Format("按钮属性-Text:{0}<br />", fButton.Text));
                }
            }
        }
    }
    
    


    知识改变命运,奋斗成就人生!
    2009年6月3日 6:15
    版主
  • 如果只是需要传递几个简单的值并且不要求保密的话,用url参数就行;如果要求保密,或者是复杂数据类型,那就用session、global什么的呗,这些都不存在特定页面的问题。
    活着,在IT。
    2009年6月3日 8:29
  • 直接写到 Sesson 或者是cookie 里面不就行了
    在或者 写在 QueryString里面


    确实很萌
    2009年6月5日 8:22

全部回复

  • PostBackUrl 属性 就可以跨页了,为什么要使用 Server.Transfer呢?

    TextBox t = Page.PreviousPage.FindControl("TextBox1") as TextBox;
    Response.Write(t.Text);

     

    全局变量可以放在 Global里定义

    【孟子E章】
    2009年6月2日 9:24
    版主
  • 如果是Server.Transfer可以将值保存在HttpContext中


    努力着就不会放弃!.net技术交流群 33083877http://hi.baidu.com/1987raymond
    2009年6月2日 9:40
    版主
  • 有时候跳转不一定是依赖于实现了IButtonControl接口的控件啊,我需要以编程的方法进行跳转,而且我的目的是将第一个页面的类里面定义的值投递到另一个页面,在
    新的页面里面接收投递来的值需要这样的一句:<%@ PreviousPageType VirtualPath="~/Default2.aspx" %>。而一个页面只能有一条这样的语句。这样就等于说是定
    死了这个页面的前一个页面必须是这条语句里面定义的页面。当面临同一个页面接收多个页面的投递的时候,怎么办呢?

    郭鹏
    2009年6月2日 11:38
  • 对啊。使用这样的语句可以读出来 Page caller = (Page)Context.Handler;但是读出来的是一个Page。我如何能够获取到这个页面cs文件中定义的公有属性呢?
    郭鹏
    2009年6月2日 11:40
  • 每个页面都可能有在自己这个类中的全局变量。我不可能把它放到Global里面去吧。另外我还想知道如果我用static申明的话,对网站的性能会有影响吗?


    郭鹏
    2009年6月2日 11:44
  • 其实不必太在意一些很小的性能损失
    对于数据库以及查询等做一些优化可能就可以提高性能
    如果数据时全站都公用的话 且基本不变化用static 并一定不好
    努力着就不会放弃!.net技术交流群 33083877http://hi.baidu.com/1987raymond
    2009年6月2日 11:51
    版主
  • 每个页面都可能有在自己这个类中的全局变量。我不可能把它放到Global里面去吧。另外我还想知道如果我用static申明的话,对网站的性能会有影响吗?


    郭鹏
    不会影响性能
    【孟子E章】
    2009年6月3日 1:12
    版主
  • 如果有需要太多的静态变量,就是要改变程序思路了。

    2009年6月3日 3:04
  • 跨页面投提的问题,有办法解决吗?


    郭鹏
    2009年6月3日 3:11
  • 你好,你可以通下下面的方式实现

    ----------------------------------------------------------------------------------------------------------------
    -- 界面 1 HTML
    ----------------------------------------------------------------------------------------------------------------
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="X200906021710.aspx.cs" Inherits="ServerTransfer_X200906021710" %>
    <!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">
            <asp:Button ID="btnParent" runat="server" Text="第一个页的按钮" PostBackUrl="~/ServerTransfer/X200906021710Transfer.aspx" />
        </form>
    </body>
    </html>
    ----------------------------------------------------------------------------------------------------------------
    -- 界面 1 后台
    ----------------------------------------------------------------------------------------------------------------
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class ServerTransfer_X200906021710 : System.Web.UI.Page
    {
        public string fText = "Page:第一个页面";
    
        protected void Page_Load(object sender, EventArgs e)
        {
    
        }
    }
    ----------------------------------------------------------------------------------------------------------------
    -- 界面 2 HTML
    ----------------------------------------------------------------------------------------------------------------
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="X200906031349.aspx.cs" Inherits="ServerTransfer_X200906031349" %>
    <!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">
            <asp:Button ID="btnParent" runat="server" Text="第二个页的按钮" PostBackUrl="~/ServerTransfer/X200906021710Transfer.aspx" />
        </form>
    </body>
    </html>
    
    
    ----------------------------------------------------------------------------------------------------------------
    -- 界面 2 后台
    ----------------------------------------------------------------------------------------------------------------
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class ServerTransfer_X200906031349 : System.Web.UI.Page
    {
        public string fText = "Page:第二个页面";
    
        protected void Page_Load(object sender, EventArgs e)
        {
    
        }
    }
    
    
    ----------------------------------------------------------------------------------------------------------------
    -- 界面 3  HTML
    ----------------------------------------------------------------------------------------------------------------
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="X200906021710Transfer.aspx.cs" Inherits="ServerTransfer_X200906021710Transfer" %>
    <%@ Reference VirtualPath="~/ServerTransfer/X200906021710.aspx"%>
    <%@ Reference VirtualPath="~/ServerTransfer/X200906031349.aspx" %>
    <!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">
        </form>
    </body>
    </html>
    
    
    ----------------------------------------------------------------------------------------------------------------
    -- 界面 3  后台
    ----------------------------------------------------------------------------------------------------------------
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class ServerTransfer_X200906021710Transfer : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (PreviousPage != null && PreviousPage.IsCrossPagePostBack)
            {
                if (PreviousPage is ServerTransfer_X200906021710)
                {
                    ServerTransfer_X200906021710 fPage = (ServerTransfer_X200906021710)PreviousPage;
                    Button fButton = (Button)fPage.FindControl("btnParent");
                    Response.Write(string.Format("类的属性-fText:{0}<br />", fPage.fText));
                    Response.Write(string.Format("按钮属性-Text:{0}<br />", fButton.Text));
                }
                else if (PreviousPage is ServerTransfer_X200906031349)
                {
                    ServerTransfer_X200906031349 fPage = (ServerTransfer_X200906031349)PreviousPage;
                    Button fButton = (Button)fPage.FindControl("btnParent");
                    Response.Write(string.Format("类的属性-fText:{0}<br />", fPage.fText));
                    Response.Write(string.Format("按钮属性-Text:{0}<br />", fButton.Text));
                }
            }
        }
    }
    
    


    知识改变命运,奋斗成就人生!
    2009年6月3日 6:15
    版主
  • 如果只是需要传递几个简单的值并且不要求保密的话,用url参数就行;如果要求保密,或者是复杂数据类型,那就用session、global什么的呗,这些都不存在特定页面的问题。
    活着,在IT。
    2009年6月3日 8:29
  • 直接写到 Sesson 或者是cookie 里面不就行了
    在或者 写在 QueryString里面


    确实很萌
    2009年6月5日 8:22
  • 用点击按钮的时候  js 控制一下 连接的url参数   


    确实很萌
    2009年6月5日 8:25