我有一个按钮控件。单击此按钮时,我需要动态添加一个链接按钮。链接按钮需要一个事件处理程序。因此,动态链接按钮首先添加到 Page_Load 中,然后在按钮单击处理程序中清除并再次添加。请阅读Dynamic Control 的 Event Handler's Working以了解对此的业务需求。
我已阅读On postback,如何在 Page_Init 事件 中检查哪个控件导致回发,以识别导致回发的控件(在 Page_Load 内)。但它不适用于我的场景。
需要做哪些更改来确认回发是否是由链接按钮(在 Page_Load 内)引起的?
注意:有关不可避免的另一种情况,请参阅以下内容https://codereview.stackexchange.com/questions/20510/custom-paging-in-asp-net-web-application
注 1:我需要获取回发控件 ID 作为内部的第一步if (Page.IsPostBack)
。只有当它是来自按钮或链接按钮的回发时,我才需要添加动态链接按钮控件。将有其他控件导致回发。对于此类回发,我们不应执行此代码。
注意 2:我Request["__EVENTARGUMENT"]
在 Page_Load 中得到空字符串
相关问题:通过什么event
,动态控件将在页面中可用(用于在 FindControl 中使用)。@Tung 说-“您的 GetPostBackControlId 方法正在正确获取导致回发的控件的名称,但它无法通过 page.FindControl 找到具有该 ID 的控件,因为尚未创建链接按钮,因此页面没有知道它的存在。”
ASPX
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="PostbackTest.aspx.cs" Inherits="PostbackTest"
MasterPageFile="~/TestMasterPage.master" %>
<asp:Content ID="myContent" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<div id="holder" runat="server">
</div>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="TestClick" />
</asp:Content>
代码背后
public partial class PostbackTest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if(Page.IsPostBack)
{
string IDValue = GetPostBackControlId(this.Page);
int x = 0;
holder.Controls.Clear();
LinkButton lnkDynamic = new LinkButton();
lnkDynamic.Click += new EventHandler(LinkClick);
lnkDynamic.ID = "lnkDynamic123";
lnkDynamic.Text = "lnkDynamic123";
holder.Controls.Add(lnkDynamic);
}
}
protected void TestClick(object sender, EventArgs e)
{
holder.Controls.Clear();
LinkButton lnkDynamic = new LinkButton();
lnkDynamic.Click += new EventHandler(LinkClick);
lnkDynamic.ID = "lnkDynamic123";
lnkDynamic.Text = "lnkDynamic123";
holder.Controls.Add(lnkDynamic);
}
protected void LinkClick(object sender, EventArgs e)
{
}
public static string GetPostBackControlId(Page page)
{
if (!page.IsPostBack)
{
return string.Empty;
}
Control control = null;
// First check the "__EVENTTARGET" for controls with "_doPostBack" function
string controlName = page.Request.Params["__EVENTTARGET"];
if (!String.IsNullOrEmpty(controlName))
{
control = page.FindControl(controlName);
}
else
{
// if __EVENTTARGET is null, the control is a button type
string controlId;
Control foundControl;
foreach (string ctl in page.Request.Form)
{
// Handle ImageButton they having an additional "quasi-property" in their Id which identifies mouse x and y coordinates
if (ctl.EndsWith(".x") || ctl.EndsWith(".y"))
{
controlId = ctl.Substring(0, ctl.Length - 2);
foundControl = page.FindControl(controlId);
}
else
{
foundControl = page.FindControl(ctl);
}
if (!(foundControl is Button || foundControl is ImageButton)) continue;
control = foundControl;
break;
}
}
return control == null ? String.Empty : control.ID;
}
}
参考