从C#后端调用JS函数报错:Uncaught ReferenceError解决方案咨询
我来帮你排查这个问题~出现Uncaught ReferenceError: updateState is not defined错误的核心原因是你用ScriptManager.RegisterClientScriptBlock注册的脚本,在updateState函数定义之前就执行了,浏览器还没加载到这个函数就被调用了。下面是几个可行的解决办法:
方法1:改用RegisterStartupScript替代RegisterClientScriptBlock
RegisterClientScriptBlock会把脚本插入到页面的<form>标签开头,而你的updateState函数写在ascx的<script>里,大概率在页面靠后的位置,导致脚本先执行却找不到函数。而RegisterStartupScript会把脚本放在</form>标签之前,这时候页面上的所有函数都已经定义完成了。
修改后的后台代码:
protected void Btn_Modify_state_Click(object sender, EventArgs e) { // 替换成RegisterStartupScript ScriptManager.RegisterStartupScript(this, this.GetType(), "updateStateScript", "updateState();", true); }
方法2:确保updateState函数先于调用脚本加载
你可以把定义updateState的<script>标签移到ascx的最顶部,或者直接放到母版页的<head>标签里,让函数在页面加载初期就被定义好,后续调用就不会出错。
调整后的ascx代码:
<script> function updateState(){ console.log("test") } </script> <!-- 其他控件代码 --> <button runat="server" ID="Btn_Modify_state" onserverclick="Btn_Modify_state_Click"> <i class="fas fa-edit"></i> </button>
方法3:添加函数存在性检查(兜底方案)
如果不想调整脚本位置或注册方法,可以在调用脚本里先检查函数是否存在,避免报错:
protected void Btn_Modify_state_Click(object sender, EventArgs e) { ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "script", "if(typeof updateState === 'function'){ updateState(); }", true); }
另外可以额外检查两个点:
- 右键查看页面源代码,搜索
updateState,确认这个函数确实被渲染到页面中了 - 如果你的ascx是动态加载的,要确保对应的脚本已经被正确加载到页面DOM里
内容的提问来源于stack exchange,提问作者Soleyne
相关产品推荐
相关产品推荐

