SharePoint 2013可视化WebPart中Update Panel在Chrome中失效求助
我之前在做SharePoint 2013可视化WebPart的时候,也碰到过和你一模一样的情况——IE下AJAX正常跑,Chrome里UpdatePanel完全没反应,折腾了好一阵才搞定,给你整理下完整的解决流程:
问题根源
其实这是SharePoint的AJAX机制在Chrome中的兼容性问题:当UpdatePanel异步刷新后,Chrome不会自动重新绑定ASP.NET控件的回发事件,导致按钮点击、GridView行操作这类交互触发不了AJAX请求。
具体解决步骤
第一步,在SharePoint的
Layouts文件夹下新建一个JS文件(比如命名为FixChromeUpdatePanel.js),把下面的修复代码粘贴进去:// 监听UpdatePanel异步请求结束事件 Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function() { // 重新绑定按钮的回发事件(示例:绑定ID为btnSubmit的按钮) var submitBtn = document.getElementById('<%= btnSubmit.ClientID %>'); if (submitBtn) { submitBtn.onclick = function() { __doPostBack('<%= btnSubmit.UniqueID %>', ''); }; } // 重新绑定GridView行内操作按钮的回发事件 var grid = document.getElementById('<%= GridView1.ClientID %>'); if (grid) { var rows = grid.getElementsByTagName('tr'); for (var i = 0; i < rows.length; i++) { var cells = rows[i].getElementsByTagName('td'); for (var j = 0; j < cells.length; j++) { var btns = cells[j].getElementsByTagName('input'); for (var k = 0; k < btns.length; k++) { // 匹配ASP.NET生成的带$符号的按钮name属性 if (btns[k].type === 'button' && btns[k].name.indexOf('$') > -1) { btns[k].onclick = function() { __doPostBack(this.name, ''); }; } } } } } });这段代码的核心是利用
Sys.WebForms.PageRequestManager的endRequest事件,在每次UpdatePanel刷新完成后,手动重新绑定控件的回发逻辑,确保Chrome能正确识别并触发AJAX请求。第二步,在你的可视化WebPart的
.ascx文件中,找到ScriptManagerProxy控件,在它的Scripts集合里添加这个JS文件的引用:<asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server"> <Scripts> <!-- 注意路径要对应你的JS文件实际位置,SharePoint 2013默认用15 hive --> <asp:ScriptReference Path="/_layouts/15/FixChromeUpdatePanel.js" /> </Scripts> </asp:ScriptManagerProxy>如果你的环境用的是14 hive(部分旧部署),把路径里的
15改成14即可。
额外注意事项
- 确保所有需要AJAX交互的控件都放在
UpdatePanel内部,或者通过Triggers属性关联到UpdatePanel; - 如果你的GridView有自定义客户端脚本(比如行高亮、自定义验证),也要把初始化逻辑放到
endRequest事件里,避免刷新后脚本失效; - 测试前记得清空Chrome的缓存,有时候浏览器会加载旧的JS文件,导致修改不生效。
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

