You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

回发时如何获取<button>控件的正确ID?

WebForms动态生成按钮回发事件目标异常问题

在WebForms页面中通过数据库内容生成动态HTML,以LiteralControl插入页面后,每行的两个按钮(Edit和Trash)出现异常:点击Edit按钮时,PageLoad回发中通过Page.Request.Params.Get("__EVENTTARGET")能正确获取到对应按钮ID(如editbtn12),但点击同一行的Trash按钮时,获取到的依然是该行Edit按钮的ID(如点击trashbtn12却得到editbtn12),所有行均存在此问题。

用户提供的按钮代码如下:

<button id = "editbtn12" type = "submit" 
runat = "server" onclick = "__doPostBack('editbtn12','Edit 1 2')"
title = "Edit" style = "border:none; height:30px;width:30px; margin-left:initial;
margin-top:initial; padding:initial" >
img src = "Images/TinyEditBtn.png"  />
</button >               
<button id = "trashbtn12" type = "submit"
runat = "server" onclick = "__doPostBack('trashbtn12','Trash 1 2')"
title = "Trash" style = "border:none; height:30px;width:30px; margin-left:initial;
margin-top:initial; padding:initial" >
<img src = "Images/TinyTrashBtn.png" />
</button >

问题原因

  • HTML结构错误是核心诱因:观察Edit按钮内的图片标签,代码中写的是img src = "Images/TinyEditBtn.png" />,缺少开头的<,导致该图片标签无效,进而让Edit按钮的闭合标签</button>无法被浏览器正确识别,最终Trash按钮被意外嵌套在了Edit按钮内部。点击嵌套在内部的Trash按钮时,事件会冒泡到父元素(Edit按钮),触发的是Edit按钮的__doPostBack逻辑,所以__EVENTTARGET会显示为Edit按钮的ID。
  • LiteralControl中runat="server"无实际作用:LiteralControl仅会将内容作为纯HTML输出,ASP.NET不会解析其中带有runat="server"的控件,所以此处的runat="server"是无效的,手动编写__doPostBack本身可行,但前提是HTML结构必须完全正确。

解决办法

  1. 修复HTML标签错误:将Edit按钮内的图片标签修正为正确格式:<img src="Images/TinyEditBtn.png" />,确保Edit按钮能正确闭合,Trash按钮成为独立的同级元素。
  2. 验证DOM结构:通过浏览器开发者工具(F12)查看页面渲染后的DOM结构,确认按钮的层级关系符合预期,避免出现嵌套错误。
  3. 可选优化方案:如果需要更可靠的事件处理,建议通过代码动态创建Button服务器控件(而非通过LiteralControl输出HTML),将按钮添加到Panel等容器控件中,由ASP.NET自动管理控件的生命周期和回发事件,避免手动编写__doPostBack的潜在问题。

内容的提问来源于stack exchange,提问作者Jim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 06:27:38