如何发布并重定向到来自ASP.Net的外部URL?
ASP.NET服务器端控件回发到自己的页面。这使得您想将用户重定向到外部页面的情况下,但出于某种原因需要发布到该页面(例如对于身份验证),这是一种痛苦。如何发布并重定向到来自ASP.Net的外部URL?
HttpWebRequest
如果您不想重定向,并且在某些情况下JavaScript很好,但如果您确实需要服务器端代码来获取帖子的数据,可能会变得棘手。
那么你们如何发布到外部URL并将用户重定向到ASP.NET代码隐藏代码的结果呢?
这是我今天解决了这个问题。我从C#角上的this article开始,但发现这个例子 - 尽管技术上合理 - 有点不完整。他所说的一切都是正确的,但我需要打到几个外部站点,将它们拼凑在一起,才能像我想要的那样工作。
这并没有帮助用户在技术上没有提交表格;他们点击了一个链接转到我们的支持中心,但是他们必须在支持中心的网站上登录他们的http帖子。
该解决方案包括使用HttpContext.Current.Response.Write()写的数据的形式,然后使用位的Javascript对
<body onload="">
方法的形式提交给适当的URL。
当支持中心链接,用户点击,下面的方法被调用写响应和用户重定向:
public static void PassthroughAuthentication()
{
System.Web.HttpContext.Current.Response.Write("<body
onload=document.forms[0].submit();window.location=\"Home.aspx\";>");
System.Web.HttpContext.Current.Response.Write("<form name=\"Form\"
target=_blank method=post
action=\"https://external-url.com/security.asp\">");
System.Web.HttpContext.Current.Response.Write(string.Format("<input
type=hidden name=\"cFName\" value=\"{0}\">", "Username"));
System.Web.HttpContext.Current.Response.Write("</form>");
System.Web.HttpContext.Current.Response.Write("</body>");
}
这种方法的关键是在Javascript中的那个onload事件位,其中,当页面正文加载时,提交表单,然后将用户重定向回我自己的主页。这个问题的原因是我在新窗口中启动外部网站,但不希望用户刷新页面时重新提交隐藏窗体。此外,隐藏的表单将页面向下推动几个像素,这让我神经紧张。
我会对任何人都有这个清洁的想法非常感兴趣。
埃里克Sipple
如果您使用的是ASP.NET 2.0,则可以使用cross-page posting执行此操作。
编辑:我错过了这个事实,你问的外部页面。为此,我认为你需要让你的ASP.NET页面生成一个HTML表单,该表单的操作被设置为远程URL,并且方法被设置为POST。 (使用跨页面发布,这甚至可以是不带UI的不同页面,只有隐藏的表单元素。)然后添加一点javascript来在客户端收到回发结果后立即提交表单。
我已经通过呈现一个表单自动发布(使用JavaScript)到所需的远程URL - 收集您在Web表单的回发中发布的任何信息,然后构建远程发布表单的HTML并将其呈现回客户端。
我为此构建了一个实用程序类,它包含远程URL和表单的名称/值对的集合。
如果您拥有涉及的两个页面,跨页面发布将可用,但如果您需要发布到其他网站(例如PayPal),则不会发布。
我会做的形式后在后面的代码使用HttpWebRequest类。这里是一个很好的辅助类,让您开始:
http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx
从那里,你可以做一个Response.Redirect的,或者你需要根据岗位的结果来改变你的动作(如果有的话是一个错误,显示给用户或其他)。我认为你的问题已经有了答案,说实话 - 你认为这是一个帖子或重定向,实际上你可以通过你的代码完成它们。
我需要在同一个窗口中打开,与可能的帧处理问题从原来的页面,然后重定向到一个外部网站在后面的代码:
Private Sub ExternalRedirector(ByVal externalUrl As String)
Dim clientRedirectName As String = "ClientExternalRedirect"
Dim externalRedirectJS As New StringBuilder()
If Not String.IsNullOrEmpty(externalUrl) Then
If Not Page.ClientScript.IsStartupScriptRegistered(clientRedirectName) Then
externalRedirectJS.Append("function CheckWindow() {")
externalRedirectJS.Append(" if (window.top != window) {")
externalRedirectJS.Append(" window.top.location = '")
externalRedirectJS.Append(externalUrl)
externalRedirectJS.Append("';")
externalRedirectJS.Append(" return false;")
externalRedirectJS.Append(" }")
externalRedirectJS.Append(" else {")
externalRedirectJS.Append(" window.location = '")
externalRedirectJS.Append(externalUrl)
externalRedirectJS.Append("';")
externalRedirectJS.Append(" }")
externalRedirectJS.Append("}")
externalRedirectJS.Append("CheckWindow();")
Page.ClientScript.RegisterStartupScript(Page.GetType(), clientRedirectName, externalRedirectJS.ToString(), True)
End If
End If
End Sub