RegisterStartupScript inside user control

3.2k Views Asked by At
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ChatUserControl.ascx.cs"
    Inherits="MetamorphismApp.ChatUserControl" %>
<asp:Timer ID="timer1" runat="server" OnTick="timer1_Tick" Interval="5000">
</asp:Timer>
<div id="divChatWindow" class="clChatWindow">
    <div>
        <asp:Label runat="server" Text='<%# Eval("username") %>' class="divHeader" ID="lblChatFriend"></asp:Label>
        <asp:Image ID="imgFriend" runat="server" CssClass="classFriendImage"/>
        <asp:LinkButton ID="lbClose" runat="server" CommandName="Close" CssClass="lbClose"
            OnClick="lbClose_Click">Close</asp:LinkButton></div>
    <div class="chatText" id="idChatText" runat="server">
        <asp:UpdatePanel ID="UpdatePanel" runat="server">
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="timer1" EventName="Tick" />
                <asp:AsyncPostBackTrigger ControlID="btnSendChat" EventName="Click" />
            </Triggers>
            <ContentTemplate>
                <asp:Repeater runat="server" ID="rpChatMessages">
                    <ItemTemplate>
                        <asp:Image ID="imageForFriend" runat="server" CssClass="clFriendsImage" ImageUrl='<%# "HttpImageHandler.jpg?username=" +  DataBinder.Eval(Container.DataItem,"fromusername").ToString() %>' />
                        <asp:Label ID="chatMessage" runat="server" Text='<%# Eval("Message") %>'></asp:Label>
                        <br>
                    </ItemTemplate>
                </asp:Repeater>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
    <asp:TextBox ID="txtChatMessage" runat="server" Width="142px" CssClass="clChatMessage"
        TextMode="MultiLine"></asp:TextBox>
    <asp:LinkButton ID="btnSendChat" runat="server" CommandName="Insert" CommandArgument='<%# Eval("username") %>'
        OnClick="btnSendChat_Click">Send</asp:LinkButton>
</div>





protected void btnSendChat_Click(object sender, EventArgs e)
    {
        TextBox txt = this.FindControl("txtChatMessage") as TextBox;
        string username = lblChatFriend.Text;            
        ucc.InsertMessage(Session["username"].ToString(), username, txt.Text);

        string javaScript = "<script type='text/javascript'>\n" + "CallScroller();\n" + "</script>";
        ScriptManager.RegisterStartupScript(this, typeof(ChatUserControl), "startUpScript", javaScript, false);
    }

btnSendChat function is in a user control code-behind file. CallScroller function doesn't get called.

1

There are 1 best solutions below

6
On BEST ANSWER

That's because RegisterStartupScript is called when your DOM is loaded, the equivalent with jQuery to:

$(function () { ... });

Since you are capturing the events from your button inside the UpdatePanel using triggers, you are effectively partial rendering your view that's why the script registered with RegisterStartupScript will never run in this situation

Alternatives:

React to the Sys.load event

This event is raised every time a page is partial rendered.

Handle the event as follows:

    <asp:ScriptManager runat="server" ID="sm">

    </asp:ScriptManager>
    <script type="text/javascript">
        function callScroller() {
            alert("call scroller called");
        }
        Sys.Application.add_load(function () {
            if ($get("hidden").getAttribute("value") == "1") {
                callScroller();
            }
        });
    </script>

Add a HiddenField inside your UpdatePanel.ContentTemplate to use it as a flag to indicate when to call the JavaScript function, without it, your function would get called on every post

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <asp:HiddenField  runat="server" ID="hidden" Value="0" />
        ....

Finally in the code behind turn on the flag in the event that best fits your needs:

    protected void btnSendChat_Click(object sender, EventArgs e)
    {
        this.hidden.Value = "1";
    }

That's it