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

时间:2009-03-26 19:38:44

标签: 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">
        <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。

我错过了什么?

4 个答案:

答案 0 :(得分:5)

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

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

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

    <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按钮控件,这对于提交成功不是必需的。

答案 1 :(得分:2)

由于你的主页上可能有你的contentplaceholder上的服务器表单标签,你声明的这个新表单将放在服务器表单中(通过服务器表单,我的意思是一个asp.net用于使用runat的回发) = “服务器”)

我有一些情况,当我需要一个已经有服务器格式的aspx页面上的特殊非服务器表单时,我解决问题的方法是将这个非服务器表单放在服务器表单之外 - 我的意思是,将它放在服务器表单之后。由于您使用的是高级页面,因此您需要在该母版页上使用新的contentplaceholder,您可以将其命名为“noform”。它位于服务器表单之后,因此放入此noform的任何内容都将放在服务器表单之外。这意味着没有asp.net控件可以在这个特定的contentplaceholder(noform)中工作,因为它们不会被框架选中,但是你可以在那里放置你的非服务器表单并在那里做你的魔术。

答案 2 :(得分: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>

开始时关闭</form>标记会从母版页关闭ASP.NET。然后你有你的表格,现在应该按预期工作。然后,最后打开的<form>标记只会确保母版页中的结束</form>标记是有效的HTML。

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

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

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

答案 3 :(得分:-1)

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

//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);
}