由在updatepanel中注册脚本所引发的问题

   
     
< asp:ScriptManager ID ="ScriptManager1" runat ="server" >
</ asp:ScriptManager >

< asp:UpdatePanel ID ="UpdatePanel1" runat ="server" >
< ContentTemplate >

    
< asp:DropDownList ID ="IDENTITY_DESCRIPTION" runat ="server" class ="select01"
DataTextField
="IDENTITY_DESCRIPTION" DataValueField ="IDENTITY_ID"
onselectedindexchanged
="IDENTITY_DESCRIPTION_SelectedIndexChanged" AutoPostBack ="true" >
</ asp:DropDownList >

........

  
</ ContentTemplate >
</ asp:UpdatePanel >

后台代码:
   
     
protected void IDENTITY_DESCRIPTION_SelectedIndexChanged( object sender, EventArgs e)  
{
  Page.ClientScript.RegisterStartupScript(
this .GetType(), " NewIdentityChange1 " , " <script>alert('123');</script> " );
}
DropDownList在UpdatePanel里面,使用上述方法注册脚本,则不会执行该脚本,没有任何反应。如果我们换另外一种注册脚本的方法:
   
     
protected void IDENTITY_DESCRIPTION_SelectedIndexChanged( object sender, EventArgs e)
{
  ScriptManager.RegisterStartupScript((System.Web.UI.Page)HttpContext.Current.CurrentHandler,
typeof (System.Web.UI.Page), " NewIdentityChange1 " , " alert('123'); " , true );
}
OK!注册脚本成功,执行脚本。

具体原因是什么呢,我网上查了下资料,发现:
ScriptManager和ClientScript方法是一样的,只是在特殊的场合要注意使用。ScriptManager适用在特殊的场合,如果有updatepanel就用ScriptManager;没有的话当然用ClientScript,避免每次postback操作时控件都要进行资源文件的注册。也就是说是否兼容ajax的问题,ScriptManager兼容于ajax,在ajax updatepanel中使用ClientScript是无效的。


ScriptManager.RegisterStartupScript参数详解:
第一个参数为要注册脚本的控件ID,试了一下,只要是本页面的就行。 
第二个参数为注册脚本控件类型,是控件还是this的GetType()都可以,typeOf(string)也没问题。
第三个脚本函数的名字,随便起。 
第四个是脚本内容。 
第五个是标明是否再添加脚本标签,如果第四个参数里包含了 <script> </script>标签,此处则为false,否则为true。

其实,还有一种解决方法,就是把DropDownList放在UpdatePanel外面,使用Page.ClientScript.RegisterStartupScript注册脚本。
之后我又发现,即使DropDownList在UpdatePanel里面,我们使用Page.ClientScript.RegisterStartupScript注册脚本也可以,只要加上PostBackTrigger:
   
     
< asp:ScriptManager ID ="ScriptManager1" runat ="server" >
</ asp:ScriptManager >

< asp:UpdatePanel ID ="UpdatePanel1" runat ="server" >
  < Triggers >
    
< asp:PostBackTrigger ControlID ="IDENTITY_DESCRIPTION" />
  
</ Triggers >
< ContentTemplate >

    
< asp:DropDownList ID ="IDENTITY_DESCRIPTION" runat ="server" class ="select01"
DataTextField
="IDENTITY_DESCRIPTION" DataValueField ="IDENTITY_ID"
onselectedindexchanged
="IDENTITY_DESCRIPTION_SelectedIndexChanged" AutoPostBack ="true" >
</ asp:DropDownList >

........

  
</ ContentTemplate >
</ asp:UpdatePanel >

页面中的DropDownList,由于我设置AutoPostBack="true",所以当选项变更时,会进行PostBack,所以才使用UpdatePanel,避免页面刷新,不过这样就有问题了,因为提交按钮是需要PostBack的,而不是AsyncPostBack。

某些控件因位于 UpdatePanel 中,所以它是异步回送的,而某些特殊情况下,我们却希望该控件实现整页回送。
参考了一些资料,主要是关于UpdatePanel中Trigger的使用,最后加了这么一句代码,就解决了问题。这是指定提交按钮要触发PostBack,哪怕该控件是放置在UpdatePanel中。

PostBackTrigger 只有一个属性:ControlID。PostBackTrigger 用来指定在UpdatePanel中的某个服务端控件,它所引发的回送不使用异步回送,而仍然是传统的整页回送。

你可能感兴趣的:(update)