У меня есть 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.
Помоги пожалуйста.
Вместо использования 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 будет возвращен и ничего не будет скрыто. Этот код имеет огромное преимущество в том, что он намного меньше предыдущего.
Там у вас есть это, единственное событие, которое может закрыть все ваши Модалы.
Рассмотрите возможность использования JavaScript. Всплывающий элемент заканчивается суффиксом _foregroundElement
, поэтому вы можете легко получить его с помощью jQuery (заканчивается с селектором идентификаторов для элемента, который является родителем кнопки).
Затем _foregroundElement
часть _foregroundElement
и используйте $find(theRemainingPartOfTheString)
В этом случае у вас есть ссылка на клиентский объект элемента управления, независимо от его фактического идентификатора или бутона.
Затем вызовите его метод hide()
и все готово. Удаление обратной передачи сделает вашу страницу быстрее :).
e.CommandArgument
нуждается в приведении к String. О вашем втором вопросе: он возвращает ноль либо потому, что идентификатор написан с ошибкой, либо потому, что ваш расширитель находится в другом компоненте, таком как панель, панель обновления или что-то еще. Таким образом, вам нужно использовать FindControl, чтобы сначала получить внешний элемент управления и получить внутренние.