动态 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 返回页,无论如何都会破坏对话框。
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 返回页,无论如何都会破坏对话框。