2009-02-26 6 views
10

Mam standardową stronę aspx, za pomocą której muszę dodać inny standardowy formularz HTML i przesłać go do innej lokalizacji (witryny zewnętrznej), jednak za każdym razem, gdy naciskam przycisk Wyślij, strona Wydaje się, że zamiast tego używa adresu URL podformatów, wysyłając komentarz zwrotny.Używanie osadzonych standardowych formularzy HTML z ASP.NET

Makieta tego, czym są relacje między formularzami. Uwaga w rzeczywistym wdrożeniu formularz będzie częścią obszaru treści układu strony wzorcowej, więc formularz musi zostać przesłany niezależnie od formularza strony wzorcowej.

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

Odpowiedz

10

To interesujący problem. Najlepiej, jeśli chcesz umieścić na stronie tylko jeden tag formularza, o którym wspominali inni użytkownicy. Potencjalnie możesz publikować dane za pośrednictwem javascript bez konieczności posiadania 2 znaczników formularza.

Przykład z here, zmodyfikowany dla Twoich potrzeb. Nie jestem w 100% pewien, czy to zadziała, ale myślę, że w ten sposób będziesz musiał się do niego zbliżyć.

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

Jeśli JavaScript nie jest realną opcją - można użyć obiektu .NET za HttpWebRequest do utworzenia połączenia pocztowego w kodzie tyłu. Mogłoby wyglądać podobnie jak ten w kodzie tyłu (zakładając, że pole tekstowe jest textbox 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

Rozwiązania JavaScript są świetne, jeśli użytkownik ma włączoną obsługę javascript ... – goldenratio

+0

To sprytne ... –

+0

dodała również metodę bez javascript – brendan

-1

ASP.NET pozwala mieć wiele formularzy na jednej stronie, ale tylko jedna może być runat=server. Jednak nie sądzę, że w ogóle można zagnieździć formularze.

Może być konieczne utworzenie nowej strony wzorcowej, bez etykiety formularza, aby formularz działał tylko na tej stronie. To nie jest dobre rozwiązanie, chyba że możesz umieścić formularz poza formularzem stron wzorcowych i użyć javascript do przesłania drugiego formularza, ale to wcale nie jest lepsze. Naprawdę nie ma dobrego rozwiązania dla tego, co próbujesz osiągnąć, a jeśli tak, to chciałbym to usłyszeć. Nie sądzę, że możesz wykonać wywołanie POST zza kodu, prawda? Jestem pewien, że jest jakiś sposób. Ale to prawdopodobnie jedyne rozwiązanie: od kodu.

+0

Możesz zrobić POST w kodzie, zobacz mój przykład. – brendan

3

Zagnieżdżone formularze nie są możliwe w HTML according to the W3C. Możesz osiągnąć zamierzony rezultat za pomocą JavaScript lub with jQuery, jak wyjaśnił Peter na blogu o nazwie My Thoughts.

0

miałem takiej samej sytuacji jak Ross - oprócz tego, że moje typy wejściowe były wszystkie „ukryte” varitey

Odpowiedź Cowgod pozwoliła mi pomyśleć o zagnieżdżonych formularzach na mojej stronie .aspx. Zakończyłem "un-nesting" moją drugą formę Z głównego formularza .aspx() i umieściłem (wraz z moimi znacznikami skryptu js) tuż pod body tag - ale przed głównym znacznikiem formularza .aspx

Nagle wszystko zostało zgłoszone tak, jak powinno ... Czy to jest hack?

6

Istnieje bardzo ładne podchwytliwe rozwiązanie tego problemu.

Możesz wstawić znacznik </form>, zanim <form> zamknie formularz asp.net, który powoduje problem. Nie zapomnij dodać znacznika <form> po formularzu HTML. Może to spowodować, że edytor da ci wyjątek, ale nie martw się, to zadziała.

+0

hacky, ale zadziałało. –

+0

zgodził się hacky, ale pracował również dla mnie. – tking

+0

+1 za bycie EASY – Filip

7

Po dodaniu przycisku ASP.NET do formularza i ustawieniu jego właściwości PostBackUrl na witrynę zewnętrzną, wszystkie dane formularza zostaną opublikowane w tym adresie URL.

+0

To się udało. Użyłem tej techniki, aby opublikować formularz z modułu HTML DNN. –

+0

To, jak dla mnie, jest zdecydowanie najprostszym i najmodniejszym rozwiązaniem. –

+0

Genialny! To nie psuje niczego, co mogę powiedzieć. Dobra robota!! – JoJo

1

Z mojego doświadczenia wynika, że ​​Appetere Web Solutions ma najlepsze rozwiązanie. Prosty i elegancki ... i to nie jest hack. Użyj PostBackUrl.

Po prostu wypróbowałem i wszystko działa zgodnie z oczekiwaniami. Nie chciałem używać Javascriptu, ponieważ nie chciałem umieszczać go na stronie wzorcowej dla każdej strony, która z niego korzysta.