如何在postback时防止模态弹出窗口(ModalPopupExtender)关闭?

15

我正在使用微软的AjaxControlToolkit实现模态弹出窗口。

在模态弹出窗口中,当发生回发时,窗口会关闭。如何防止模态弹出窗口关闭的操作?


阿里老师,你找到解决方法了吗?我也遇到了同样的问题。 - Mahmut EFE
7个回答

12
将您的控件放在UpdatePanel中。请参阅我的示例代码,pnlControls是一个控件,它包含将显示在弹出窗口中的控件:

将您的控件放在UpdatePanel中。请参阅我的示例代码,pnlControls是一个控件,它包含将显示在弹出窗口中的控件:

<asp:Panel ID="pnlControls" runat="server">

    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
               <asp:Button ID="TestButton" runat="server" Text="Test Button" onclick="TestButton_Click" />
            <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>         
        </ContentTemplate>

    </asp:UpdatePanel>

这将为您完成工作 :)

最好的问候, Gregor Primar


这个很好用。如果需要的话,您实际上可以将整个控件集包装在模态框中,以帮助防止创建大量具有触发器的其他UpdatePanels。 - atconway
我本来以为这会起作用,但是它没有解决我的问题,模态框仍然显示然后关闭...有人知道为什么它在显示后就关闭了吗?我希望用户点击按钮后,模态框显示并保持打开状态,直到用户关闭。另外,对于那些尝试相同方法的人,您需要在面板之前添加ScriptManager标记,并且每个页面只允许一个此类标记,因此请将其放在主页中;)。 - Dimitri

10
您可以在PostBack期间调用Show()方法,以防止模态弹出窗口关闭。
MyModalPopoupExtender.Show()

这对我起作用了,并且消除了似乎毫无作用的UpdatePanels的需求。 - undefined

4
protected void Page_Load(object sender, EventArgs e)
{
    if (Page.IsPostBack)
    {
        // reshow
        MyModalPopup.Show()
    }
}

3

我曾经遇到过相同的问题,即在postbacks期间保持模态框打开。

我的解决方案:

使用EventTarget来确定postback是否来自模态框中的控件,并且如果是,则保持模态框打开。当且仅当模态框打开时,postback才可能来自模态框中的控件。

在包含模态框的页面控件的load事件中,确定postback是否来自我的子级。 确定它是否来自模态面板中的控件。

    Protected Sub Control_Load(sende As Object, e As EventArgs) Handles Me.Load
        If IsPostBack Then
            Dim eventTarget As String = Page.Request.Params.Get("__EventTarget")
            Dim eventArgs As String = Page.Request.Params.Get("__EventArgument")

            If Not String.IsNullOrEmpty(eventTarget) AndAlso eventTarget.StartsWith(Me.UniqueID) Then
                If eventTarget.Contains("$" + _credentialBuilder.ID + "$") Then
                    ' Postback from credential builder modal.  Keep it open.
                    showCredentialBuilder = True
                End If
            End If
        End If
    End Sub

在预渲染中,检查我的标志并手动显示模态框。
    Protected Sub Control_PreRender(ByVal sende As Object, ByVal e As EventArgs) Handles Me.PreRender
        If showCredentialBuilder Then
            _mpeCredentialEditor.Show()
        End If
    End Sub

1

根据之前的情况...

在 Simple.aspx 中,用户必须输入公司名称。如果用户不记得公司名称,他可以点击一个按钮打开弹出式模态窗口。

我想在模态窗口中允许用户搜索公司列表。他可以输入部分名称并单击搜索。匹配项将显示在列表下方。他可以单击列表中的项目并返回。如果公司不存在,他可以单击“新建”按钮创建一个新公司。

因此,可以看出,我想在这个模态窗口中提供许多功能。

谢谢!

JC


在这种情况下,从用户控件定义一个自定义事件到父页面,在该事件中编写代码以打开模态弹出窗口。 - Ankit

1

就像你可能已经知道的那样,模态弹出窗口仅在客户端上运行。是的,在postback期间可以在其中收集信息,但如果进行postback,它将100%隐藏。

当然,像其他提议的方法一样,在postback期间可以执行.show,但这取决于您需要做什么。

实际上,我不知道您为什么需要postback,如果是为了某些验证,请尝试在客户端执行它们。

您能告诉我们为什么需要进行postback吗?也许我们可以更好地帮助您! :)


1
嘿,谢谢你的回答,但我真的不记得问题是什么了 :) 我想我们已经解决它了。 - Ali Ersöz
1
哈哈哈!!! 好的,那就行XD 如果您不介意的话,也许您可以发布您的解决方案(目前的工作方式)。我对这个案例非常好奇,我想看看您是如何做到的! - ForceMagic
对我来说,我需要我的按钮在我的代码后台运行服务器端代码。有没有一种方法可以在没有回发的情况下实现这一点? - undefined

1

我猜那种方法可以行得通,但不适用于我的情况。我有一个在模态弹出窗口中打开的用户控件,这个用户控件会自动发出postback请求。因此,在该用户控件中,我没有模态弹出窗口的属性。

我猜我需要为我的用户控件创建一个事件,并且打开模态弹出窗口的页面需要在此事件中重新打开它。


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