动态 ModalPopupExtender 未触发 OK Click 事件

Dynamic ModalPopupExtender not firing the OK Click event

ASP.NET 4.7.2 Web 表单 c# VS 2019

我正在尝试使用 modalpopupextender 提示输入外键字段的新数据。与表单本身一样,MPE 是在代码中动态构建的——在本例中是 Javascript 触发以构建和显示 MPE 的隐藏按钮的点击处理程序。

我阅读了 SO 和 ASP 论坛上的每一篇文章,并尝试了我在那里看到的所有内容。没有快乐。我完美地得到了弹出窗口。点击 OK 关闭弹出窗口,但永远不会触发 OK 事件。

代码如下:

    //Building the form, we do this in OnInit:
    // AJAX Update Panel
    UpdatePanel PUP = new UpdatePanel()
    {
        ID = "PUP",
    };
    PlaceHolder.Controls.Add(PUP);                
    // HiddenField containing the field name to permit 
    // creating the correct modalpopup.
    HiddenField HFPopupField = new HiddenField()
    {
        ID = "HF_POPUP"
    };
    PUP.ContentTemplateContainer.Controls.Add(HFPopupField);
    // Create Hidden button to track the popup
    Button BPopup = new Button()
    {
        ID = "BPOPUP",
        UseSubmitBehavior = false  
    };
    BPopup.Click += BPopup_Click;
    BPopup.Attributes.Add("style", "display: none;");
    PUP.ContentTemplateContainer.Controls.Add(BPopup);
    // And create the background panel for the popup.
    Panel PnlPopup = new Panel()
    {
        ID = "PNLPOPUP",
        CssClass = "MpeBackground"
    };
    PnlPopup.Attributes.Add("style", "display: none;");
    PUP.ContentTemplateContainer.Controls.Add(PnlPopup);


    /// Event handler for hidden button.
    protected void BPopup_Click(object sender, EventArgs e)
    {
        [snip -- code to get the dataset that is being filled]
        UpdatePanel PUP = Placeholder.FindControlRecursive("PUP");
        Table T = new Table()
        {
            CssClass = "PopupTbl"
        };
        TableRow TRTitle = new TableRow();
        TableCell TCTitle = new TableCell()
        {
            CssClass = "PopupTitle",
            ColumnSpan = 2
        };
        Label LPopTitle = new Label()
        {
            Text = [title of the popup]
        };
        TCTitle.Controls.Add(LPopTitle);
        TRTitle.Cells.Add(TCTitle);
        DataRow drData = null;
        // Add Fields, and also the cancel and Add buttons
        foreach (DataColumn DC in dsColumns.Tables[0].Columns)
        {
            TableRow TRColumn = [create a tablerow with 2 columns, a prompt and the input field]
            if (TRColumn != null) 
            { 
                T.Rows.Add(TRColumn);
                [snip]
            }
        }   // end of foreach(DataColumn DC in dsColumns.Tables[0].Columns)  
        PnlWindow.Controls.Add(T);
        TableRow TRButtons = new TableRow();
        TableCell TCButtons = new TableCell()
        {
            ColumnSpan = 2,   
            CssClass="PopupButtons"
        };
        Button MPEBOK = new Button()
        {
            ID = "MPE" + sFieldName + "_MPEBOK",
            Text = "OK",
            CausesValidation = false,
            UseSubmitBehavior = false
        };
        MPEBOK.Click += MPEBOK_Clicked;
        TCButtons.Controls.Add(MPEBOK);
        LiteralControl LCB = new LiteralControl()
        {
            Text = "  "
        };
        TCButtons.Controls.Add(LCB);
        //************************************************************
        //*** Postback Trigger                                     ***
        //************************************************************
        AsyncPostBackTrigger trigger = new AsyncPostBackTrigger()
        {
            ControlID = MPEBOK.ID,
            EventName = "click"
        };
        PUP.Triggers.Add(trigger);
        //************************************************************
        //*** Cancel Button                                        ***
        //************************************************************
        Button MPEBuhBye = new Button()
        {
            ID = "MPE" + sFieldName + "_BUHBYE",
            Text = "Cancel",
            UseSubmitBehavior = false
        };
        TCButtons.Controls.Add(MPEBuhBye);
        TRButtons.Cells.Add(TCButtons);
        T.Rows.Add(TRButtons);
        PnlPopup.Controls.Add(PnlWindow);
        AjaxControlToolkit.ModalPopupExtender MPE = new AjaxControlToolkit.ModalPopupExtender()
        {
            ID = "MPE" + sFieldName,
            PopupControlID = "PNLPOPUP",
            TargetControlID = "BPOPUP",
            BackgroundCssClass = "MpeBackground"
        };
        // Add the MPE to the UpdatePanel.
        PUP.ContentTemplateContainer.Controls.Add(MPE);
        // Show the modal popup extender.
        MPE.Show();
    }

    protected void MPEBOK_Clicked(object sender, EventArgs e)
    {
        [snip - this never fires]
    }

