您更新的问题仍然是错误的方法。你不能这样做:
$('#form1').attr("runat", "server")
并期望它的工作方式与您键入以下内容相同:
<form runat="server">
因为上面的标签是在服务器端处理的,实际上在客户端呈现如下:
<form method="post" action="default.aspx" id="ctl00">
这看起来不像你正在做的事情。
你有两个选择:
停止尝试使用 Javascript添加任何 ASP.NET 控件(即以 开头<asp:)或其中包含的任何内容。runat="server"如果您确实必须使用 Javascript 来执行此操作,请使用常规 HTML 控件。
停止使用 Javascript 并实际正确使用<asp:控件或 HTML 控件,runat="server"然后从后面的代码中执行您需要执行的操作。
现在是切线。
关于Control 'btn1' of type 'Button' must be placed inside a form tag with runat=server.假设您正确使用<form runat="server">并重试的错误。你可能会发现它(有点)有效!
<form id="form1" runat="server">
<asp:Button ID="btn2" Text="Button 2" runat="server" />
<script>
$(document).ready(function () {
$('#<%= form1.ClientID %>').append('<asp:Button Text="Button 1" ID="btn1" runat="server"/>');
});
</script>
</form>
这将呈现,但它是不正确的。除了令人困惑、讨厌的代码之外,它之所以有效,是因为 ASP.NET 实际上为此呈现 HTML<asp:Button并将其放入脚本块中,所以发送给客户端的是这个(和两个按钮......但仍然不是你输入的内容) .
<input type="submit" name="btn2" value="Button 2" id="btn2" />
<script>
$(document).ready(function () {
$('#form1').append('<input type="submit" name="btn1" value="Button 1" id="btn1" />');
});
</script>
现在是你没想到的部分。从代码隐藏中,您可以在页面加载上执行此操作:
protected void Page_Load(object sender, EventArgs e)
{
btn1.Text = "This is Awful";
}
而不是在屏幕上显示Button 2和的两个按钮,Button 1现在第二个按钮显示This is Awful。
...但同样,这是完全错误的,<asp:如果您尝试这样做,大多数其他控件都会中断(我不确定为什么 ASP.NET 会转换 Javascript 块中的代码)。因此,请参阅上面的两个选项,了解如何继续。