CodeBehind调用JS打开Telerik RadWindow弹窗报空引用错误如何解决
报错原因
$find()返回null的核心原因是后台注册的启动脚本执行时机早于Telerik客户端组件的初始化时间:
- RadWindowManager是基于ASP.NET AJAX组件模型实现的服务端控件,它的客户端对象必须等页面
Sys.Application.load事件触发完成后才会完成注册,此时$find()方法才能正确获取到组件实例。 - 你通过
ScriptManager.RegisterStartupScript直接注册openSync()立即执行时,脚本会在Telerik组件初始化前运行,自然拿不到RadWindowManager的实例,调用open方法就会抛出null引用错误。 - 给按钮加
OnClientClick="openSync(); return false;"能正常运行,是因为用户点击按钮时页面早已完成全部加载流程,所有客户端组件都初始化完毕,但return false会阻止表单回发,直接跳过后台点击事件的业务逻辑。
可行解决方案
以下两种方案均能保证后台业务逻辑全部执行完成后正常弹出RadWindow,按需选择即可:
方法1:调整脚本执行时机(兼容原有前端JS逻辑)
修改后台注册脚本的代码,把openSync()的调用包裹在Sys.Application.add_load回调中,强制等所有AJAX组件初始化完成后再执行弹窗逻辑:
' 替换原有的ScriptManager注册代码,放在按钮点击事件的业务逻辑最后即可 ScriptManager.RegisterStartupScript( Me, Me.GetType(), "openSync", "Sys.Application.add_load(function(){ openSync(); });", True )
这个方案兼容整页回发、UpdatePanel局部刷新场景,不需要修改你已经写好的前端openSync函数。
方法2:直接用RadWindowManager自带的服务端弹窗API(更简洁)
Telerik官方已经封装了服务端触发弹窗的方法,内部自动处理了脚本执行时机、组件查找的问题,不需要额外写前端JS函数:
' 放在按钮点击事件的所有业务逻辑最后执行 Dim companyId As String = Server.UrlEncode(txtCompanyID.Text) Dim targetUrl As String = $"SyncDatabases.aspx?CompanyID={companyId}" ' 直接调用内置方法注册弹窗脚本 RadWindowManager1.RadOpen(targetUrl, "winSyncProcess")
这个方案代码量更少,不需要维护额外的前端弹窗函数,也不会出现组件找不到的问题。
注意事项
- 不要在回发场景下直接裸调用依赖Telerik客户端API的函数,必须等组件初始化完成后再执行。
- 如果你的RadWindowManager放在UpdatePanel内部,上述两个方案都可以正常兼容,不需要额外调整配置。
内容的提问来源于stack exchange,提问作者Patrick Davis
相关产品推荐
相关产品推荐

