如何检查是否由动态链接按钮引起回发

LCJ*_*LCJ 12 .net c# asp.net

我有一个按钮控件.单击此按钮,我需要动态添加链接按钮.链接按钮需要一个事件处理程序.因此,动态链接按钮首先添加到Page_Load中,然后在按钮单击处理程序中清除并再次添加.请阅读Dynamic Control的事件处理程序的工作,以了解此操作的业务需求.

我已经读过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>
Run Code Online (Sandbox Code Playgroud)

代码背后

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;
}
}
Run Code Online (Sandbox Code Playgroud)

参考

  1. 在回发时,如何检查哪个控件导致Page_Init事件中的回发
  2. 动态控制的事件处理程序的工作
  3. 了解JavaScript __doPostBack函数
  4. 使用ASP.NET代码在PostBack上访问JavaScript变量
  5. ASP.NET如何知道在回发期间要触发哪个事件?
  6. 如何从服务器控件中删除'name'属性?
  7. 如何使用__doPostBack()

Dan*_*nex 8

asp.net中的回发是由java脚本函数__doPostback(源,参数)完成的

所以在你的情况下它会

    __doPostback("lnkDynamic123","") something like this
Run Code Online (Sandbox Code Playgroud)

所以在后面的代码中执行以下操作

    var btnTrigger = Request["__EVENTTARGET"]; 

     if(btnTrigger=="lnkDynamic123") 
{
}
Run Code Online (Sandbox Code Playgroud)

---这会告诉你它是你的链接按钮导致回发

  • 这应该是Request ["__ EVENTTARGET"]. (2认同)