ASP.NET: ModalPopupExtender предотвращает срабатывание события нажатия кнопки - PullRequest
15 голосов
/ 21 мая 2010

Вот что я пытаюсь сделать: Нажмите кнопку на моей странице, что, в свою очередь, приводит к (2) вещам:

  1. Отображение ModalPopup, чтобы пользователь не мог нажимать какие-либо кнопки или изменять значения
  2. Вызовите метод с кодом, скрывая 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>

Вот мой код на C #:

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();
}

всплывающее окно ВСЕГДА равно нулю.

ФИНАЛЬНОЕ ОБНОВЛЕНИЕ: Это мое окончательное решение для того, чтобы заставить это работать (обратите особое внимание на использование OnClientClick AND 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();
}

Ответы [ 5 ]

15 голосов
/ 21 мая 2010

Попробуйте это.

Создать фиктивное скрытое поле:

<asp:HiddenField ID="hdnField" runat="server" />

Установите TargetcontrolID = "hdnField" в объявлении модального всплывающего окна.

В вашем событии btnSaveData_Click сделайте следующее:

modalPopup.Show();
3 голосов
/ 14 мая 2012

Попробуй это. 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();
}
1 голос
/ 04 ноября 2016

В коде, вы можете сделать это:

if (true)
{
    var script = @"Sys.Application.add_load(function() { $find('behavoirIDModal').show(); });";
    ScriptManager.RegisterStartupScript(this, GetType(), "Show", script, true);
}

Измените это 'поведениеvoirIDModal'

1 голос
/ 31 июля 2014

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

<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();
  }
}
1 голос
/ 21 мая 2010

Первая попытка: попробуйте установить свой ButtonID в тег OkControlID и повторите попытку

OR

Вторая попытка: назовите ваше событие поверх javascript, похоже, есть проблемы с событиями клика

<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>
...