12 votes

Comment vérifier si le postback est causé par un bouton de lien dynamique ?

J'ai un contrôle de bouton. Lorsque je clique sur ce bouton, je dois ajouter un bouton de lien de façon dynamique. Le bouton de lien a besoin d'un gestionnaire d'événements. Par conséquent, le bouton de lien dynamique est d'abord ajouté dans le Page_Load, puis effacé et ajouté à nouveau dans le gestionnaire de clic du bouton. Veuillez lire Fonctionnement du gestionnaire d'événements du contrôle dynamique pour avoir compris les besoins de l'entreprise en la matière.

J'ai lu Lors du retour en arrière, comment puis-je vérifier quel contrôle a provoqué le retour en arrière dans l'événement Page_Init ? pour identifier le contrôle qui a provoqué le postback (dans Page_Load). Mais cela ne fonctionne pas pour mon scénario.

Quelles modifications doivent être apportées pour confirmer que le postback a été provoqué par le bouton de lien (dans Page_Load) ?

Note : Référez-vous à ce qui suit pour un autre scénario où il est inévitable https://codereview.stackexchange.com/questions/20510/custom-paging-in-asp-net-web-application

Note 1 : J'ai besoin d'obtenir l'ID du contrôle postback comme première étape à l'intérieur. if (Page.IsPostBack) . J'ai besoin d'ajouter le contrôle des boutons de liens dynamiques uniquement s'il s'agit d'un postback du bouton ou du bouton de lien. Il y aura d'autres contrôles qui provoqueront des retours en arrière. Pour de tels postbacks, nous ne devons pas exécuter ce code.

Note 2 : J'obtiens une chaîne vide pour Request["__EVENTARGUMENT"] dans la page_Load

Question connexe : Par quoi event les contrôles dynamiques seront disponibles dans la page (pour être utilisés dans FindControl). @Tung dit - "Votre méthode GetPostBackControlId obtient correctement le nom du contrôle qui a causé le postback, mais elle est incapable de trouver un contrôle avec cet id par page.FindControl parce que le bouton de liaison n'a pas encore été créé, et donc la page ne connaît pas son 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;
}
}

RÉFÉRENCE

  1. Lors du retour en arrière, comment puis-je vérifier quel contrôle a provoqué le retour en arrière dans l'événement Page_Init ?
  2. Fonctionnement du gestionnaire d'événements du contrôle dynamique
  3. Comprendre la fonction JavaScript __doPostBack
  4. Accéder aux variables JavaScript sur PostBack en utilisant le code ASP.NET
  5. Comment ASP.NET sait-il quel événement déclencher lors d'un postback ?
  6. comment supprimer l'attribut 'name' des contrôles du serveur ?
  7. Comment utiliser __doPostBack()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X