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

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

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

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

Ответов (7)

Решение

Это интересная проблема. В идеале вам нужен только 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 не является жизнеспособным вариантом, вы можете использовать объект HttpWebRequest .Net для создания вызова post в коде позади. Будет выглядеть примерно так в коде позади (при условии, что ваше текстовое поле является текстовым полем 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();
}

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

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

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

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

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

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

Есть очень красивое и хитрое решение этой проблемы.

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

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

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

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