2008-08-07 130 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