ASP.net应用程序中的旧html表单

ASP.net应用程序中的旧html表单,asp.net,xhtml,Asp.net,Xhtml,我有一个html页面,我正在转换为asp.net页面。此页面包含一个访问我无法控制的外部网站的表单。下面是一些示例代码: <asp:Content ID="sample" ContentPlaceHolderID="body" Runat="Server"> <form name="Subscribe" method="post" action="http://anexternalwebsitehere.com/subscribe.asp"> <in

我有一个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表单控件并更改回发url: id变成了一些复杂的“ctl00\u body\u ctl00”,外部页面无法解释

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

附加说明:这不是Microsoft MVC


我遗漏了什么?

由于您的母版页上可能有跨越contentplaceholder的服务器表单标记,因此您要声明的新表单将放置在服务器表单中(所谓服务器表单,我指的是asp.net使用runat=“server”进行回发的表单)


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

正如您可能猜到的那样,就是一个表单在另一个表单中,即旧表单出现在母版页所需的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>

开始处的closing
标记从母版页关闭ASP.NET。然后您就有了您的表单,它现在应该可以按预期工作了。然后,末尾的open
标记将确保母版页中的closing
标记是有效的HTML

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

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


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

您按钮的单击事件将处理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);
}

正如其他人所提到的,问题在于嵌套表单

我只需执行以下操作即可解决所有问题:

  • 删除我添加的额外表单元素
  • 将所有控件保留为简单的html控件,但“提交”按钮除外
  • 将“提交”按钮替换为asp.net按钮,并设置回发url
  • 旧代码如下:

    <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 button控件,提交成功不需要该控件。

    是asp.net更改“操作”此表单标记的属性?请运行该页面并在浏览器中查看源代码。否,该页面的源代码保持不变。因此ASP.NET不会以任何方式更改它。但是,整个页面确实被标准ASP.NET表单包围,这正是问题产生的原因。此处的页面内容无法按需要工作做一篇文章,而不是一篇文章。