2008-08-07 103 views
26

ASP.NET服务器端控件回发到自己的页面。这使得您想将用户重定向到外部页面的情况下,但出于某种原因需要发布到该页面(例如对于身份验证),这是一种痛苦。如何发布并重定向到来自ASP.Net的外部URL?

HttpWebRequest如果您不想重定向,并且在某些情况下JavaScript很好,但如果您确实需要服务器端代码来获取帖子的数据,可能会变得棘手。

那么你们如何发布到外部URL并将用户重定向到ASP.NET代码隐藏代码的结果呢?

回答

9

这是我今天解决了这个问题。我从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

1

如果您使用的是ASP.NET 2.0,则可以使用cross-page posting执行此操作。

编辑:我错过了这个事实,你问的外部页面。为此,我认为你需要让你的ASP.NET页面生成一个HTML表单,该表单的操作被设置为远程URL,并且方法被设置为POST。 (使用跨页面发布,这甚至可以是不带UI的不同页面,只有隐藏的表单元素。)然后添加一点javascript来在客户端收到回发结果后立即提交表单。

1

我已经通过呈现一个表单自动发布(使用JavaScript)到所需的远程URL - 收集您在Web表单的回发中发布的任何信息,然后构建远程发布表单的HTML并将其呈现回客户端。

我为此构建了一个实用程序类,它包含远程URL和表单的名称/值对的集合。

如果您拥有涉及的两个页面,跨页面发布将可用,但如果您需要发布到其他网站(例如PayPal),则不会发布。

2

我会做的形式后在后面的代码使用HttpWebRequest类。这里是一个很好的辅助类,让您开始:

http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx

从那里,你可以做一个Response.Redirect的,或者你需要根据岗位的结果来改变你的动作(如果有的话是一个错误,显示给用户或其他)。我认为你的问题已经有了答案,说实话 - 你认为这是一个帖子或重定向,实际上你可以通过你的代码完成它们。

4

我开始用这个例子从CodeProject

然后,而不是添加到页面上,我从saalon(以上)借用,做了回复于()。

1

我需要在同一个窗口中打开,与可能的帧处理问题从原来的页面,然后重定向到一个外部网站在后面的代码:

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