如何在页面加载/任何事件中执行代码后调用服务器端的javascript函数?我在这个页面中使用UpdatePanel。我曾尝试Page.RegisterStartUpScript, ClientScript.RegisterStartupScript
。这些都不起作用。
答案 0 :(得分:6)
使用UpdatePanel,您需要使用ScriptManager.RegisterStartupScript
,如下所示:
var script = "alert('hi);";
ScriptManager.RegisterStartupScript(this, GetType(), "MyScript", script, true);
您必须记住,在UpdatePanel中,您不会将整个页面发送回客户端,因此Page
版本将无效,因为它们的内容永远不会在部分更新中发生。使用ScriptManager
它会将其作为脚本执行的AJAX响应主动推送,因此它的行为略有不同。
答案 1 :(得分:1)
就在昨天,我做了一些研究来帮助同事,并提出了以下解决方案。它依赖于ajax控件扩展器中使用的一些技术来使用注册数据项。由于我希望这更像是一种通用方法,因此我将以下代码放在masterman页面的脚本块中,紧跟在scriptmanager对象之后:
Sys.WebForms.PageRequestManager.getInstance()add_pageLoading(PageLoadingHandler)。 function PageLoadingHandler(sender,args){ var dataItems = args.get_dataItems(); if($ get('<%= JSBridge.ClientID%>')!== null){ 的eval(dataItems [ '<%= JSBridge.ClientID%GT;']); } }
然后在母版页的标记处,我放置了一个隐藏字段,如下所示:
asp:HiddenField ID =“JSBridge”runat =“server”
这就是母版页。现在,我的所有网页都从基页继承,所以我在基页中放置了一个方法,如下所示:
public void InvokeScriptMethod(string methodName,string [] methodArgs) { string sArgs = string.Empty; string delim = string.Empty; bool isNumeric = false; int iArg = 0;
if (methodArgs != null && methodArgs.Length > 0)
{
foreach (string arg in methodArgs)
{
isNumeric = int.TryParse(arg, out iArg);
sArgs += delim + ((isNumeric) ? arg : "'" + arg + "'");
delim = ",";
}
}
ScriptManager manager = (ScriptManager)Master.FindControl("ScriptManager1");
if (manager.IsInAsyncPostBack)
{
manager.RegisterDataItem(Master.FindControl("JSBridge"), methodName + "(" + sArgs + ")");
}
}
因此,假设您的内容位于更新面板内,任何按钮点击或任何事件,在任何网页上,您只需执行以下操作:
protected void MyButton_Click(object sender,EventArgs e) { // - 调用基页面方法来调用javascript调用 InvokeScriptMethod(“ShowMessage”,new string [] {“David”,“Whitten”,“44”}); }
这假设你有一个带有必要参数的名为“ShowMessage”的javascript方法。显然,可以指定任何方法名称和任意数量的参数。
只是想分享我的发现。也许甚至有更好的方法,但我发现这非常简单和灵活。
大卫
答案 2 :(得分:0)
ScriptManager.RegisterStartupScript
为a注册启动脚本块 UpdatePanel中的控件 通过使用ScriptManager控件, 并将脚本块添加到页面。