这样做需要了解 HTTP 重定向的工作原理。当您使用Response.Redirect() 时,您使用HTTP Status Code 302 发送响应(向发出请求的浏览器),它告诉浏览器下一步该去哪里。根据定义,浏览器将通过GET 请求进行此操作,即使原始请求是POST。
另一个选项是使用HTTP Status Code 307,它指定浏览器应该以与原始请求相同的方式发出重定向请求,但会提示用户一个安全警告。为此,您可以编写如下内容:
public void PageLoad(object sender, EventArgs e)
{
// Process the post on your side
Response.Status = "307 Temporary Redirect";
Response.AddHeader("Location", "http://example.com/page/to/post.to");
}
唉,与 Opera 和 FireFox 开发人员不同,IE 开发人员从未阅读过规范,即使是最新、最安全的 IE7 也会将 POST 请求从域 A 重定向到域 B,而不会出现任何警告或确认对话框! Safari 也以一种有趣的方式运行,虽然它不会引发确认对话框并执行重定向,但它会丢弃 POST 数据,有效地将 307 重定向更改为更常见的 302。
这应该会让生活更轻松。
您可以轻松地在 Web 应用程序中使用 Response.RedirectWithData(...) 方法。
Imports System.Web
Imports System.Runtime.CompilerServices
Module WebExtensions
<Extension()> _
Public Sub RedirectWithData(ByRef aThis As HttpResponse, ByVal aDestination As String, _
ByVal aData As NameValueCollection)
aThis.Clear()
Dim sb As StringBuilder = New StringBuilder()
sb.Append("<html>")
sb.AppendFormat("<body onload='document.forms[""form""].submit()'>")
sb.AppendFormat("<form name='form' action='{0}' method='post'>", aDestination)
For Each key As String In aData
sb.AppendFormat("<input type='hidden' name='{0}' value='{1}' />", key, aData(key))
Next
sb.Append("</form>")
sb.Append("</body>")
sb.Append("</html>")
aThis.Write(sb.ToString())
aThis.End()
End Sub
End Module
【讨论】:
【解决方案5】:
ASP.Net 3.5 中的新功能是 ASP 按钮的“PostBackUrl”属性。您可以将其设置为要直接发布到的页面的地址,当单击该按钮时,它不会像往常一样发回同一页面,而是发布到您指定的页面。便利。确保 UseSubmitBehavior 也设置为 TRUE。
【讨论】:
【解决方案6】:
你可以使用这个方法:
Response.Clear();
StringBuilder sb = new StringBuilder();
sb.Append("<html>");
sb.AppendFormat(@"<body onload='document.forms[""form""].submit()'>");
sb.AppendFormat("<form name='form' action='{0}' method='post'>",postbackUrl);
sb.AppendFormat("<input type='hidden' name='id' value='{0}'>", id);
// Other params go here
sb.Append("</form>");
sb.Append("</body>");
sb.Append("</html>");
Response.Write(sb.ToString());
Response.End();
在客户端从服务器获取所有 html 之后,立即发生事件 onload 触发表单提交并将所有数据发布到定义的 postbackUrl。