【问题标题】:Legacy html form in ASP .net applicationASP .net 应用程序中的旧版 html 表单
【发布时间】:2010-10-15 19:03:54
【问题描述】:

我有一个 html 页面,我将其转换为 asp .net 页面。此页面包含一个访问我无法控制的外部网站的表单。下面是一些示例代码:

<asp:Content ID="sample" ContentPlaceHolderID="body" Runat="Server">
<form name="Subscribe" method="post" action="http://anexternalwebsitehere.com/subscribe.asp">
        <input type="text" name="email" size="45" maxlength="120" />
        <input type="submit" name="submit" value="Subscribe" />
    </form>
</asp:Content>

该表单比我提供的示例更复杂,但它大致了解了我需要转换的内容。以下是我遇到的问题。

如果我保持原样: 当您单击提交按钮时,您将回发到当前页面而不是外部页面

如果简单地将所有内容转换为 asp 表单控件并更改回发网址: id 变成了一些复杂的“ctl00_body_ctl00”,外部页面无法解释。

注意:我确实需要该页面是 aspx 页面,因为我正在使用母版页来显示页面上的其他内容。

附加说明:这不是 Microsoft MVC。

我错过了什么?

【问题讨论】:

  • ASP.NET 是否改变了这个表单标签的“action”属性?请运行页面并在浏览器中查看源代码以找出答案。
  • 不,页面的来源保持不变。所以 ASP.NET 不会以任何方式改变它。但是,整个页面确实包含在标准的 asp.net 表单中,这正是问题所在。
    页面内容在这里

标签: asp.net xhtml


【解决方案1】:

您可能已经猜到,问题在于您在另一个表单中包含一个表单 - 即旧表单出现在母版页所需的 ASP.NET 表单中。

解决此问题的一种快速(如果相当笨拙)的方法是关闭旧表单上方的 ASP.NET 表单,然后在旧表单下方打开一个新表单。这意味着页面上有三个表单,没有一个是嵌套的。

所以你最终会得到这样的结果:

<asp:Content ID="sample" ContentPlaceHolderID="body" Runat="Server">
    </form>
    <form name="Subscribe" method="post" action="http://anexternalwebsitehere.com/subscribe.asp">
        <input type="text" name="email" size="45" maxlength="120" />
        <input type="submit" name="submit" value="Subscribe" />
    </form>
    <form method="post" action="myAspNetPage.aspx">
</asp:Content>

开头的关闭&lt;/form&gt; 标记从母版页关闭ASP.NET。然后你就有了你的表单,它现在应该可以按预期工作了。然后末尾的打开 &lt;form&gt; 标记只是确保母版页的结束 &lt;/form&gt; 标记是有效的 HTML。

显然,在旧表单之后出现在母版页上的任何内容都不会在标准 ASP.NET 表单中,因此这可能对您不起作用,具体取决于页面其余部分的结构。

这不是一个特别优雅的解决方案,但它可以作为一种快速修复(取决于母版页上的其他内容)。我们在一个拥有数百个页面的网站上需要一个遗留表单的地方使用它,因此我们只需要一次性修复而不是任何影响母版页本身的东西。

在我们的例子中,我们无法更改遗留表单,因为它是由第三方提供的,定期更改,并且需要在没有开发人员参与修改的情况下放入 ASP.NET 页面(例如反对 Brian 对他自己的问题的解决方案,该解决方案需要编辑表单,显然在他的情况下是更好的选择 - 并且可能在存在类似问题的大多数其他情况下)。

【讨论】:

    【解决方案2】:

    问题在于其他人提到的嵌套表单。

    只需执行以下操作,我就能解决所有问题:

    1. 删除我添加的额外表单元素。
    2. 将所有控件保留为简单的 html 控件,提交按钮除外。
    3. 将提交按钮替换为asp .net按钮,并设置回发网址。

    旧代码如下:

    <asp:Content ID="sample" ContentPlaceHolderID="body" Runat="Server">
    <form name="Subscribe" method="post" action="http://anexternalwebsitehere.com/subscribe.asp">
            <input type="text" name="email" size="45" maxlength="120" />
            <input type="submit" name="submit" value="Subscribe" />
        </form>
    </asp:Content>
    

    新代码:

    <asp:Content ID="sample" ContentPlaceHolderID="body" Runat="Server">
            <input type="text" name="email" size="45" maxlength="120" />
            <input type="submit" name="submit" value="Subscribe" />
            <asp:button postbackurl="http://anexternalwebsitehere.com/subscribe.asp" text="Subscribe" runat="server" />
    </asp:Content>
    

    这解决了无效嵌套表单的任何问题,因为没有嵌套表单。它还解决了 asp .net 重命名 asp 元素的问题,因为唯一被重命名的控件是 asp 按钮控件,它不是提交成功所必需的。

    【讨论】:

      【解决方案3】:

      您的按钮的点击事件将处理 url 和数据的提交。

      //C# source
      protected void button_Click(object sender, EventArgs e)
      }
        string customURL = "http://anexternalwebsitehere.com/";
        string emailValue = textBoxEmail.Text; //of course validate this for proper email...
      
        customURL += "page.aspx?email=" + emailValue;
      
        Response.Redirect(customURL);
      }
      

      【讨论】:

      • 这不起作用,因为它需要是一个帖子,而不是一个获取提交。
      【解决方案4】:

      由于您的母版页上可能有跨越内容占位符的服务器表单标记,因此您声明的这个新表单将被放置在服务器表单内(服务器表单是指使用 runat 进行回发的一个 asp.net ="服务器")

      我遇到过这样的情况,我需要一个特殊的非服务器表单在一个已经有一个服务器表单的 aspx 页面上,而我解决问题的方法是将这个非服务器表单放在服务器表单之外 -我的意思是,将它放在服务器表单之后。由于您使用母版页,因此您需要在该母版页上添加一个新的内容占位符,您可以将其称为“noform”。它放置在服务器表单之后,因此放入此 noform 的任何内容都将放置在服务器表单之外。这意味着任何 asp.net 控件都不会在这个特定的 contentplaceholder (noform) 中工作,因为它们不会被框架拾取,但您可以将非服务器表单放在那里并在其中发挥作用。

      【讨论】:

        猜你喜欢
        • 2018-06-27
        • 2016-07-19
        • 2010-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-08
        • 1970-01-01
        相关资源
        最近更新 更多