我需要在我的ASP.NET C#代码隐藏中动态创建HTML按钮,我必须在我的文字控件中插入此按钮,我使用以下语法:
literal.Text+=<button id=\"MyButton\" runat=\"server\" OnServerClick=\"MyButton_Click\">Click Me</Button>";
显示按钮,它会导致回发,但我的服务器点击功能(MyButton_Click)没有被调用,这里出了什么问题?我当然应该使用文字,我可以在文字中使用ASP.NET控件吗?
我想在此按钮导致回发后调用函数,我可以在文字中使用其他对象吗?我当然应该使用文字
感谢您的回答,我的文字中有很多代码,如下所示:
......
......
dynTable += "</td></tr>";
dynTable += "<tr><td></td></tr>";
dynTable += "<tr><td></td></tr>";
dynTable += "<tr><td></td></tr>";
dynTable += "<tr><td></td></tr>";
dynTable += "<tr><td align=\"left\">";
dynTable += "<button id=\"MyButton\" type=\"submit\" runat=\"server\" OnServerClick=\"MyButton_Click\">Foo</button>";
dynTable += "</tr></td> </table> ";
}
}
//=====================================
dynTable += " </td>";
dynTable += " </tr>";
dynTable += " </table>";
dynTable += " </td>";
dynTable += " </tr>";
dynTable += " </table>";
dynTable += " </td>";
dynTable += " </tr>";
}
dynTable += "</table>";
}
ReviewPlace.Text = dynTable;
ReviewPlace是我的asp.net文字对象
答案 0 :(得分:3)
您不能以这种方式添加服务器 - Html / Web 控件。您必须在Page_Init/Page_Load
事件中创建 Control 的对象,并将其添加到PlaceHolder's
控件集合中。
在标记(.aspx)中添加PlaceHolder1控件
<form id="form1" runat="server">
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
</form>
并编写Page_Init
处理程序,
protected void Page_Init(object sender, EventArgs e)
{
System.Web.UI.HtmlControls.HtmlButton button = new System.Web.UI.HtmlControls.HtmlButton();
button.InnerText = "OK";
//Event handler - Lambda (anonymous method) expression
button.ServerClick += (sa, ea) =>
{
Response.Write("button is pressed");
};
//Named Event handler
button.ServerClick += new EventHandler(button_ServerClick);
PlaceHolder1.Controls.Add(button);
}
void button_ServerClick(object sender, EventArgs e)
{
Response.Write("Another handler");
}
编辑:我建议您使用jQuery/JavaScript
- ajax
来请求服务器资源,而不是处理服务器事件,如果您希望/想要生成标记手。该问题的替代解决方案 使用Server
constrols - 尤其是GridView / ListView,我确信这些控件和绑定机制将解决该问题。
另一种可能性是使用Table
服务器控件。看看样本:
//For ease of use I'v subclass the `TableRow`
public class Row : TableRow
{
public Row(int col)
{
for(int i=0;i<col;i++)
Cells.Add(new TableCell());
}
public TableCell this[int index]
{
get { return Cells[index]; }
}
}
和Page_Init代码填充Table
对象。
protected void Page_Init(object sender, EventArgs e)
{
Table table = new Table();
Row row1 = new Row(3);
row1[0].ColumnSpan = 3;
row1[0].Text = "Search";
table.Rows.Add(row1);
Row row2 = new Row(3);
row2[0].Text = "Enter keyword";
row2[1].Controls.Add(new TextBox());
table.Rows.Add(row2);
Row row3 = new Row(3);
row3[0].ColumnSpan = 3;
Button button = new Button();
button.Text = "Search";
button.Click += (sa, ea) => Response.Write("Button is pressed");
row3[0].Controls.Add(button);
table.Rows.Add(row3);
PlaceHolder1.Controls.Add(table);
}
答案 1 :(得分:1)
正如AVD指出的那样,这不是一个好主意。
但是,如果您决定继续沿着此路径行进,则需要通过调用客户端脚本函数__doPostBack()
函数来回发,并设置正确的__EVENTTARGET
和__EVENTARGUMENT
属性。
此SO帖子显示了一个快速而肮脏的 hack 解决方法,通过在屏幕上放置一个隐藏的asp:button
,然后更改您的代码来调用{{3} }。