$ find CollapsiblePanelExtender из RegisterStartupScript возвращает ноль - PullRequest
0 голосов
/ 25 февраля 2012

У меня есть веб-страница .NET 4, которая содержит пользовательский элемент управления со следующим:

<asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server">
</asp:ScriptManagerProxy>
<asp:LinkButton ID="btnExpand" runat="server" Text="Expand..." ClientIDMode="AutoID"
    OnClick="btnExpand_Click"></asp:LinkButton>
<asp:Label ID="btnDummy" runat="server"></asp:Label>
<asp:Panel ID="pnlMyPanel" runat="server">
     <p>content</p>
</asp:Panel>
<ajaxToolkit:CollapsiblePanelExtender ID="cpeMyPanel" runat="server"
    TargetControlID="pnlMyPanel" Collapsed="True" ExpandControlID="btnDummy"
    CollapseControlID="btnDummy" BehaviorID="cpe">
</ajaxToolkit:CollapsiblePanelExtender>

При нажатии кнопки «Развернуть» выполняется следующий код:

protected void btnAddComment_Click(object sender, EventArgs e)
{
    string script = "var cpeMyPanel = $find('" + cpeMyPanel.BehaviorID + "');\r\n" +
                    "if (cpeMyPanel != null)\r\n" +
                    "   cpeMyPanel.expandPanel();\r\n" +
                    "else\r\n" +
                    "   alert(cpeMyPanel is null');";
    ScriptManager.RegisterStartupScript(Page, Page.GetType(),
             "Expand", script, true);
}

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

Есть идеи, что мне может не хватать?Есть ли лучший способ сделать это?

Заранее спасибо,

Дан

1 Ответ

1 голос
/ 14 апреля 2012

RegisterStartupScript выполняется перед созданием панели на стороне клиента (найдите на странице функцию $ create).Цель состоит в том, чтобы отложить выполнение вашего сценария до того момента, когда будут созданы все компоненты на стороне клиента.AJAX Control Toolkit использует этот трюк :

(function () {
    var fn = function () {
        var ajaxControl = $find('AJAX control');
        // do something usefull
    };

    Sys.Application.add_load(fn);
})();

У меня нет опыта работы с AJAX Toolkit, но, скорее всего, есть какой-то вспомогательный метод, который заботится о регистрации скрипта.Я бы начал с ToolkitScriptManager.

См. сообщение в блоге , когда вас интересует, почему такое сложное решение необходимо для такой простой задачи:).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...