У меня были похожие проблемы с несколькими элементами управления ModalPopupExtender на одной странице. В конце концов, решение, которое я придумал, состояло в том, чтобы на моей главной странице был только один ModalPopupExtender и связанная всплывающая панель управления. Панель, с которой связан ModalPopupExtender через атрибут PopupControlID, содержит элемент управления меткой, на который можно ссылаться из других областей вашего кода. Всякий раз, когда мне нужен элемент управления на странице для вызова всплывающей панели, у меня просто есть элемент управления (кнопка, изображение и т. Д.), Вызывающий метод show ModalPopupExtender из кода позади.
Например, вот моя разметка для расширителя и панели на главной странице:
<asp:Button ID="btnPopupInvoker" runat="server" style="display: none" />
<asp:ModalPopupExtender ID="modalPopupExtender" runat="server"
OkControlId="btnPopupOk" TargetControlId="btnPopupInvoker"
PopupControlId="pnlPopup" BackgroundCssClass="modalPopupBG"/>
<% // Broken rules popup %>
<asp:panel class="popupConfirmation" ID="pnlPopup" style="display: none;" runat="server">
<div class="popupContainer">
<div class="popupTitleBar" id="divPopupHeader">
<div>
<asp:Label ID="lblPopupTitle" runat="server" />
</div>
</div>
<div class="popupBody">
<div>
<asp:Label ID="lblPopupBody" runat="server" />
</div>
</div>
<div class="popupButtons">
<div>
<asp:Button ID="btnPopupOk" runat="server" Text="Close" />
</div>
</div>
</div>
</asp:panel>
Обратите внимание, как я использую эту фиктивную кнопку для назначения экстендеру через атрибут TargetControlId:
<asp:Button ID="btnPopupInvoker" runat="server" style="display: none" />
Эта кнопка скрыта с помощью css. Сама кнопка ничего не делает, кроме того, что является маркером, который требуется экстендеру для правильной работы.
Теперь вот мой код, который вызывается из кода после нажатия кнопки отправки:
/// <summary>
/// Loops through all the broken rules and displays them in a popup panel.
/// </summary>
/// <param name="rules">Broken rules collection.</param>
protected void DisplayBrokenRules(BrokenRulesCollection rules)
{
Label titleLabel = Master.FindControl("lblPopupTitle") as Label;
if (titleLabel != null)
{
titleLabel.Text = Properties.StringLibrary.Label_BrokenRulesPopupTitle;
}
Label bodyLabel = Master.FindControl("lblPopupBody") as Label;
if (bodyLabel != null)
{
bodyLabel.Text = string.Empty;
foreach (BrokenRule rule in rules)
{
bodyLabel.Text += String.Concat(rule.Description, "<br />");
}
ModalPopupExtender mpe = Master.FindControl("modalPopupExtender") as ModalPopupExtender;
if (mpe != null)
{
mpe.Show();
}
}
}
Используя этот подход, я могу повторно использовать один и тот же ModalPopupExtender (и связанную всплывающую панель cotnrol), обращаясь к нему / манипулируя им из различных элементов управления на моей странице. Это также позволяет избежать использования нескольких элементов управления ModalPopupExtender, что просто увеличивает размер вашей страницы.did