动态生成的html未触发onclick事件

本文关键字:onclick 事件 html 动态 | 更新日期: 2023-09-27 18:26:57

这是我的C#构建html。我试图用onclick和onclientlick更改OnServerClick,结果是:

  • Onserverclick不会触发任何内容
  • onclick给了我一个例外告诉我方法没有定义
  • onclientclick不不点火

代码:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        string[] filePaths = Directory.GetFiles(Server.MapPath("~/img/"));
        List<ListItem> files = new List<ListItem>();
        tabellaDownload.InnerHtml += "<table>";
        foreach (string filePath in filePaths)
        {
           files.Add(new ListItem(Path.GetFileName(filePath), filePath));
           // tabellaDownload.InnerHtml += "<tr><td  OnServerClick = 'DownloadFile' runat='server'>" + Path.GetFileName(filePath) + "<td></tr>";
           tabellaDownload.InnerHtml += "<input type='button' runat='server' OnServerClick='DownloadFile' value='asd' />";    
        }
        tabellaDownload.InnerHtml += "</table>";
        string asd = "";
    }
}             
protected void DownloadFile(object sender, EventArgs e)
{
    //do something
}

动态生成的html未触发onclick事件

您要做的是向表单中添加一个控件,因此如果您想动态执行,则需要执行以下操作:

protected void Page_Load(object sender, EventArgs e)
{
    HtmlButton b = new HtmlButton
    b.ServerClick += MyEvent;
    tabellaDownload.Controls.Add(b);
    /* a table control doesn't accept a btn as child, you need to the exact td cell where insert the button*/
}
protected void MyEvent(object sender, EventArgs e)
{
}

web表单中的所有内容都是包含在控件集合中的控件。

Aspx文件以标记的形式包含html和服务器指令的混合(您可以通过标记服务器指令的runat属性来注意到差异),服务器端指令以类似于以下的方式呈现为html标记以发送到浏览器:

<input name="ctl00$MainContent$ctl00" onclick="__doPostBack('ctl00$MainContent$ctl00','')" type="button">

当您将字符串分配给控件的InnerHtml属性时,您正在发送您想要在客户端呈现的内容,但没有一个特定于html(或特定于ecma脚本)的字符串定义runat属性!