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

