2009-02-26 12 views
10

Ho una pagina standard di aspx con cui ho bisogno di aggiungere un altro modulo HTML standard e di inviarlo a un'altra posizione (sito esterno), tuttavia ogni volta che premo il pulsante di invio la pagina sembra fare un post indietro piuttosto che utilizzare l'URL di azione sub-forms.Utilizzo di moduli HTML standard incorporati con ASP.NET

Un mock up di ciò che i rapporti di forma sono sotto. Nota nella distribuzione reale, il modulo farà parte di un'area di contenuto di un layout di pagina principale, pertanto il modulo deve essere inviato in modo indipendente dal modulo della pagina principale.

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

risposta

10

È un problema interessante. Idealmente si desidera solo il tag 1 modulo sulla pagina come altri utenti hanno menzionato. Potenzialmente potresti postare i dati tramite javascript senza avere 2 tag di forma.

Esempio preso da here, modificato per le vostre esigenze. Non sicuro al 100% se questo funzionerà per te, ma penso che sia così che dovrai affrontarlo.

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

Se JavaScript non è una valida opzione - è possibile utilizzare oggetto di HttpWebRequest .NET per creare la chiamata posta in codice dietro. Sarebbe simile a questa nel codice dietro (supponendo che il campo di testo è una casella di testo 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

Le soluzioni Javascript sono grandi se l'utente ha javascript abilitato ... – goldenratio

+0

Questo è furbo ... –

+0

aggiunto un metodo javascript-less pure – brendan

-1

ASP.NET vi permette di avere molteplici forme in un'unica pagina, ma solo uno può essere runat=server. Comunque non credo che tu possa annidare le forme.

Potrebbe essere necessario creare una nuova pagina principale, una senza un tag di modulo, in modo che il modulo funzioni solo su quella sola pagina. Questa non è una buona soluzione, a meno che tu non possa posizionare il modulo al di fuori del modulo delle pagine master e usare javascript per inviare il secondo modulo, ma non è molto meglio. Non c'è davvero una buona soluzione per quello che stai cercando di ottenere, e se così mi piacerebbe sentirlo. Non penso che tu possa fare una chiamata POST da un code-behind, vero? Sono sicuro che ci sia un modo. Ma questa è probabilmente l'unica soluzione: dal codice.

+0

È possibile eseguire un codice POST nel codice, vedere il mio esempio. – brendan

3

I moduli nidificati non sono possibili in HTML according to the W3C. È possibile ottenere il risultato desiderato utilizzando JavaScript o with jQuery come spiegato da Peter su un blog chiamato I miei pensieri.

0

ho avuto la stessa situazione di Ross - tranne che i miei tipi di ingresso erano tutti della varitey "nascosto"

La risposta di Cowgod mi ha fatto pensare a moduli annidati nella mia pagina .aspx. Ho finito per "annullare l'annidamento" del mio secondo modulo OUT del principale .aspx form() e lo ho inserito (insieme ai miei tag script js) appena sotto il body tag - ma prima del tag form .aspx principale

All'improvviso, tutto si stava sottomettendo come previsto. È un trucco?

6

C'è una soluzione molto carina per questo problema.

È possibile inserire un tag </form> prima del proprio <form> per chiudere il modulo asp.net che causa il problema. Non dimenticare di aggiungere un tag <form> dopo il modulo html. Potrebbe far sì che l'editor ti dia un'eccezione, ma non preoccuparti, funzionerà.

+0

hacky, ma questo ha funzionato. –

+0

concordato hacky, ma ha funzionato anche per me. – tking

+0

+1 per essere FACILE – Filip

7

Se si aggiunge un pulsante ASP.NET al modulo e si imposta la proprietà PostBackUrl sul sito esterno, tutti i dati del modulo verranno pubblicati su tale URL.

+0

Che l'ha fatto. Ho usato questa tecnica per pubblicare un modulo da un modulo HTML DNN. –

+0

Questa, per me, è di gran lunga la soluzione più semplice e ordinata. –

+0

Brillante! Questo non infrange nulla che io possa dire. Buon lavoro!! – JoJo

1

Nella mia esperienza, Appetere Web Solutions ha la soluzione migliore. Semplice ed elegante ... e non è un hack. Utilizza PostBackUrl.

Ho appena provato e tutto funziona come previsto. Non volevo usare Javascript perché non volevo includerlo nella mia Pagina Master per ogni pagina che lo utilizza.

Problemi correlati