2009-02-26 3 views
10

У меня есть стандартная страница aspx, с которой мне нужно добавить еще одну стандартную HTML-форму и отправить ее в другое место (внешний сайт), однако всякий раз, когда я нажимаю кнопку отправки на странице кажется, делает сообщение назад, а не использует URL-адрес действия подформ.Использование встроенных стандартных форм HTML с ASP.NET

Макет, на котором расположены формы. Обратите внимание, что в реальном развертывании форма будет частью области содержимого макета главной страницы, поэтому форма должна быть отправлена ​​независимо от формы главной страницы.

<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 тег формы на странице, как упомянули другие пользователи. Потенциально вы можете публиковать данные через 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> 

Если JavaScript не является жизнеспособным вариантом - вы можете использовать объект .Net в HttpWebRequest для создания поста вызова в коде позади. Посмотрел бы что-то вроде этого в коде позади (предполагается, что ваш текстовое поле является осина текстовое поле:.

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 enabled ... – goldenratio

+0

Это коварно ... –

+0

добавлен без javascript-метода, а также – brendan

-1

ASP.NET позволяет иметь несколько форм на одной странице, но только один может быть runat=server. Однако я не думаю, что вы можете вложить формы вообще.

Возможно, вам придется создать новую главную страницу, без тега формы, чтобы форма работала только на одной странице. Это нехорошее решение, если вы не можете разместить форму вне формы основных страниц и использовать javascript для отправки второй формы, но это вряд ли лучше. На самом деле нет хорошего решения для того, чего вы пытаетесь достичь, и если так, я бы хотел его услышать. Я не думаю, что вы можете сделать POST-вызов из кода, не так ли? Я уверен, что есть какой-то путь. Но это, наверное, единственное решение: от кода.

+0

Вы можете сделать POST в коде позади, см. Мой пример. – brendan

3

Вложенные формы в HTML according to the W3C невозможны. Вы можете достичь своего предполагаемого результата с помощью JavaScript или with jQuery, как объяснил Питер в блоге под названием My Thoughts.

0

У меня была такая же ситуация, как Росс - за исключением того, что мои типы входов были все «скрытые» varitey

Ответ Ковгода заставил меня задуматься о вложенных формах на моей странице .aspx. Я закончил «не вложенную» мою вторую форму OUT из основной формы .aspx() и поместил ее (вместе с моими тегами js script) прямо под тег тела - но до основного тега формы .aspx.

Внезапно все было подано так, как предполагалось. Это взлом?

6

Существует очень приятное сложное решение этой проблемы.

Вы можете вставить тег </form> перед своим <form>, чтобы закрыть форму asp.net, которая вызывает проблему. Не забудьте добавить тег <form> после вашей формы html. Это может привести к тому, что редактор предоставит вам исключение, но не беспокойтесь, это сработает.

+0

hacky, но это сработало. –

+0

согласился взломать, но работал и на меня. – tking

+0

+1 за то, что он EASY – Filip

7

Если вы добавите кнопку ASP.NET в форму и установите ее свойство PostBackUrl для внешнего сайта, то все данные формы будут отправлены на этот URL.

+0

Это сделало. Я использовал эту технику для отправки формы из модуля HTML DNN. –

+0

Это для меня, безусловно, самое простое и опрятное решение. –

+0

Блестящий! Это не нарушает ничего, что я могу сказать. Отличная работа!! – JoJo

1

По моему опыту, Appetere Web Solutions имеет лучшее решение. Простой и элегантный ... и это не взломать. Используйте PostBackUrl.

Я просто попробовал, и все работает так, как ожидалось. Я не хотел использовать Javascript, потому что я не хотел включать его в мою главную страницу для каждой страницы, которая его использует.

Смежные вопросы