You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IsStartupScriptRegistered为true时,RegisterStartupScript如何重复调用?

关于RegisterStartupScript重复触发的疑问

我正在参考MSDN上的RegisterStartupScript文档,但有个疑惑:我想在GridView行被点击时调用某个函数,且支持多次点击,于是写了如下代码,但不确定再次点击GridView行时,IsStartupScriptRegistered("JSScript")会不会变为true,导致RegisterStartupScript再也不执行?

Page_Load示例代码

public void Page_Load(Object sender, EventArgs e)
{
  // Define the name and type of the client scripts on the page.
  String csname1 = "PopupScript";
  Type cstype = this.GetType();
      
  // Get a ClientScriptManager reference from the Page class.
  ClientScriptManager cs = Page.ClientScript;

  // Check to see if the startup script is already registered.
  if (!cs.IsStartupScriptRegistered(cstype, csname1))
  {
      StringBuilder cstext1 = new StringBuilder();
      cstext1.Append("<script type=text/javascript> alert('Hello World!') </");
      cstext1.Append("script>");

      cs.RegisterStartupScript(cstype, csname1, cstext1.ToString());
  }
}

GridView行点击事件代码

protected void gridview_RowClick(object sender, EventArgs e) 
{ 
  System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
  sb.Append("<script language='javascript'>function ChangeColor() {"); 
  sb.Append("var lbl = document.getElementById('lblDisplayDate');"); 
  sb.Append("lbl.style.color='green';"); 
  sb.Append("}</script>"); 

  //Render the function definition. 
  if (!ClientScript.IsClientScriptBlockRegistered("JSScriptBlock")) 
  {
    ClientScript.RegisterClientScriptBlock(this.GetType(), "JSScriptBlock", sb.ToString()); 
  }

  //Render the function invocation. 
  string funcCall = "<script language='javascript'>ChangeColor();</script>"; 

  if (!ClientScript.IsStartupScriptRegistered("JSScript"))
  { 
    ClientScript.RegisterStartupScript(this.GetType(), "JSScript", funcCall); 
  } 
}

解答

你的担忧是错误的——每次GridView行点击触发回发时,都会创建一个全新的页面实例,ClientScriptManager的注册状态会被完全重置,所以每次进入gridview_RowClick事件时,IsStartupScriptRegistered("JSScript")都会返回false,你写的判断会让RegisterStartupScript每次点击都执行,回发后页面加载时都会调用ChangeColor()。

不过你的代码有个小问题:IsClientScriptBlockRegistered("JSScriptBlock")同样是基于当前页面生命周期的临时状态,每次回发初始都是false,所以每次点击都会重复注册ChangeColor函数的定义(虽然浏览器会覆盖重复的函数定义,不影响功能,但属于冗余代码)。

如果想避免重复注册函数定义,有两种更合理的写法:

  • 把函数定义放到Page_Load里注册(只在页面首次加载或每次回发时注册一次,用IsClientScriptBlockRegistered判断);
  • 直接把函数写在页面的<script>标签里,不用后台注册,只在后台注册调用语句。

另外,注意RegisterStartupScript的注册语句会在页面DOM加载完成后执行,所以不用担心找不到lblDisplayDate元素的问题。


内容的提问来源于stack exchange,提问作者jp2code

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 01:17:07