2009-02-26 18 views
10

Tengo una página aspx estándar con la que necesito agregar otro formulario HTML estándar y enviarlo a otra ubicación (sitio externo), sin embargo cada vez que presiono el botón enviar la página parece hacer una publicación atrás en lugar de usar la url de acción de subformularios.Uso de formularios HTML estándar incorporados con ASP.NET

Un simulacro de las relaciones de forma que se muestran a continuación. Tenga en cuenta que, en la implementación real, el formulario formará parte de un área de contenido de un diseño de página maestro, por lo que el formulario debe enviarse independientemente del formulario de página maestra.

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

Respuesta

10

Es un problema interesante. Lo ideal es que solo desee la 1 etiqueta de formulario en la página como otros usuarios han mencionado. Potencialmente, podría publicar los datos a través de javascript sin tener 2 etiquetas de formulario.

Ejemplo tomado de here, modificado para sus necesidades. No estoy 100% seguro de si esto funcionará para ti, pero creo que así es como tendrás que abordarlo.

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

Si Javascript no es una opción viable - Puede utilizar el objeto de HttpWebRequest .NET para crear la llamada de su mensaje en código detrás. Sería algo como esto en el código subyacente (asumiendo que su campo de texto es un cuadro de texto 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

Las soluciones de Javascript son geniales si el usuario tiene javascript habilitado ... – goldenratio

+0

Eso es astuto ... –

+0

agregó un método sin Javascript también – brendan

-1

ASP.NET le permite tener múltiples formas en una página, pero sólo uno puede ser runat=server. Sin embargo, no creo que puedas anidar formularios en absoluto.

Es posible que tenga que crear una nueva página maestra, una sin una etiqueta de formulario, por lo que el formulario funcionará solo en esa página. Esta no es una buena solución, a menos que pueda colocar el formulario fuera del formulario de las páginas maestras y usar javascript para enviar el segundo formulario, pero eso no es mucho mejor. Realmente no hay una buena solución para lo que estás tratando de lograr, y si es así, me gustaría escucharlo. No creo que puedas hacer una llamada POST desde un código subyacente, ¿verdad? Estoy seguro de que hay alguna manera. Pero esa es probablemente la única solución: del código.

+0

Puede hacer una POST en el código de atrás, vea mi ejemplo. – brendan

3

Los formularios anidados no son posibles en HTML according to the W3C. Puede lograr su resultado deseado usando JavaScript o with jQuery como lo explicó Peter en un blog llamado My Thoughts.

0

que tenía la misma situación que Ross - excepto que mis tipos de entrada eran todos de la varitey "oculta"

La respuesta de Cowgod me hizo pensar sobre los formularios anidados dentro de mi página .aspx. Terminé "anulando" mi segunda forma FUERA del formato .aspx principal() y la coloqué (junto con mis etiquetas de script js) justo debajo del etiqueta del cuerpo - pero antes de la etiqueta principal del formulario .aspx

De repente, todo se estaba enviando como se suponía que debía hacerlo. ¿Es esto un truco?

6

Hay una muy buena solución complicada para este problema.

Puede insertar una etiqueta </form> antes de su <form> para cerrar el formulario asp.net que causa el problema. No olvides agregar una etiqueta <form> después de tu formulario html. Puede hacer que el editor le dé una excepción, pero no se preocupe, funcionará.

+0

hacky, pero esto funcionó. –

+0

acordó hacky, pero funcionó para mí también. – tking

+0

+1 por ser FÁCIL – Filip

7

Si agrega un botón ASP.NET al formulario y establece su propiedad PostBackUrl en el sitio externo, todos los datos del formulario se publicarán en esa URL.

+0

Eso lo hizo. Usé esta técnica para publicar un formulario desde un módulo DNN HTML. –

+0

Esto, para mí, es de lejos la solución más simple y más sencilla. –

+0

¡Brillante! Esto no rompe nada de lo que puedo decir. ¡¡Buen trabajo!! – JoJo

1

En mi experiencia, Appetere Web Solutions tiene la mejor solución. Simple y elegante ... y no es un truco. Use el PostBackUrl.

Lo probé y todo funciona como se esperaba. No quería usar Javascript porque no quería incluirlo en mi página maestra para cada página que lo usa.

Cuestiones relacionadas