我不知道这里发生了什么。任何人都可以看到一些奇怪的东西吗?

谢谢 约翰.

您不能添加服务器端按钮或将服务器端按钮插入页面 DOM。

当您将 asp.net 按钮拖到表单上时,“mypage.cs”和 mypage.desinger.cs 都会更新。按钮的连接发生在设计时,您还必须修改 mypage.desinger.cs 并添加按钮事件存根。

所以你不能这样做。

折衷方案是添加一些 js 并让 HTML 按钮执行您放入该页面的隐藏 asp.net 按钮的 .click() 方法(这会给您post 后面,运行ning 后面有一个单独的按钮事件代码存根。

此事件解决发生在编译时 - 而不是页面呈现时。您必须将该按钮拖放到页面上。

我想你可以采用一个标准,你总是将按钮放在页面上“div”的正下方(用 style=none 隐藏)。然后如前所述,将你的注入代码和一些 js 一起执行隐藏按钮上的单击。或者只是让 js 按钮代码执行 __doPostback("some value") 并在页面加载事件中选择它,然后调用例程(函数)来自页面加载事件。

我认为最好使用 jQuery.UI 对话框,因为该对话框可以说加载+使用另一个不同的网页到现有页面上的“div”。因此,您可以将漂亮的弹出窗体布局、制作和创建为单独的网页。 jQuery 能够从该页面加载中删除“表单”和附加标签,然后将其注入现有页面。 (该代码将很难重现)。所以 jQuery.UI 能够弹出那个单独的页面。但是,加载页面上的按钮(进入 div)当然不能真正 运行 当前页面中的任何代码。但是,按钮可以运行当前页面中的本地js。因此,这个注入页面的操作对于每个页面都是本地的。但是弹出窗口不会直接调用存根后面的代码。

现在领养jQuery.UI,那么当然也要领养jQuery。所以这是你需要的两个额外的库。 (但是,jQuery 你可能已经有了)。

但是,我认为使用 ajax 工具包的全部意义在于首先要避免 jQuery.ui。公平地说,在 jQuery.ui 出现之前,该工具包确实令人印象深刻,并为 asp.net 的人们提供了真正的竞争优势。 (而且它往往比使用 jQuery.UI

的接线要少得多

因此,AjaxToolkit 在其鼎盛时期令人印象深刻。现在,它当然显示出它的年龄,但我仍在使用该工具包,AjaxFileUploader 尤其如此。是的,我确实使用弹出窗口——直到今天。但是,我现在发现 jQuery.UI 对话框更灵活,在这种情况下会更好(因为您需要即时设置)。

此外,甚至 jQuery.UI 对话框中的按钮背后都有代码,或者在本例中是 ajax 弹出窗口?好吧,只有操作按钮可以 运行 编码在后面。当然,取消按钮只会关闭对话框。但是,对话框中的任何按钮都会 运行 隐藏代码?好吧,没关系,因为你有一个 post 返回页,而它实际上是 post 返回页,无论如何都会破坏对话框。