【问题标题】:If one page executes a Response.Redirect() to a different web page, can the new page access values in asp.net controls from the original page?如果一个页面执行 Response.Redirect() 到不同的网页,新页面是否可以从原始页面访问 asp.net 控件中的值?
【发布时间】:2008-10-08 06:19:29
【问题描述】:

我有一个文本字符串值,我想在不使用查询字符串或会话/视图状态的情况下将其从一个网页持久保存到另一个网页。我一直在尝试让 ASP http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.hiddenfield.aspx">HiddenField 控件将信息从一个 Web 表单传递到 不同的形式。

我见过的所有隐藏域控件示例都是为相同的表单保留从客户端到服务器的往返行程。

表单是否可以从先前呈现的表单中访问 ASP 控件(及其值)?还是在第二个表单执行它的 OnLoad 方法时将初始表单简单地丢弃在内存中?

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    快速回答是否定的。正如其他人所指出的那样,您可以使用 Server.Transfer 然后您就可以使用 - 但是要谨慎使用。这是一个“服务器端重定向”,例如。

    您的用户在http://mysite.com/Page1.aspx 上,他们单击一个按钮,然后您执行 Server.Transfer("Page2.aspx")。 Page2.aspx 将在他们的浏览器中呈现,但 URL 仍将是 Page1.aspx,这可能会导致混乱和后退/前进导航混乱。

    我个人只会将 Server.Transfer 用作最后的手段——在网络世界中,跨页面共享数据通常意味着您需要使用存储机制; Cookie、QueryString、会话、数据库 - 任君选择。

    【讨论】:

      【解决方案2】:

      您无法使用 Response.Redirect 获取上一页字段。 你可以用cross page posting

      if (Page.PreviousPage != null)
      {
          TextBox SourceTextBox = 
              (TextBox)Page.PreviousPage.FindControl("TextBox1");
          if (SourceTextBox != null)
          {
              Label1.Text = SourceTextBox.Text;
          }
      }
      

      【讨论】:

      • 您也可以在使用 Server.Transfer() 方法后通过 Page.PreviousPage 属性引用上一页。
      • 使用这种方法,您假设您确定自己来自哪个页面
      【解决方案3】:

      如果两个页面位于同一个应用程序中,您可以使用 Server.Transfer:

      首页.aspx:

      protected void Page_Load(object sender, EventArgs e)
      {
          Server.Transfer("~/secondpage.aspx");
      }
      

      secondpage.aspx:

      protected void Page_Load(object sender, EventArgs e)
      {
          Page previousPage = (Page) HttpContext.Current.PreviousHandler;
          Label previousPageControl = (Label) previousPage.FindControl("theLabel");
          label.Text =previousPageControl.Text;
      }
      

      一个更好的解决方案是在您的第一页上实现一个接口,您可以在其中公开第二页所需值的属性。

      【讨论】:

        【解决方案4】:

        我假设 Response.Redirect() 发送一个 Location: HTTP 标头来进行重定向。

        由于 HTTP 是无状态的,我还假设这些变量是不可访问的。

        但是,有解决方案。

        1. 打印带有隐藏字段的表单,并使用 javascript 提交
        2. 在内部代码中重定向(加载需要手动访问的内容)
        3. 将数据存储在某个临时数据库表中,并传递一个唯一 ID

        但是,根据我的经验,我不明白您为什么需要这样做(除了在用户身份验证后重新提交表单 - 希望您应该能够使用方法 2 来实现

        【讨论】:

          【解决方案5】:

          请记住,Response.Redirect 指示浏览器向服务器发出另一个请求。就服务器而言,下一个请求与任何其他传入请求没有区别。它肯定不会以任何方式连接到以前的表单。

          您能否在会议中解释您对存储的厌恶,以便我们提出一些可行的替代方案?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-12-16
            • 2011-07-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多