ASP.NET:ModalPopupExtender可防止触发按钮单击事件

时间:2010-05-20 20:28:50

标签: c# asp.net ajax modalpopupextender

以下是我要做的事情:单击我页面上的按钮,这反过来会使(2)事情发生:

  1. 显示ModalPopup以防止用户按任何按钮或更改值
  2. 调用我的代码隐藏方法,完成后隐藏ModalPopup
  3. 这是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();
    }
    

5 个答案:

答案 0 :(得分:15)

试试这个。

创建一个虚拟隐藏字段:

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

在Modal Popup声明中设置TargetcontrolID =“hdnField”。

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

modalPopup.Show();

答案 1 :(得分:3)

试试这个。这是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();
}

答案 2 :(得分:1)

首次尝试:尝试将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>

答案 3 :(得分:1)

从这个示例中,您可以轻松控制面板显示取决于条件,而不是在您单击按钮后立即显示面板。

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

答案 4 :(得分:1)

在代码背后,你可以这样做:

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

更改此'behavoirIDModal'