如何检查是否回传造成一个动态链接按钮按钮、回传、链接、动态

2023-09-03 01:52:15 作者:独倾

我有一个按钮控制。在点击这个按钮,我需要动态地添加一个链接按钮。链接按钮需要一个事件处理程序。因此,动态链接按钮首先在Page_Load添加和清除,并且在按钮单击处理程序再次添加。请阅读动态控制的事件处理程序的工作理解这样做的业务需求。

我读On回发,我怎么能检查哪些控制回发在Page_Init事件识别导致回发(里面的Page_Load)的控制。但它不工作对我的方案。

需要

什么变化工作要做,以确认是否回传被链接按钮(里面的Page_Load)引起的?

注意:请参考下面的另一个场景,这是不可避免的http://$c$creview.stackexchange.com/questions/20510/custom-paging-in-asp-net-web-application

注1:我需要回发的控制ID作为内如果(Page.IsPostBack)的第一步。我需要添加动态链接按钮控制,只有当它是从按钮或链接按钮回发。还有其他控件导致回发。对于这样的回传,我们不应该执行这个code。

注2:我收到空字符串请求[__ EVENTARGUMENT] 在Page_Load

有关问题的:通过什么事件,动态控件将在页面(使用的FindControl)提供。 @Tung说 - 你GetPostBackControlId方法得当越来越引起回发的控件的名称,但它无法通过page.FindControl找到与该ID的控制,因为LinkBut​​ton的还没有被创建,所以页不知道它的存在。

ASPX

 <%@页面语言=C#AutoEventWireup =真正的codeFILE =PostbackTest.aspx.cs继承=PostbackTest
的MasterPageFile =〜/ TestMasterPage.master%>

< ASP:内容ID =为myContentContentPlaceHolderID =ContentPlaceHolder1=服务器>
< D​​IV ID =持有人=服务器>
< / DIV>
< ASP:按钮的ID =Button1的=服务器文本=按钮的OnClick =TestClick/>
< / ASP:内容>
 

code背后

 公共部分类PostbackTest:System.Web.UI.Page
{
保护无效的Page_Load(对象发件人,EventArgs的)
{

    如果(Page.IsPostBack)
    {
        字符串IDValue = GetPostBackControlId(this.Page);
        INT X = 0;

        holder.Controls.Clear();
        LinkBut​​ton的lnkDynamic =新的LinkBut​​ton();
        lnkDynamic.Click + =新的EventHandler(LinkClick);
        lnkDynamic.ID =lnkDynamic123;
        lnkDynamic.Text =lnkDynamic123;
        holder.Controls.Add(lnkDynamic);
    }
}

保护无效TestClick(对象发件人,EventArgs的)
{
    holder.Controls.Clear();
    LinkBut​​ton的lnkDynamic =新的LinkBut​​ton();
    lnkDynamic.Click + =新的EventHandler(LinkClick);
    lnkDynamic.ID =lnkDynamic123;
    lnkDynamic.Text =lnkDynamic123;
    holder.Controls.Add(lnkDynamic);
}

保护无效LinkClick(对象发件人,EventArgs的)
{

}

公共静态字符串GetPostBackControlId(页)
{
    如果(!page.IsPostBack)
    {
        返回的String.Empty;
    }

    控制控制= NULL;

    //首先检查__EVENTTARGET与_doPostBack功能控制
    字符串控件名称= page.Request.Params [__ EVENTTARGET];
    如果(!String.IsNullOrEmpty(控件名称))
    {
        控制= page.FindControl(控件名称);
    }
    其他
    {
        //如果__EVENTTARGET为空,控制按钮式
        字符串控件ID;
        控制foundControl;

        的foreach(在page.Request.Form串CTL)
        {
            //具有附加准属性,在他们的标识识别鼠标x和y坐标它们拉手的ImageButton
            如果(ctl.EndsWith(。X)|| ctl.EndsWith(。y)的)
            {
                控件ID = ctl.Substring(0,ctl.Length  -  2);
                foundControl = page.FindControl(控件);
            }
            其他
            {
                foundControl = page.FindControl(CTL);
            }

            如果(!(foundControl是按钮|| foundControl是的ImageButton))继续;

            控制= foundControl;
            打破;
        }
    }

    返回控制== NULL?的String.Empty:control.ID;
}
}
 
必备6大互动玩法,帮你战胜80 以上的卖家

参考

On回发,我怎么能检查哪些控制回发在Page_Init事件 动态控件的事件处理程序的工作 了解__doPostBack的JavaScript功能 在使用ASP.NET code上回发访问JavaScript变量 How不知道ASP.NET回发时触发的事件? ASP.NET:如何从服务器控件删除name属性? 如何使用__doPostBack() 解决方案

在asp.net回发是由Java脚本函数__doPostBack(来源参数)做

所以你的情况这将是

  __doPostBack(lnkDynamic123,),这样的事情
 

因此​​,在code后面做以下

  VAR btnTrigger =请求[__ EVENTTARGET];

     如果(btnTrigger ==lnkDynamic123)
{
}
 

- 这将告诉大家,这是你的LinkBut​​ton,导致回发

I have a button control. On click of this button I need to add a Link Button dynamically. The Link Button needs an event handler. Hence the dynamic Link button is first added in the Page_Load and cleared and added again in the button click handler. Please read Dynamic Control’s Event Handler’s Working for understanding the business requirement for this.

I have read On postback, how can I check which control cause postback in Page_Init event for identifying the control that caused the postback (inside Page_Load). But it is not working for my scenario.

What change need to be done to confirm whether the postback was caused by link button (inside Page_Load)?

Note: Refer the following for another scenario where it is inevitable http://codereview.stackexchange.com/questions/20510/custom-paging-in-asp-net-web-application

Note 1: I need to get the postback control ID as the first step inside if (Page.IsPostBack). I need to add the dynamic link buttons control only if it is a postback from the button or the link button. There will be other controls that causes postback. For such postbacks we should not execute this code.

Note 2: I am getting empty string for Request["__EVENTARGUMENT"] in the Page_Load

Related Question: By what event, the dynamic controls will be available in the Page (for using in FindControl). @Tung says - "Your GetPostBackControlId method is properly getting the name of the control that caused the postback, but it is unable to find a control with that id through page.FindControl because the linkbutton has not been created yet, and so page does not know of its existence. "

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>

CODE BEHIND

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;
}
}

REFERENCE

On postback, how can I check which control cause postback in Page_Init event Dynamic Control’s Event Handler’s Working Understanding the JavaScript __doPostBack Function Access JavaScript variables on PostBack using ASP.NET Code How does ASP.NET know which event to fire during a postback? ASP.NET: how to remove 'name' attribute from server controls? How to use __doPostBack()

解决方案

A postback in asp.net is done by the java script function __doPostback(source, parameter)

so in your case it would be

    __doPostback("lnkDynamic123","") something like this

So in the code behind do the following

    var btnTrigger = Request["__EVENTTARGET"]; 

     if(btnTrigger=="lnkDynamic123") 
{
}

--- this would tell that it is your linkbutton that causes the postback