<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>");
}
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);
}
具体原因是什么呢,我网上查了下资料,发现:
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中。