DomEvent. AddHandler

#asp.net #asp.net-ajax

#asp.net #asp.net-ajax

Вопрос:

Я столкнулся с небольшой проблемой в моем веб-приложении в asp.net . я получаю приведенную ниже ошибку :

Ошибка: Исключение Sys.InvalidOperationException: Обработчик не был добавлен с помощью метода Sys.UI.DomEvent.AddHandler.AddHandler.

Я использовал Updatepanel, и эта ошибка возникает, когда я пытаюсь выполнить 2-3 действия очень быстро. и когда в следующий раз я попытаюсь выполнить какое-либо действие, мое веб-приложение просто зависнет. Пожалуйста, предложите. Спасибо

Ответ №1:

В моем случае это было вызвано наличием элемента управления «Закрыть» на панели обновления в модальном всплывающем окне. Я исправил это, создав «фиктивную» кнопку вне панели обновления и установив ее как «CancelControlID» в атрибутах MPE:

 <asp:Button ID="btnDummyCloseWindow" runat="server" Style="visibility: hidden"/>

<ajaxToolkit:ModalPopupExtender ID="mpeWindow" runat="server" PopupControlID="pnlWindow"
    TargetControlID="btnDummyOtherButton" BackgroundCssClass="modalBackground"
    DropShadow="false" CancelControlID="btnDummyCloseWindow" />
  

Вам нужно убедиться, что кнопке закрытия, которая присутствует на вашей панели обновления, назначены действия для закрытия окна (например, mpeWindow.hide()).

Также стоит отметить, что я также использовал «исправление» TargetControlID, где упоминается фиктивная кнопка, поэтому игнорируйте атрибут TargetControlID там.

Ответ №2:

Я решил проблему, установив для свойства ScriptMode ScriptManager значение Release вместо Debug, по умолчанию ScriptManager настроен на режим отладки.

Ответ №3:

У меня была такая же проблема, и я решил ее, поместив ModalPopupExtender или пользовательский элемент управления, который использует ModalPopupExtender, внутри панели обновления.

Ответ №4:

С какой стороны ни посмотри, проблема заключается в наследовании того, что, как я считаю, является ошибкой в AJAX.

Единственным способом, которым я смог решить эту проблему, было управлять вашей сортировкой или подкачкой страниц на стороне сервера, где вы управляете, или, более конкретно, обновлять UpdatePanel, а также следить за тем, чтобы ModalPopup оставался видимым!

На самом деле причина ошибки заключается в том, что, как только вы выполняете своего рода изменение страницы в GridView, который находится внутри UpdatePanel, элементы управления были «потеряны» для UpdatePanel.

Здесь есть лучшее объяснение.

Вот столбец из моего GridView…

     <asp:GridView ID="gvTETstudents" runat="server" AutoGenerateColumns="False" AllowSorting="True" CellPadding="4" ForeColor="#333333" Font-Size="Small" Width="100%"
      DataSourceID="sdsTETstudents" 
      OnRowCreated="gvTETstudents_RowCreated" 
      OnRowDataBound="gvTETstudents_RowDataBound" 
      OnDataBound="gvTETstudents_DataBound">
    <Columns>
        ..
        ..
        <ItemTemplate>
            <asp:UpdatePanel ID="upWEF1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true">
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="btnWEFCLOSE" />
                </Triggers>
                <ContentTemplate>
