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

时间:2015-07-07 21:27:43

标签: c# html asp.net

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

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中使用它。例如。

4 个答案:

答案 0 :(得分:0)

仅当POST请求来自ASP.NET的__doPostBack()函数时,才会启用IsPostBack。有关如何使用JavaScript创建异步回发请求,请参阅How to use __doPostBack()

答案 1 :(得分:0)

ASP.NET Web表单已经是HTML表单,包含所有控件。您正在将表单嵌套在不合法HTML的表单中。

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

答案 2 :(得分:0)

如John Wu所示,您不希望以这种方式实现您的代码。嵌套表单 - 虽然浏览器原谅它们 - 不是那样,特别是ASP.Net WebForms。当然,我能够让你的代码工作,但如果你需要ajaxify你的页面,以便它与WebForms回发模型一起工作,那么使用UpdatePanel控件(与ScriptManager控件一起使用)会好得多。

ASP.Net WebForms基于页面上只使用一个Form元素,因为它与其回发模型有关,因此您需要在该约束内工作。

这里有一些代码来演示使用UpdatePanel来解析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";
        }
    }

你可以看到,在代码隐藏类中,单击Button后需要编写的用于设置文字控件值的代码与页面是否被ajaxified相同是相同的。

答案 3 :(得分:0)

我已将代码更改为:

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属性。