【问题标题】:Passing parameters using Server.Transfer but not using query string使用 Server.Transfer 传递参数但不使用查询字符串
【发布时间】:2025-11-21 12:15:02
【问题描述】:

我有一个注册表单,想将用户转移到成功页面,告诉他一封电子邮件已发送到他的电子邮件。我需要将他的邮件从注册页面转移到成功页面。

我找到了Server.Transfer,但我不知道如何发送参数。我不想使用查询字符串,因为我不喜欢在 URL 中透露信息。

这样做的正确方法是什么(如果可能)?

【问题讨论】:

    标签: c# asp.net server.transfer


    【解决方案1】:
    Server.Transfer("destination.aspx", true)
    

    您可能会看到,上面的代码包含将控件转移到的页面的名称和一个布尔值“True”,以指示在目标页面中保留当前表单状态。

    【讨论】:

      【解决方案2】:

      在您的登录页面中设置一个属性并在其中存储电子邮件。

      完成后,执行Server.Transfer("~/SuccessPage.aspx", true);

      在您重定向的另一页上,您应该检查类似的内容:

      if(this.PreviousPage != null) {
          ((LoginPageType)this.PreviousPage).MyEmailProperty;
      }
      

      【讨论】:

      • 谢谢,如果我不能使用 Sever.Transfer,这对于隐藏查询字符串很有用。
      【解决方案3】:

      当您使用服务器传输时,您只需将执行移动到不同的服务器处理程序,用户将看不到新的 url 或参数,因此可以安全地进行此传输。

      【讨论】:

      • 你是对的,我使用查询字符串制作了一个非常简单的过程。用户看不到发生了什么,完美。
      【解决方案4】:

      我宁愿建议你做不同的事情。

      当用户单击注册按钮时,您验证一切,然后从仍然当前页面发送电子邮件(因此您根本不需要将数据传输到另一个页面)。如果一切顺利,您只需重定向:

      Response.Redirect("/order/success.aspx");

      如果出现问题(验证错误、发送电子邮件导致异常),您仍然在正确的页面上进行重试。在大多数情况下,我根本不会使用 Server.Transfer。

      【讨论】:

      • 在某些情况下,这是一个很好的方法......毕竟也许是最好的。
      • 嗨,这正是我的代码目前的工作方式。只有当一切正常时,用户才会被发送到成功页面。
      【解决方案5】:

      您必须在某处保留该值。显而易见的选项是在 Session 对象中,或者在数据库中。

      【讨论】:

      • 会话状态是一个非常糟糕的存储位置。当我只想使用一次时,它会一直存在于内存中。
      • 同意,但我关于您必须在某处坚持的说法是正确的。最终那是查询字符串,它比 Session 更好,但你的问题倾向于不使用它。
      • 是的,我知道,我标记了你的问题。我不知道 server.transfer 保留了以前的 URL,所以查询字符串现在是可行的。
      【解决方案6】:

      对于这种用例。您可以使用 Context.Items 使用键保存数据,并使用您正在执行 Server.Transfer 的子页面中的相同键读取值。 Context.Items 对您来说是一种按请求范围内的缓存。
      Context.Items['DataKey'] = Data;
      Server.Transfer("~/AnyRouteRelativePath", true);

      【讨论】:

      • 谢谢,谢谢,谢谢——这在将它用于 global.asax Application_Error 中的自定义错误处理时也非常有效......我试图保留 XSS 的默认请求验证但显示带有错误的自定义错误屏幕 - 由于 4.5 中用于请求验证的事件模型,我尝试的大多数事情都会重新出错。这样我将它添加到缓存中并在错误页面中检索 - 完美。