2008-08-07 33 views
26

ASP.NETサーバー側のコントロールが、自分のページにポストバックします。これにより、ユーザーを外部ページにリダイレクトしたいが、なんらかの理由(認証などのために)でそのページに投稿する必要がある場合があります。ASP.Netから外部URLに投稿してリダイレクトするにはどうすればよいですか?

は、リダイレクトしたくない場合や、JavaScriptがうまくいかない場合はうまくいきますが、実際には投稿用にデータを取得するためにサーバーサイドコードが必要な場合は面倒なことがあります。

どのように外部URLに投稿し、ASP.NETコードビハインドコードの結果にユーザーをリダイレクトするのですか?

答えて

9

ここで私はこの問題を今日解決しました。私はC#コーナーのthis articleから始めましたが、この例は技術的には聞こえませんが、少し不完全です。彼が言ったことはすべて正しいと思っていましたが、私はこれをまとめていくつかの外部サイトを打つ必要がありました。

ユーザーが技術的にフォームを提出していないとは限りません。彼らは私たちのサポートセンターに行くためにリンクをクリックしていましたが、http postに記録するにはサポートセンターのサイトに行ってください。

次いで、この溶液を適切なURLにフォームを提出する

<body onload=""> 

方法でJavaScriptのビットを使用して、フォームのデータを書き込むためにHttpContext.Current.Response.Write()を使用することを含みます。サポートセンターのリンクをユーザーがクリックすると、次のような方法が応答を書いて、ユーザーをリダイレクトするために呼び出され

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ページのgenを、リモートURLにアクションが設定され、メソッドがPOSTに設定されているHTMLフォームにする必要があると思います。 (ページ間のポスティングを使用すると、これはUIのない​​別のページでも、非表示のフォーム要素であっても可能です)。

1

これは、JavaScriptを使用して自動的に(JavaScriptを使用して)目的のリモートURLにフォームをレンダリングすることで行いました。ウェブフォームのポストバックで投稿に必要な情報を収集し、リモート投稿フォームそれをクライアントに返します。

リモートURLとフォームの名前と値のペアのコレクションを含むユーティリティクラスを作成しました。

両方のページを所有している場合はクロスページの投稿が機能しますが、別のサイト(たとえばPayPalなど)に投稿する必要がある場合は表示されません。

2

私は、HttpWebRequestのクラスを使用しての背後にあるコード内のフォームのポストを行うだろう。ここにあなたを始めるための良いヘルパークラスである:

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

そこから、あなただけのResponse.Redirectを行うことができ、または、おそらくあなたは、もしそこ(ポストの結果に基づいて、あなたの行動を変えることが必要エラーだった、それをユーザーに表示するなど)。私はあなたがすでに正直であることをあなたの質問の答えを持っていたと思う - 実際にはあなたのコードの背後にあるそれらの両方から行うことができますポストまたはリダイレクトだと思うように聞こえる。

4

私はその後CodeProject

からこの例を開始した代わりのページに追加して、私は)((上記)saalonから借りてのResponse.Writeをしました。

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 
関連する問題