2009-02-26 5 views
10

Ich habe eine Standard-ASPX-Seite, mit der ich ein anderes Standard-HTML-Formular hinzufügen und es an einem anderen Speicherort (externe Website) senden muss, aber immer wenn ich die Schaltfläche zum Absenden der Seite drücken scheint einen Post zurück zu machen, anstatt die Sub-Forms Aktion URL zu verwenden.Verwendung von eingebetteten Standard-HTML-Formularen mit ASP.NET

Ein Mock-up von dem, was die Form Beziehungen unten ist. Beachten Sie, dass das Formular in der tatsächlichen Bereitstellung Teil eines Inhaltsbereichs eines Musterseitenlayouts ist, sodass das Formular unabhängig vom Masterseitenformular gesendet werden muss.

<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> 

Antwort

10

Es ist ein interessantes Problem. Im Idealfall möchten Sie nur das 1 Formular-Tag auf der Seite, wie andere Benutzer erwähnt haben. Potentiell könnten Sie die Daten über Javascript posten, ohne 2 Formular-Tags zu haben.

Beispiel aus here, modifiziert für Ihre Bedürfnisse. Nicht 100% sicher, ob das für dich funktionieren wird, aber ich denke, dass du dich dem so nähern musst.

<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> 

Wenn Javascript kein gangbarer Weg ist - können Sie .Net HttpWebRequest Objekt verwenden, um die Post Aufruf in Code-behind zu erstellen. Würde hinter in dem Code wie folgt aussehen (Ihr Textfeld unter der Annahme ist eine ASP-Textbox.

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-Lösungen sind groß, wenn der Benutzer Javascript aktiviert hat ... – goldenratio

+0

Das ist crafty ... –

+0

hinzugefügt eine Javascript-less-Methode sowie – brendan

-1

ASP.NET können Sie mehrere Formulare auf einer Seite haben, aber nur einer kann runat=server sein. Ich glaube jedoch nicht, dass Sie überhaupt Formen nisten können.

Möglicherweise müssen Sie eine neue Musterseite erstellen, eine ohne ein Formular-Tag, damit das Formular nur auf dieser einen Seite funktioniert. Dies ist keine gute Lösung, es sei denn, Sie können das Formular außerhalb des Formulars der Masterseiten platzieren und JavaScript verwenden, um das zweite Formular zu senden, aber das ist kaum besser. Es gibt wirklich keine gute Lösung für das, was Sie erreichen wollen, und wenn ja, würde ich es gerne hören. Ich glaube nicht, dass Sie einen POST-Anruf von einem Code-Behind machen können, oder? Ich bin mir sicher, dass es einen Weg gibt. Aber das ist wahrscheinlich die einzige Lösung: vom Code.

+0

Sie können einen POST im Code hinter, siehe mein Beispiel. – brendan

3

Verschachtelte Formulare sind in HTML according to the W3C nicht möglich. Sie können Ihr beabsichtigtes Ergebnis mit JavaScript oder with jQuery erreichen, wie von Peter in einem Blog mit dem Titel My Thoughts erklärt.

0

ich die gleiche Situation wie Ross hatte - außer, dass meine Eingangstypen alle „versteckten“ varitey waren

Cowgods Antwort brachte mich dazu, über verschachtelte Formulare innerhalb meiner ASPX-Seite nachzudenken.Es endete damit, dass ich meine zweite Form OUT aus der ASPX-Hauptform() löste und sie (zusammen mit meinen js-Script-Tags) direkt unter der Body-Tag - aber vor dem Haupt-ASPX-Form-Tag

Plötzlich wurde alles wie es sollte eingereicht .. Ist das ein Hack?

6

Es gibt eine sehr knifflige Lösung für dieses Problem.

Sie können einen </form> Tag vor Ihrem <form> einfügen, um das asp.net Formular zu schließen, das das Problem verursacht. Vergessen Sie nicht, ein <form> Tag nach Ihrem HTML-Formular hinzuzufügen. Es kann dazu führen, dass der Editor Ihnen eine Ausnahme gibt, aber keine Sorge, es wird funktionieren.

+0

hacky, aber das hat funktioniert. –

+0

stimmte hacky zu, arbeitete aber auch für mich. – tking

+0

+1 für EASY – Filip

7

Wenn Sie dem Formular eine ASP.NET-Schaltfläche hinzufügen und die PostBackUrl-Eigenschaft auf die externe Website festlegen, werden alle Formulardaten an diese URL gesendet.

+0

Das hat es geschafft. Ich habe diese Technik verwendet, um ein Formular aus einem DNN-HTML-Modul zu veröffentlichen. –

+0

Dies ist für mich bei weitem die einfachste und sauberste Lösung. –

+0

Brilliant! Das bricht nichts, was ich sagen kann. Gut gemacht!! – JoJo

1

Nach meiner Erfahrung hat Appètere Web Solutions die beste Lösung. Einfach und elegant ... und es ist kein Hack. Verwenden Sie die PostBackUrl.

Ich habe es gerade versucht und alles funktioniert wie erwartet. Ich wollte Javascript nicht verwenden, weil ich es nicht für jede Seite, die es verwendet, in meine Masterseite aufnehmen sollte.

Verwandte Themen