在ASP.NET中使用嵌入式标准HTML表单

在ASP.NET中使用嵌入式标准HTML表单,asp.net,html,forms,Asp.net,Html,Forms,我有一个标准的aspx页面,我需要在其中添加另一个标准HTML表单,并将其提交到另一个位置(外部站点),但是每当我按下提交按钮时,页面似乎会进行回发,而不是使用子表单操作url 下面是表单关系的模型。注意:在实际部署中,表单将是母版页布局的内容区域的一部分,因此表单需要独立于母版页表单提交 <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <

我有一个标准的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>

无标题页

ASP.NET允许您在一个页面上有多个表单,但只有一个表单可以
runat=server
。然而,我认为你根本不能嵌套表单


您可能需要创建一个新的母版页,该母版页上没有表单标记,因此表单只能在该页上工作。这不是一个好的解决方案,除非您可以将表单放在母版页表单之外,并使用javascript提交第二个表单,但这几乎不是更好的解决方案。对于你想要达到的目标,真的没有好的解决方案,如果是这样,我想听听。我不认为你能从一个暗箱操作人员那里打电话,对吗?我肯定有办法。但这可能是唯一的解决方案:从代码。嵌套表单在HTML中是不可能的。您可以使用JavaScript或Peter在一个名为My Thinks的博客上解释的那样实现预期的结果。

这是一个有趣的问题。理想情况下,正如其他用户所提到的,您只希望页面上有1个表单标记。您可以通过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>

我和罗斯的情况一样,只是我的输入类型都是“隐藏”变量

Cowgod的回答让我想到了.aspx页面中的嵌套表单。最后,我将我的第二个表单从main.aspx表单()中“取消嵌套”,并将它(连同我的js脚本标记)放在body标记的正下方,但在main.aspx表单标记的前面


突然间,一切都如预期的那样屈服了。这是黑客攻击吗?

对于这个问题有一个非常好的棘手的解决方案


您可以在
之前插入
标记,以关闭导致问题的asp.net表单。不要忘记在html表单后添加
标记。这可能会导致编辑器给您一个异常,但不用担心,它会工作。

如果您在表单中添加ASP.NET按钮,并将其PostBackUrl属性设置为外部站点,则所有表单数据都将发布到该URL。

根据我的经验,Appetere Web Solutions有最好的解决方案。简单而优雅…而且它不是一个黑客。使用PostBackUrl


我刚试过,一切都正常。我不想使用Javascript,因为我不想在使用Javascript的每个页面的母版页中都包含它。

还添加了一个无Javascript的方法啊,很好。我知道有一种方法可以通过代码隐藏来实现。谢谢,效果很好。谢谢你@如果用户使用Enter键提交表单,brendan会执行此操作?就是这样。我使用这种技术从DNN HTML模块发布表单。对我来说,这是迄今为止最简单、最整洁的解决方案。太棒了!这并没有破坏我所能说的任何东西。干得好很好地打破了IE8中的布局也打破了IE9中的布局,这不是一个好的通用解决方案。
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();
}