• 由在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中的某个服务端控件,它所引发的回送不使用异步回送,而仍然是传统的整页回送。
  • 相关阅读:
    TCP与UDP
    DNS的概念,用途,DNS查询的实现算法
    子网划分的概念,子网掩码
    ping的原理以及ICMP
    组播和广播的概念,IGMP的用途
    ICMP协议
    RIP协议
    MTU的概念,什么是路径MTU? MTU发现机制,TraceRoute(了解)
    TFTP 与 FTP的区别
    vue slot slot-scope
  • 原文地址:https://www.cnblogs.com/EricaMIN1987_IT/p/1948256.html
Copyright © 2020-2023  润新知