以编程方式创建表单标记不工作
本文关键字:工作 表单 编程 方式 创建 | 更新日期: 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属性