【问题标题】:ASP.NET: ModalPopupExtender prevents button click event from firingASP.NET:ModalPopupExtender 防止触发按钮单击事件
【发布时间】:2011-02-22 01:58:38
【问题描述】:

这是我想要做的事情:点击我页面上的一个按钮,这反过来会导致 (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();
}

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

【问题讨论】:

    标签: c# asp.net ajax modalpopupextender


    【解决方案1】:

    试试这个。

    创建一个虚拟隐藏字段:

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

    在您的 Modal Popup 声明中设置 TargetcontrolID = "hdnField"。

    在您的 btnSaveData_Click 事件中,执行以下操作:

    modalPopup.Show();
    

    【讨论】:

    • 你知道有什么奇怪的,我尝试了这个确切的概念,但使用的是虚拟按钮而不是隐藏字段。这不起作用(使用 Button),但现在它可以使用 HiddenField。后续问题:弹出窗口显示,我的数据库调用已完成,但 modalPopup.Hide() 执行速度太快,任何减慢它的尝试都会导致根本不显示弹出窗口。任何解决方法的想法?
    • 如果您只是想使用模式弹出窗口作为“加载”屏幕,我建议将其放入 asp:UpdateProgress。如果速度很快,那很好,对吧?你有点希望它快点。当然,您可以通过执行 System.Threading.Thread.Sleep(2000); 来延迟任何事情; (2 秒)。我绝对不建议这样做。
    • 我试过 System.Threading.Thread.Sleep(2000);在我发布我的最后一条评论之前,当我这样做时,模式完全消失了(从未弹出)。我会试试 asp:UpdateProgress 控件。
    • 这个修复对我有用,但需要注意的是,在你的隐藏字段上不要加倍努力并添加 visible="false"。这会杀死你的 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 调用您的事件,点击事件似乎有一些问题

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-09-23
            • 2014-05-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-04-28
            相关资源
            最近更新 更多