ModalPopupExtender的“OK”按钮单击事件为什么没有触发?

44

我在UpdatePanel内有一个按钮,该按钮作为ModalPopupExtender的确定按钮使用。但是,点击该按钮时事件没有触发。有什么建议吗?我有什么遗漏吗?

<asp:updatepanel id="UpdatePanel1" runat="server">
    <ContentTemplate>
        <cc1:ModalPopupExtender ID="ModalDialog" runat="server" 
            TargetControlID="OpenDialogLinkButton"
            PopupControlID="ModalDialogPanel" OkControlID="ModalOKButton"
            BackgroundCssClass="ModalBackground">
        </cc1:ModalPopupExtender>
        <asp:Panel ID="ModalDialogPanel" CssClass="ModalPopup" runat="server">
            ...
            <asp:Button ID="ModalOKButton" runat="server" Text="OK" 
                        onclick="ModalOKButton_Click" />
        </asp:Panel>
    </ContentTemplate>
</asp:updatepanel>
8个回答

53

Aspx

<ajax:ModalPopupExtender runat="server" ID="modalPop" 
            PopupControlID="pnlpopup" 
            TargetControlID="btnGo"
              BackgroundCssClass="modalBackground"
             DropShadow="true"
             CancelControlID="btnCancel" X="470" Y="300"   />


//Codebehind    
protected void OkButton_Clicked(object sender, EventArgs e)
    {

        modalPop.Hide();
        //Do something in codebehind
    }

不要将“确定”按钮设置为OkControlID。


这个可以工作,但请注意“OkButton_Clicked”需要在弹出窗口按钮的OnCommand中,如下所示:<asp:Button ID="btnDelete" runat="server" CommandArgument='<%# Eval("Id") %>' OnCommand="OkButton_Clicked" /> - jroyce

10
It appears that a button used as the OK or CANCEL button for a ModalPopupExtender cannot have a click event. I tested this by removing the

.
OkControlID="ModalOKButton"

从ModalPopupExtender标签中触发button点击事件。 我需要想出另一种将数据发送到服务器的方式。


8

也有可能是按钮需要具有CausesValidation="false"。这对我起作用了。


1
哇,好了。我的问题与确定按钮无关,而是普通老式的按钮点击未提交。 - DOK
那么当 CausesValidation 需要为“true”时怎么办?将其设置为“false”可以解决一个问题,但会引起另一个问题... - Captain Sensible
这对我有用,当我将我的应用程序从.NET 2.0升级到.NET 4.5后,我的按钮停止触发。但是使用CausesValidation="false"它又可以工作了。谢谢! - Guilherme de Jesus Santos
是的,但现在你必须在服务器上进行手动验证调用。 - Fandango68

6

我刚刚在寻找解决方案 :)

看起来,如果您想让控件触发事件,就不能将OkControlID分配给该控件,只需删除此属性即可使所有功能正常工作。

我的代码(已经有效):

<asp:Panel ID="pnlResetPanelsView" CssClass="modalPopup" runat="server" Style="display:none;">
    <h2>
        Warning</h2>
    <p>
        Do you really want to reset the panels to the default view?</p>
    <div style="text-align: center;">
        <asp:Button ID="btnResetPanelsViewOK" Width="60" runat="server" Text="Yes" 
            CssClass="buttonSuperOfficeLayout" OnClick="btnResetPanelsViewOK_Click" />&nbsp;
        <asp:Button ID="btnResetPanelsViewCancel" Width="60" runat="server" Text="No" CssClass="buttonSuperOfficeLayout" />
    </div>
</asp:Panel>
<ajax:ModalPopupExtender ID="mpeResetPanelsView" runat="server" TargetControlID="btnResetView"
    PopupControlID="pnlResetPanelsView" BackgroundCssClass="modalBackground" DropShadow="true"
    CancelControlID="btnResetPanelsViewCancel" />

5
在按钮控件中添加属性"UseSubmitBehavior=false"。

2

我经常使用一个空标签作为TargetControlID。例如:<asp:Label ID="lblghost" runat="server" Text="" />

我看到两件事会导致单击事件不触发:
1. 您必须删除OKControlID(正如其他人所提到的)
2. 如果您正在使用字段验证器,则应在按钮上添加CausesValidation ="false"。

对我来说,这两种情况的行为方式都是相同的。


2

之前的回答对我都不起作用。我在OnOkScript事件中调用了按钮的postback。

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

如果您从ModalPopupExtender中删除OKControlID,则按钮将像正常一样进行回发。在您的事件中,您可以调用ModalPopupExtender.Hide()来隐藏弹出窗口。 - Kyle Trauberman

1
我发现了一种在无需 postback 的情况下验证模态弹出窗口的方法。
在 ModalPopupExtender 中,我将 OnOkScript 设置为一个函数,例如 ValidateBeforePostBack()。然后在该函数中,我调用 Page_ClientValidate 对我想要验证的验证组进行验证,进行检查,如果失败,则保持模态弹出窗口显示。如果通过,则调用 __doPostBack。
function ValidateBeforePostBack(){ 
     Page_ClientValidate('MyValidationGroupName'); 
     if (Page_IsValid) { __doPostBack('',''); } 
     else { $find('mpeBehaviourID').show(); } 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接