Использование встроенных стандартных HTML-форм с ASP.NET - PullRequest
10 голосов
/ 26 февраля 2009

У меня есть стандартная страница 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 ]

10 голосов
/ 26 февраля 2009

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

Пример взят из здесь , модифицирован для ваших нужд. Не уверен на 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();
}
7 голосов
/ 10 июня 2010

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

6 голосов
/ 08 августа 2009

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

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

3 голосов
/ 26 февраля 2009

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

1 голос
/ 14 февраля 2011

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

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

0 голосов
/ 25 марта 2009

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

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

Внезапно все подало, как и должно было. Это хак?

0 голосов
/ 26 февраля 2009

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

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

...