2013年12月18日水曜日

【ASP.NET WebForms】別のページにポストするFormの作成

通常のhttp通信はブラウザからのRequestとサーバからのResponseで成り立っています。
ASP.NET WebForms では、自ページにポストし(PostBack)受け取ったデータを処理して、必要があれば別のページに遷移するというのが基本的な設計になっています。

別ページに直接ポストするのが結構困難で、runat="server"のformはページ内に1つしか記述できないとか、runat="server"でないformを記述したとしてもASP.NETが自動で吐き出すformと入れ子になってしまって上手く挙動しないなどのトラブルにみまわれます。

自サイト内だけで処理が完結するのであれば、PostBackを基本とした設計にするなどの解決方法も取れるかもしれませんが、他サイトとの連携などが絡むと何らかの手段を講じる必要があります。


1つにはSystem.Net.WebClientクラスやSystem.Net.WebRequestクラスを利用して他サイトと通信する方法があります。
この場合Responseがサーバに返ってきますので、サーバでその後の処理を行ってあげる必要があります。
URLも上図サーバAのURLとなります。


BtoBなんかでもありますが、データを直接他サーバにポストしてしまって、その後の処理も他サーバに預けてしまいたいという要件の場合があります。
ASP.NET MVC 等であれば、出力されるhtmlは細かくハンドリングできるので他サーバに直接ポストするhtmlを記述することができます。(セキュリティの問題などをクリアする必要はあるかと思いますが)
前述のようにASP.NET WebFormsでは自動で出力されるhtmlが邪魔で少しテクニックが必要です。

ここではjavascriptを使って直接ポストする方法をご紹介します。
以下のようなコードをボタンClickイベントなどに記述いたします。


        //javascriptで自動でポストされるhtmlフォームを作成する
        StringBuilder html = new StringBuilder();
        html.AppendLine("<html>");
        html.AppendLine(@"<body onload='document.forms[""formid""].submit()'>");
        html.AppendLine(String.Format("<form action='{0}' id='formid' method='POST'>", ServerBUrl));
        html.AppendLine(String.Format("<input name='name1' type='hidden' value='{0}' />", somethingValue));
        html.AppendLine("</form>");
        html.AppendLine("</body>");
        html.AppendLine("</html>");
        
        //作成したhtmlフォームをResponseとして返す
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.Write(html.ToString());
        HttpContext.Current.Response.End();


以上メモまで。

0 件のコメント:

コメントを投稿