...
...
                    <asp:Panel ID="pnlWEF2" runat="server" style="display:none;">
                        <table><tr><td>
                        <asp:Button ID="btnWEFshow" runat="server" 
                            Text="ALL" 
                            Font-Size="Small" Font-Names="Arial" 
                            ToolTip="Click here to see all of this student's work experience feedback on file" />
                        <ajaxToolkit:ModalPopupExtender ID="mpeWEF" runat="server"
                            BackgroundCssClass="modalBackground"
                            OkControlID="btnWEFCLOSE"
                            PopupControlID="upWEF2"
                            TargetControlID="btnWEFshow">
                        </ajaxToolkit:ModalPopupExtender>
                        <asp:UpdatePanel ID="upWEF2" runat="server" UpdateMode="Conditional">
                            <ContentTemplate>
                                <asp:Panel ID="pnlWEF3" runat="server" CssClass="pnlEndorsed">
                                    <div id="Hdr" style="text-align: center">
                                        <asp:Label ID="lblWEFHdr" runat="server">** CONTACT LOG **</asp:Label>
                                    </div>
                                    <div id="Bdy">
                                        <table style="width:100%"><tr><td>
                                        <asp:GridView ID="gvWEFContactLog" runat="server" 
                                            Font-Size="X-Small" CellPadding="4" ForeColor="#333333" GridLines="None" AllowPaging="true" PageSize="8" AllowSorting="True" AutoGenerateColumns="False" Width="100%" 
                                            DataKeyNames="StudentContactLogID,Private,ApprenticeContactLogID"
                                            DataSourceID="sdsWEF"
                                            OnRowDataBound="gvWEFContactLog_RowDataBound"
                                            OnPageIndexChanging="gvWEFContactLog_PageIndexChanging" 
                                            OnSorted="gvWEFContactLog_Sorted">
                                            <Columns>
                                                <asp:TemplateField HeaderText="First Entered" SortExpression="FirstEntered">
                                                    <ItemTemplate>
                                                        <asp:HiddenField ID="hfWEFStudCLid" runat="server" Value='<%# Eval("StudentContactLogID") %>' />
                                                        <asp:HiddenField ID="hfWEFAppCLid" runat="server" Value='<%# Eval("ApprenticeContactLogID") %>' />
                                                        <asp:HiddenField ID="hfPrivate" runat="server" Value='<%# Eval("Private") %>' />
                                                        <asp:HiddenField ID="hfNotes" runat="server" Value='<%# Eval("ContactNotes") %>' />
                                                        <asp:LinkButton ID="lnkWEFCLOG" runat="server"
                                                            Text='<%# Eval("FirstEntered","{0:d MMM yyyy HH:mm}") %>'></asp:LinkButton>
                                                        <a id="lnkDummy" runat="server" visible=false></a>
                                                        <ajaxToolkit:ModalPopupExtender ID="mpeWEFCLOG" runat="server"
                                                            OkControlID="btnWEFCLOSEview"
                                                            PopupControlID="upWEFCLOG"
                                                            TargetControlID="lnkWEFCLOG">
                                                        </ajaxToolkit:ModalPopupExtender>
                                                        <asp:UpdatePanel ID="upWEFCLOG" runat="server" UpdateMode="Conditional">
                                                            <ContentTemplate>
                                                                <div id="pnlWEFCLOG" runat="server" class="pnlCLOG">
                                                                    <asp:TextBox ID="txtWEFCLOG" runat="server" 
                                                                        Wrap="true" 
                                                                        TextMode="MultiLine"
                                                                        Rows="10" 
                                                                        ReadOnly="true"
                                                                        Width="98%">
                                                                    </asp:TextBox>
                                                                    <br />
                                                                    <asp:Button ID="btnWEFCLOSEview" runat="server" Text="OK" Width="100%" />
                                                                </div>
                                                            </ContentTemplate>
                                                        </asp:UpdatePanel>
                                                    </ItemTemplate>
                                                </asp:TemplateField>
                                                <asp:BoundField DataField="Subject" HeaderText="Subject" SortExpression="Subject" />
                                                <asp:BoundField Visible="False" DataField="StudentContactLogID" HeaderText="LogID"
                                                    InsertVisible="False" ReadOnly="True" SortExpression="StudentContactLogID">
                                                    <ItemStyle HorizontalAlign="Center" />
                                                    <HeaderStyle HorizontalAlign="Center" />
                                                </asp:BoundField>
                                                <asp:BoundField DataField="StaffName" HeaderText="Staff" ReadOnly="True" SortExpression="StaffName" />
                                                <asp:TemplateField HeaderText="Contact Date Time" SortExpression="ContactDateTime">
                                                    <ItemTemplate>
                                                        <asp:Label ID="Label1" runat="server" Text='<%# Eval("ContactDateTime","{0:d MMM yyyy HH:mm}") %>'></asp:Label>
                                                    </ItemTemplate>
                                                </asp:TemplateField>
                                                <asp:TemplateField HeaderText="Follow-Up Date" SortExpression="FollowUpDate">
                                                    <ItemTemplate>
                                                        <asp:Label ID="Label2" runat="server" Text='<%# Eval("FollowUpDate","{0:d MMM yyyy}") %>'></asp:Label>
                                                    </ItemTemplate>
                                                </asp:TemplateField>
                                                <asp:BoundField DataField="Private" HeaderText="Private" SortExpression="Private" />
                                            </Columns>
                                            <EmptyDataTemplate>
                                                No Current Entries
                                            </EmptyDataTemplate>
                                            <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                                            <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
                                            <EditRowStyle BackColor="#999999" />
                                            <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
                                            <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
                                            <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                                            <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
                                        </asp:GridView>
                                        <asp:SqlDataSource ID="sdsWEF" runat="server" ConnectionString="<%$ ConnectionStrings:ATCNTV1ConnectionString %>"
                                            SelectCommand="spTETStudentContactLogView" SelectCommandType="StoredProcedure">
                                            <SelectParameters>
                                                <asp:Parameter Name="StudentID" Type="string" />
                                                <asp:Parameter Name="WEF" Type="string" DefaultValue="%" />
                                            </SelectParameters>
                                        </asp:SqlDataSource>
                                        </td></tr>
                                        <tr style="text-align: center">
                                            <td style="text-align: left">
                                                <asp:Button ID="btnWEFCLOSE" runat="server" 
                                                    Text="CLOSE" 
                                                    CausesValidation="false" Font-Bold="True" Width="61px" />
                                            </td>
                                        </tr>
                                        </table>
                                    </div>
                                </asp:Panel>
                            </ContentTemplate>
                        </asp:UpdatePanel>
                        </td></tr></table>
                    </asp:Panel>
                </ContentTemplate>
            </asp:UpdatePanel>
        </ItemTemplate>
  

