Использование встроенных стандартных форм HTML с помощью ASP.NET

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

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

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

Ответ 1

Это интересная проблема. В идеале вам нужно только 1 тег формы на странице, как упомянули другие пользователи. Потенциально вы можете публиковать данные через javascript без двух тегов формы.

Пример, взятый из здесь, измененный для ваших нужд. Не 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, чтобы создать пост-вызов в коде позади. Посмотрите что-то подобное в коде ниже (если ваше текстовое поле представляет собой текстовое поле 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();
}

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

У меня была такая же ситуация, как у Росса - кроме того, что мои типы ввода были "скрытыми" varitey.

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

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

Ответ 7

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

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