Sys.InvalidOperationException: обработчик должен быть функцией - PullRequest
3 голосов
/ 30 марта 2009

У меня есть веб-страница, которая содержит 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>

, которая вызывает функцию js, которая в данный момент ничего не делает.

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

В моей странице, загруженной в коде позади, я создаю пару панелей вкладок и добавляю их в контейнер. Теперь моя проблема в том, что когда я меняю вкладку, появляется окно предупреждения javascript, но как только я закрываю его, я получаю сообщение об ошибке

Ошибка времени выполнения Microsoft JScript: Sys.InvalidOperationException: обработчик должен быть функцией.

Ответы [ 2 ]

8 голосов
/ 30 марта 2009

Вам нужно удалить парены из атрибута ...

Изменить

OnClientActiveTabChanged="ChangeTab()"

до

OnClientActiveTabChanged="ChangeTab"

Просто для пояснения, когда вы добавляете парены, это буквальный вызов метода, тогда как без паренов это ссылка на метод, эти назначения работают как обратные вызовы, ожидающие делегата (ссылка на метод). Вместо этого он получает вызов метода и будет выполняться после первоначального eval (потому что это вызов), а затем потерпит неудачу при попытке вызвать его должным образом, поскольку он не является действительной ссылкой на метод.

1 голос
/ 30 марта 2009

Как правило, вам нужно только указать имя функции для вызова, поэтому «ChangeTab ()» на самом деле должно быть просто «ChangeTab».

Кроме того, функция должна технически реализовывать правильную подпись, которая была бы аналогична обработчику событий на стороне сервера: ChangeTab (отправитель, е) ....

...