ScriptManager.RegisterClientScriptBlock 不调用现有脚本
本文关键字:脚本 调用 RegisterClientScriptBlock ScriptManager | 更新日期: 2023-09-27 18:17:10
Background
我有一个客户端按钮单击,可以触发服务器端功能。在调用服务器端函数之前,将显示加载面板 (div(。
服务器端功能完成后,需要删除加载面板。
我的解决方案
服务器端函数完成后,我将调用一个 JavaScript 函数来删除div。因此,作为测试,我调用警报脚本。我正在尝试从母版页执行此操作。
客户端代码
我的弹出功能
<script>
function PopUp() {
debugger;
alert('TEST');
}
</script>
我的脚本管理器
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
服务器端代码
服务器端功能完成后的"我的呼叫"。
//Add the script after <form> tag
bool isClientScriptBlockRegistered = ClientScript.IsClientScriptBlockRegistered("ShowStatus");
if (!isClientScriptBlockRegistered)
{
ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "ShowStatus", "PopUp();", true);
}
问题
服务器未调用我的脚本。不会创建警报窗口。当我尝试从母版页以外的任何页面执行此操作时,它可以工作。但是,在母版页上则不会。
问题
我错过了什么吗?
是否需要回调或某种页面刷新才能显示警报,或者服务器是否可以只调用脚本而不从客户端执行任何操作?
更改
ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "ShowStatus", "PopUp();", true);
到
ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "ShowStatus", "setTimeout(function () { PopUp(); }, 10);", true);
或进入
ScriptManager.RegisterStartupScript(Page, Page.GetType(), "ShowStatus", "PopUp();", true);
RegisterClientScriptBlock
将 JavaScript 代码添加到页面顶部的 ViewState 标记之后,而RegisterClientScriptBlock
将其添加到底部。因此,如果您使用RegisterClientScriptBlock
并且您的PopUp()
位于页面上较低的位置,则会收到错误。
或者通过设置setTimeout
您可以确保生成所有内容,然后即使脚本块位于顶部,也会找到PopUp()
内容。