Search code examples
c#.netjavascripttabsajaxcontroltoolkit

Sys.InvalidOperationException: Handler must be a function


I've a webpage which contains a TabContainer

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
...
....
<form id="form1" runat="server">
    <asp:ScriptManager ID="sm1" runat="server"></asp:ScriptManager>
    <cc1:TabContainer runat="server" ID="tbcTabContainer" OnClientActiveTabChanged="ChangeTab()"></cc1:TabContainer>
</form>

which calls a js function which at the moment does nothing.

<script  type="text/javascript">
function ChangeTab()
{
    alert('Sucesss');
}
</script>

In my page load in the code behind I create a couple of tab panels and add them to the container. Now, my problem is that when i change tab, the javascript alert box shows but once i close it i get the error

Microsoft JScript runtime error: Sys.InvalidOperationException: Handler must be a function.


Solution

  • You need to remove the parens from the attribute...

    Change

    OnClientActiveTabChanged="ChangeTab()"
    

    to

    OnClientActiveTabChanged="ChangeTab"
    

    Just for clarification when you add the parens it is a literal method call whereas without the parens it is a reference to the method, these assignments work like callbacks expecting a delegate (method reference). Instead it is getting method call and will execute upon original eval (because it is a call) and then fail when attempting to be invoked properly because it is mot an actual method reference.