UpdatePanel内Repeater的<a>标签仅首次加载有效问题求助
解决UpdatePanel局部刷新后Repeater内标签按钮失效的问题
这问题我之前碰到过好几次,本质就是ASP.NET UpdatePanel局部刷新导致的JavaScript事件绑定丢失。首次加载页面时,你的模态框触发事件已经绑定到元素上,但当UpdatePanel执行异步回发(比如分页切换、视图切换)后,Repeater会重新渲染生成新的DOM元素,这些新元素并没有被绑定原来的点击事件,所以就失效了。
下面给你两个靠谱的解决方案,还有一个需要注意的代码细节:
方案一:使用事件委托(推荐)
事件委托的核心是把事件绑定到不会被局部刷新替换的父元素(比如document、或者Repeater的外层容器),这样不管UpdatePanel怎么刷新,新生成的元素触发的点击事件都会冒泡到父元素上被捕获。
假设你原来的模态框触发代码是这样的:
$('.order.button').click(function() { // 获取data属性并打开模态框的逻辑 var uid = $(this).data('uid'); var productName = $(this).data('pro-name'); // ...其他逻辑 });
把它改成事件委托的写法:
// 绑定到document或者Repeater的外层容器(比如.single-pro) $(document).on('click', '.order.button', function() { // 同样的逻辑,这里的this仍然指向被点击的<a>元素 var uid = $(this).data('uid'); var uname = $(this).data('uname'); var price = $(this).data('price'); var productName = $(this).data('pro-name'); var itemId = $(this).data('iid'); // 这里写打开模态框并填充数据的逻辑 // 比如 $('#modalId').modal('show') 并把数据赋值到模态框的输入框里 });
这种方式一劳永逸,不管UpdatePanel刷新多少次,新生成的元素都能正常触发事件。
方案二:在UpdatePanel异步回发完成后重新绑定事件
ASP.NET AJAX提供了PageRequestManager对象,可以监听异步回发的结束事件,在这个事件里重新给新生成的元素绑定事件。
代码示例:
// 定义绑定事件的函数 function bindOrderButtonEvents() { // 先解绑可能存在的旧事件,避免重复绑定 $('.order.button').off('click').on('click', function() { // 模态框触发逻辑 var uid = $(this).data('uid'); // ...其他处理 }); } // 页面首次加载时绑定一次 $(document).ready(function() { bindOrderButtonEvents(); }); // 监听UpdatePanel异步回发结束事件,重新绑定 Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function() { bindOrderButtonEvents(); });
这个方案需要确保你的页面已经引用了ASP.NET AJAX的脚本(一般WebForms项目默认会引用)。
额外需要检查的代码细节
看你提供的标签代码,这里有个小问题:
data-pro-name="<%#Container.DataItem(productName)%>"
这里的productName应该加上引号,改成:
data-pro-name="<%#Container.DataItem("productName")%>"
否则ASP.NET解析时可能会把productName当成变量,导致data属性值生成错误,进而影响JavaScript获取数据。
按照上面的方法调整后,你的标签按钮应该就能在UpdatePanel刷新后正常触发模态框了。
内容的提问来源于stack exchange,提问作者Ask Xah
相关产品推荐
相关产品推荐