Основной момент приведенного выше кода заключается в том, что у меня есть очень глубокое представление сетки внутри UpdatePanel, которая находится внутри ModalPopup.

Теперь посмотрите, что у меня есть внутри этого GridView:

 OnPageIndexChanging
  

и

 OnSorted
  

Внутри GridView есть другой ModalPopup и текстовое поле. Игнорируйте это. Это только для того, чтобы пользователь мог видеть комментарии из журнала контактов учащегося в виде другого всплывающего окна.

Итак, если мы теперь перейдем к коду, лежащему в основе двух вышеупомянутых событий:

 protected void gvWEFContactLog_Sorted(object sender, EventArgs e)
{
    GridView gvWEFCL = (GridView)sender;
    GridViewRow gvRow = (GridViewRow)gvWEFCL.NamingContainer;

    UpdatePanel upWEF1 = (UpdatePanel)gvRow.FindControl("upWEF1");
    if (upWEF1 != null) upWEF1.Update();

    AjaxControlToolkit.ModalPopupExtender mpeWEF = (AjaxControlToolkit.ModalPopupExtender)gvRow.FindControl("mpeWEF");
    if (mpeWEF != null) mpeWEF.Show();
}

protected void gvWEFContactLog_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    GridView gvWEFCL = (GridView)sender;
    GridViewRow gvRow = (GridViewRow)gvWEFCL.NamingContainer;

    UpdatePanel upWEF1 = (UpdatePanel)gvRow.FindControl("upWEF1");
    if (upWEF1 != null) upWEF1.Update();

    AjaxControlToolkit.ModalPopupExtender mpeWEF = (AjaxControlToolkit.ModalPopupExtender)gvRow.FindControl("mpeWEF");
    if (mpeWEF != null) mpeWEF.Show();
}
  

Обратите внимание, что я фактически не контролирую сортировку или саму подкачку. Я всего лишь заставляю GridView вызывать основную панель обновления (upWEF1) для обновления с помощью вызова Update(). Следующий шаг — захватить ModalPopup, который я хочу сохранить видимым, и повторно показать () его!

И это все, что от него требуется!

Я уверен, что есть более чистое решение, использующее сам JavaScript, но для меня это позволяет избежать этой ужасной бессмысленной ошибки, и у меня есть чистый набор всплывающих окон и панелей обновления, которые могут обрабатывать как горячие ссылки, так и сортировку и подкачку, как я хочу, чтобы выполнялся GridView!

Комментарии:

1. О, и убедитесь, что у вас есть EnablePartialRendering =»true» на вашей главной странице