ASP.NET: ModalPopupExtender предотвращает событие нажатия кнопки при запуске
Вот что я пытаюсь сделать: нажмите кнопку на моей странице, которая, в свою очередь, совершит (2):
- Показать ModalPopup, чтобы пользователь не нажимал никаких кнопок или менял значения
- Вызвать мой код за методом, скрыв ModalPopup при завершении
Вот разметка ASP:
<asp:UpdatePanel ID="UpdatePanel2" runat="server" ChildrenAsTriggers="true"
UpdateMode="Always">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnSaveData" EventName="Click" />
</Triggers>
<ContentTemplate>
<asp:Panel ID="pnlHidden" runat="server" style="display: none;">
<div>
<h1>Saving...</h1>
</div>
</asp:Panel>
<cc1:ModalPopupExtender ID="modalPopup"
BackgroundCssClass="modalBackground" runat="server"
TargetControlID="btnSaveData" PopupControlID="pnlHidden"
BehaviorID="ShowModal">
</cc1:ModalPopupExtender>
<asp:Button ID="btnSaveData" runat="server" Text="Save Data"
OnClick="btnSaveData_Click" />
</ContentTemplate>
</asp:UpdatePanel>
Теперь вот мой код за кодом С#:
protected void btnSaveData_Click(object sender, EventArgs e)
{
UpdateUserData(GetLoggedInUser());
modalPopup.Enabled = false;
}
Почему это не работает? ModalPopup отображается отлично, но событие btnSaveData_Click НИКОГДА не запускается.
ОБНОВЛЕНИЕ: Первое предложение не помогло мне. Я также попробовал ваше второе предложение (в той мере, в какой это применимо ко мне). Одно из моих незначительных отличий в том, что на моей модальной панели нет кнопки (pnlHidden) - это просто сообщение. Я попытался использовать события Javascript на стороне клиента, которые, по крайней мере, срабатывали одновременно с моим серверным событием. Это была хорошая новость, но я не могу найти или захватить дескриптор ModalPopupExtender или его BehaviorID. Это не работает:
function showOverlay() {
var popup = $find('modalPopup');
popup.show();
}
popup ВСЕГДА равно null.
ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ: Это мое окончательное решение для его работы (обратите особое внимание на использование OnClientClick и OnClick):
<asp:UpdatePanel ID="UpdatePanel2" runat="server" ChildrenAsTriggers="true"
UpdateMode="Always">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnSaveData" EventName="Click" />
</Triggers>
<ContentTemplate>
<asp:Panel ID="pnlHidden" runat="server" style="display: none;">
<div>
<h1>Saving...</h1>
</div>
</asp:Panel>
<cc1:ModalPopupExtender ID="modalPopup"
BackgroundCssClass="modalBackground" runat="server"
TargetControlID="hdnField" PopupControlID="pnlHidden"
BehaviorID="ShowModal">
<asp:HiddenField ID="hdnField" runat="server" />
</cc1:ModalPopupExtender>
<asp:Button ID="btnSaveData" runat="server" Text="Save Data"
OnClientClick="showModal();" OnClick="btnSaveData_Click" />
</ContentTemplate>
</asp:UpdatePanel>
Использование этой функции Javascript:
function showModal() { $find('ShowModal').show(); }
... И этот код позади:
protected void btnSaveData_Click(object sender, EventArgs e)
{
UpdateUserData(GetLoggedInUser());
modalPopup.hide();
}
Ответы
Ответ 1
Попробуйте это.
Создайте скрытое скрытое поле:
<asp:HiddenField ID="hdnField" runat="server" />
Задайте TargetcontrolID = "hdnField" в объявлении Модального всплывающего окна.
В вашем событии btnSaveData_Click сделайте следующее:
modalPopup.Show();
Ответ 2
Попробуйте это. Он работает на 100%
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Button ID="Btnshow" runat="server" Text="Show" OnClick="Btnshow_Click" />
<asp:Button ID="BtnTarget" runat="server" Text="Target" Style="display: none" />
<asp:TextBox ID="TextBox1" runat="server">
</asp:TextBox>
<input type="button" value="Get" onclick="abc()" />
<asp:ModalPopupExtender ID="ModalPopupExtender1" runat="server" TargetControlID="BtnTarget"
PopupControlID="Panel1">
</asp:ModalPopupExtender>
<asp:Panel ID="Panel1" runat="server" BackColor="Black" Width="300px" Height="300px">
<asp:UpdatePanel ID="UpdatePanel2" runat="server" ChildrenAsTriggers="false" UpdateMode="Conditional">
<ContentTemplate>
<asp:Button ID="BtnHide" runat="server" Text="Hide Button" OnClick="BtnHide_Click" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="BtnHide" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
</asp:Panel>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Btnshow" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
Кодовый код сервера
protected void Btnshow_Click(object sender, EventArgs e)
{
ModalPopupExtender1.Show();
}
protected void BtnHide_Click(object sender, EventArgs e)
{
ModalPopupExtender1.Hide();
}
Ответ 3
Первая попытка: попробуйте установить ButtonID в тег OkControlID и повторите попытку
ИЛИ
Вторая попытка: вызывать свое событие через javascript, кажется, есть некоторые проблемы с событиями click
<div>
<cc1:ModalPopupExtender PopupControlID="Panel1"
ID="ModalPopupExtender1"
runat="server" TargetControlID="LinkButton1" OkControlID="Ok"
OnOkScript="__doPostBack('Ok','')">
</cc1:ModalPopupExtender>
<asp:LinkButton ID="LinkButton1" runat="server">LinkButton</asp:LinkButton>
</div>
<asp:Panel ID="Panel1" runat="server">
<asp:Button ID="Ok" runat="server" Text="Ok" onclick="Ok_Click" />
</asp:Panel>
Ответ 4
В этом примере вы можете легко контролировать отображение панели, зависит от условий, а не сразу сразу появляется панель после нажатия кнопки.
<asp:Button ID="btnAdd" runat="server" OnClick="btnAdd_Click"/>
<asp:HiddenField ID="hdnField" runat="server" />
<ajaxToolkit:ModalPopupExtender runat="server"
TargetControlID="hdnField"
ID="btnAdd_ModalPopupExtender"
PopupControlID="pnlPrintName">
</ajaxToolkit:ModalPopupExtender>
<asp:Panel ID="pnlPrintName" runat="server">
.
.
</asp:Panel>
//Server side code:
protected void btnAdd_Click(object sender, EventArgs e)
{
if( dt.Rows.Count == 0 )
{
btnAdd_ModalPopupExtender.Show();
}
else
{
add();
}
}
Ответ 5
В коде позади вы можете сделать это:
if (true)
{
var script = @"Sys.Application.add_load(function() { $find('behavoirIDModal').show(); });";
ScriptManager.RegisterStartupScript(this, GetType(), "Show", script, true);
}
Измените это 'behavoirIDModal'