以编程方式创建表单标记不工作

本文关键字:工作 表单 编程 方式 创建 | 更新日期: 2023-09-27 18:01:24

我有一个包含文字的简单网页,现在我想在代码后面创建一个表单标签。下面是一个示例:

if (IsPostBack)
{
    Literal1.Text = "form submit";
}
else
{
    Literal1.Text = "<form id='myFrom' runat='server' action='default.aspx'
                     method='POST'><input type='submit' value='click here'/></form>";
}

这段代码创建了表单,但是当我单击提交按钮时,它没有经过IsPostBack路径。为什么?

请注意,我需要创建它并作为字符串发送,因为我想在ajax中使用它。

以编程方式创建表单标记不工作

IsPostBack仅在POST请求来自ASP时启用。. NET的__doPostBack()函数。参见如何使用__doPostBack()来创建一个异步回发请求。

. NET web表单已经是一个HTML表单,并且包含了所有的控件。你在一个不合法的HTML中嵌套一个表单。

我建议你用一个简单的按钮替换你的嵌套表单。在按钮的click处理程序中,重定向到default.aspx。

正如John Wu所指出的,您不希望以这种方式实现代码。嵌套表单——虽然浏览器会原谅它们——并不是正确的选择,尤其是在ASP中。净WebForms。当然,我能够让你的代码工作,但如果你需要ajax你的页面,使其与WebForms回发模型的工作,那么它会更好地使用UpdatePanel控件(与ScriptManager控件一起)。

ASP。Net WebForms的前提是在页面上只使用一个Form元素,因为它与它的回发模型相关,所以您将希望在该约束下工作。

下面是一些代码来演示如何使用UpdatePanel来ajax WebForm(并利用PostBack):

….ASPX页面:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="NestedForm_Question.aspx.cs" Inherits="StackOverflowAspNetQuestionAnswers.NestedForm_Question" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ScriptManager ID="ScriptManager" runat="server" />
        <asp:UpdatePanel runat="server">
            <ContentTemplate>
                 <asp:Literal ID="Literal1" runat="server" />
                 <asp:Button ID="SubmitButton" Text="Submit" runat="server" />
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
    </form>
</body>
</html>

…相关的代码隐藏类:

   public partial class NestedForm_Question : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            SubmitButton.Click += SubmitButton_Click;
        }
        void SubmitButton_Click(object sender, EventArgs e)
        {
            Literal1.Text = "form submit";
        }
    }

您可以看到,在代码隐藏类中,无论页面是否ajax化,都需要编写用于在单击Button后设置文字控件值的代码是相同的。

我把我的代码改成这样:

if (Context.Request.Form.HasKeys()) // instead of if(IsPostBack)
{
    Literal1.Text = "isPostBack";
}
else
{
    Literal1.Text = "<form id='myFrom' runat='server' action='default.aspx' method='POST'><input type='submit' name='submitbtn' value='click here'/></form>";
}

使用不同的例子,我没有发现任何例外。而且效果不错。

对这个解决方案有什么想法吗?

注意,通过这种方式,表单中至少有一个元素应该具有name属性