2009-02-26 48 views
10

標準のHTMLフォームを追加して別の場所(外部サイト)に送信する必要がある標準のaspxページがありますが、送信ボタンを押すたびにサブフォームのアクションURLを使用するのではなく、ポストバックを行うようです。ASP.NETで埋め込み標準HTMLフォームを使用する

下のフォームの関係を模擬します。実際の展開では、フォームはマスターページレイアウトのコンテンツエリアの一部になるため、フォームはマスターページフォームから独立して送信する必要があります。

<html xmlns="http://www.w3.org/1999/xhtml" > 
     <head runat="server"> 
      <title>Untitled Page</title> 
     </head> 
     <body> 
      <form id="form1" runat="server"> 
      <div> 
       <form id="subscribe_form" method="post" action="https://someothersite.com" name="em_subscribe_form" > 
        <input type="text" id="field1" name="field1" /> 
        <input id="submitsubform" type="submit" value="Submit" /> 
       </form> 
      </div> 
      </form> 
     </body> 
    </html> 

答えて

10

これは興味深い問題です。理想的には、他のユーザーが言及したように、ページ上の1つのフォームタグのみが必要です。あなたは2つのフォームタグを持たずにJavaScriptを使ってデータを投稿することができます。

例はhereから取られ、必要に応じて変更されています。これがあなたのために働くかどうかは100%ではありませんが、私はこれがあなたがそれにアプローチしなければならない方法だと思います。

<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
<title>Untitled Page</title> 
<script type="text/javascript"> 

function postdata() 
{ 
    var fieldValue = document.getElementById("field1").value; 
    postwith("http://someothersite.com",{field1:fieldValue}); 
} 

function postwith (to,p) { 
    var myForm = document.createElement("form"); 
    myForm.method="post" ; 
    myForm.action = to ; 
    for (var k in p) { 
    var myInput = document.createElement("input") ; 
    myInput.setAttribute("name", k) ; 
    myInput.setAttribute("value", p[k]); 
    myForm.appendChild(myInput) ; 
    } 
    document.body.appendChild(myForm) ; 
    myForm.submit() ; 
    document.body.removeChild(myForm) ; 
} 

</script> 
</head> 
<body> 
<form id="form1" runat="server"> 
<div> 
      <div> 
       <input type="text" id="field1" name="field1" /> 
       <asp:Button ID="btnSubmitSubscribe" runat="server" Text="Submit" OnClientClick="postdata(); return false;" /> 

     </div> 

</div> 
</form> 
</body> 
</html> 

ジャバスクリプトが実行可能な選択肢ではない場合 - あなたは、コードの後ろにポストコールを作成するために、ネットのHttpWebRequestのオブジェクトを使用することができます。あなたのテキストフィールドには、ASPのテキストボックスであると仮定すると(後ろのコードに次のようになります。

private void OnSubscribeClick(object sender, System.EventArgs e) 
{ 
string field1 = Field1.Text; 


ASCIIEncoding encoding=new ASCIIEncoding(); 
string postData="field1="+field1 ; 
byte[] data = encoding.GetBytes(postData); 

// Prepare web request... 
HttpWebRequest myRequest = 
    (HttpWebRequest)WebRequest.Create("http://someotherwebsite/"); 
myRequest.Method = "POST"; 
myRequest.ContentType="application/x-www-form-urlencoded"; 
myRequest.ContentLength = data.Length; 
Stream newStream=myRequest.GetRequestStream(); 
// Send the data. 
newStream.Write(data,0,data.Length); 
newStream.Close(); 
} 
+0

ユーザーがJavaScriptを有効にしている場合、JavaScriptのソリューションは素晴らしいです... – goldenratio

+0

これは狡猾です... –

+0

はjavascript-lessメソッドも追加されました – brendan

-1

ASP.NETでは、1つのページに複数のフォームを含めることができますが、1つだけをrunat=serverにすることができます。しかし、私はフォームをまったく入れ子にすることはできないと思います。

新しいマスターページを作成しなければならない場合があります。フォームにはフォームタグがなく、フォームはその1ページのみで動作します。マスターページのフォームの外にフォームを配置し、javascriptを使用して2番目のフォームを送信することができない限り、これは良い解決策ではありませんが、それほど優れていません。あなたが達成しようとしていることに対して本当に良い解決策はありません。もしそうなら、私はそれを聞きたいと思います。コードビハインドからPOSTコールを行うことはできないと思いますか?何らかの方法があると確信しています。しかしそれはたぶんコードからの唯一の解決策です。

+0

コードはPOSTで実行できます。私の例を参照してください。 – brendan

3

ネストフォームは、HTML according to the W3Cでは使用できません。あなたは、JavaScriptまたはwith jQueryを使用して目的の結果を達成することができます.PeterがMy Thoughtsというブログで説明しました。

0

私はロスと同じような状況があった - 私の入力タイプは「隠された」variteyのすべてだったことを除いて

Cowgodの答えでは、私の.aspxページ内でネストされたフォームについて考えるようになりました。私は、メインの.aspxフォーム()の2番目のフォームを "un-nesting"して(jsスクリプトタグと共に) bodyタグ - ただし、メインの.aspxフォームタグの前。

突然、すべてが提出していたものです。これはハックですか?

6

この問題には非常に面倒な解決策があります。

<form>の前に</form>タグを挿入して、問題の原因となるasp.netフォームを閉じることができます。あなたのHTMLフォームの後に<form>タグを追加することを忘れないでください。それはエディタにあなたに例外を与えるかもしれませんが、心配しなくても動作します。

+0

ハッキーだが、これはうまくいった。 –

+0

はハッキーに同意したが、私のために働いた。 – tking

+0

+1するのは簡単です。 – Filip

7

フォームにASP.NETボタンを追加し、PostBackUrlプロパティを外部サイトに設定すると、すべてのフォームデータがそのURLに送信されます。

+0

それはそれをしました。このテクニックを使用して、DNN HTMLモジュールからフォームを投稿しました。 –

+0

これは、私にとっては、はるかに簡単で最善の解決策です。 –

+0

Brilliant!これは私が言うことができる何かを壊すことはありません。よくやった!! – JoJo

1

私の経験では、Appetere Web Solutionsが最適なソリューションを提供しています。シンプルでエレガントな...それはハックではありません。 PostBackUrlを使用します。

私はそれを試してみましたが、すべて正常に動作します。 Javascriptを使用したくない理由は、Javascriptを使用するすべてのページでマスターページに含めたくないからです。