Как установить метод, который скрывает ModalPopupExtender при нажатии кнопки?

1

У меня есть modal:

<asp:ModalPopupExtender runat="server" ID="popUp" TargetControlID="btn1" PopupControlID="pnlP" BackgroundCssClass="modalBackground" DropShadow="true" />

С помощью этой updatePanel:

<asp:UpdatePanel ID="pnlP" runat="server" Width="600" Height="650">
    <ContentTemplate>
        <asp:Label Text="Hola" runat="server" />
        <asp:Button ID="btnCerrarPopUp" runat="server" OnClick="ocultarModal" Text="Adios!" />
    </ContentTemplate>
</asp:UpdatePanel>

То, что я пытаюсь сделать, - создать унифицированный метод, который скрывает ModalPopupExtender, когда нажата кнопка внутри панели, показанная ModalPopupExtender, поэтому, если у меня есть "N" ModalPopupExtender с кнопкой, которая скрывает его, я всегда буду называть тот же метод независимо от того, который ModalPopupExtender → панель → кнопка не нажата.

Как я могу определить, какой ModalPopupExtender должен скрываться?

protected void ocultarModal(Object sender, EventArgs e)
{
    // Identify which ModalPopupExtender should hide
    // thatModal.Hide();
}

Помните, что у меня много ModalPopupExtender которые показывают panel с button которая должна вызывать тот же метод, чтобы скрыть этот ModalPopupExtender.

Помоги пожалуйста.

Теги:
ajaxcontroltoolkit

2 ответа

1
Лучший ответ

Вместо использования OnClick используйте OnCommand, передав Modal Identifier в качестве аргумента команды. Затем в Code-Behind извлеките аргумент из события OnCommand и закройте modal с помощью соответствующего ModalPopupExtender. Ниже приведен пример:

<asp:ModalPopupExtender runat="server" ID="popUp1" TargetControlID="btn1" PopupControlID="pnlP" BackgroundCssClass="modalBackground" DropShadow="true" />


<asp:UpdatePanel ID="pnlP" runat="server" Width="600" Height="650">
    <ContentTemplate>
        <asp:Label Text="Hola" runat="server" />
        <asp:Button ID="btnCerrarPopUp" runat="server" OnCommand="ocultarModalCommand" CommandArgument="popUp1" Text="Adios!" />
    </ContentTemplate>
</asp:UpdatePanel>

Вы можете увидеть выше модальный всплывающий расширитель и панель обновления для модального 1. Здесь вместо использования OnClick был использован OnCommand, а в качестве CommandArgumkent был установлен идентификатор модального всплывающего расширителя: "popUp1".

Как, посмотрите на слушателя ниже:

protected void ocultarModalCommand(Object sender, CommandEventArgs e)
{
    // Identify which ModalPopupExtender should hide
    String extenderId = (String) e.CommandArgument;
    // hide popup 1
    if (extenderId.equals("popUp1") {
        popUp1.Hide();
    } else if (extender.equals("popUp2") {
        // hide popup2
    }
    // check all other modals

}

Над слушателем команды получает имя расширителя, которое задано в аргументе Command. Исходя из этого, он знает, какой Modal закрыть.

Более того, вы можете сделать что-то приятное с слушателем, как и код ниже:

protected void ocultarModalCommand(Object sender, CommandEventArgs e)
{
    // Identify which ModalPopupExtender should hide
    String extenderId = (String) e.CommandArgument;
    // get the control based on its id
    ModalPopupExtender extender = (MOdalPopupExtender) FindControl(extenderId);
    if (extender != null)
    {
        extender.Hide();
    }
}

В приведенном выше коде вы найдете расширитель на основе идентификатора, указанного в аргументе Command. Однако, если идентификатор ошибочно установлен, null будет возвращен и ничего не будет скрыто. Этот код имеет огромное преимущество в том, что он намного меньше предыдущего.

Там у вас есть это, единственное событие, которое может закрыть все ваши Модалы.

  • 0
    Эй, я получаю эту ошибку в String extenderId = e.CommandArgument ;: Ошибка 982 Не удается неявно преобразовать тип «объект» в «строку». Существует явное преобразование (вам не хватает приведения?) Я попробовал это: String extenderId = (String) e.CommandArgument; ModalPopupExtender extender = (ModalPopupExtender) FindControl (extenderId); но extender всегда нулевой. Но почему?
  • 0
    По поводу вашего первого вопроса. Я только что обновил код: e.CommandArgument нуждается в приведении к String. О вашем втором вопросе: он возвращает ноль либо потому, что идентификатор написан с ошибкой, либо потому, что ваш расширитель находится в другом компоненте, таком как панель, панель обновления или что-то еще. Таким образом, вам нужно использовать FindControl, чтобы сначала получить внешний элемент управления и получить внутренние.
Показать ещё 10 комментариев
1

Рассмотрите возможность использования JavaScript. Всплывающий элемент заканчивается суффиксом _foregroundElement, поэтому вы можете легко получить его с помощью jQuery (заканчивается с селектором идентификаторов для элемента, который является родителем кнопки).

Затем _foregroundElement часть _foregroundElement и используйте $find(theRemainingPartOfTheString)

В этом случае у вас есть ссылка на клиентский объект элемента управления, независимо от его фактического идентификатора или бутона.

Затем вызовите его метод hide() и все готово. Удаление обратной передачи сделает вашу страницу быстрее :).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню