【问题标题】:Using embedded standard HTML forms with ASP.NET在 ASP.NET 中使用嵌入式标准 HTML 表单
【发布时间】:2010-10-09 23:50:11
【问题描述】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 在 iE8 中打破布局的好工作
    • 在 IE9 中也破坏了布局,这不是一个好的通用解决方案。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 做到了。我使用这种技术从 DNN HTML 模块发布表单。
      • 对我来说,这是迄今为止最简单、最整洁的解决方案。
      • 太棒了!这不会破坏我能说的任何东西。干得好!
      【解决方案4】:

      我的情况和罗斯一样——除了我的输入类型都是“隐藏”的类型。

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

      突然间,一切都按预期提交了。这是黑客吗?

      【讨论】:

        【解决方案5】:

        这是一个有趣的问题。理想情况下,您只需要其他用户提到的页面上的 1 个表单标签。您可能可以通过 javascript 发布数据而无需 2 个表单标签。

        示例取自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 对象在后面的代码中创建 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();
        }
        

        【讨论】:

        • 还添加了一个无 javascript 方法
        • 啊,很好。我知道有一种方法可以从代码隐藏中做到这一点。谢谢。
        • 效果很好。谢谢!
        • @brendan 如果用户使用 Enter 键提交表单,这是否有效?
        【解决方案6】:

        嵌套表单在 HTML according to the W3C 中是不可能的。您可以使用 JavaScript 或 with jQuery 来实现您的预​​期结果,正如 Peter 在名为 My Thoughts 的博客中所解释的那样。

        【讨论】:

          【解决方案7】:

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

          您可能必须创建一个新的母版页,一个没有表单标签的母版页,因此该表单只能在该页上工作。这不是一个好的解决方案,除非您可以将表单放在母版页的表单之外,并使用 javascript 提交第二个表单,但这也好不到哪里去。对于您要实现的目标,确实没有好的解决方案,如果是这样,我想听听。我认为您不能从代码隐藏中进行 POST 调用,可以吗?我敢肯定有什么办法。但这可能是唯一的解决方案:来自代码。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-06-23
            • 1970-01-01
            • 1970-01-01
            • 2012-05-07
            • 1970-01-01
            • 1970-01-01
            • 2012-05-12
            相关资源
            最近更新 更多