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
- 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 ?
- Fonctionnement du gestionnaire d'événements du contrôle dynamique
- Comprendre la fonction JavaScript __doPostBack
- Accéder aux variables JavaScript sur PostBack en utilisant le code ASP.NET
- Comment ASP.NET sait-il quel événement déclencher lors d'un postback ?
- comment supprimer l'attribut 'name' des contrôles du serveur ?
- Comment utiliser __doPostBack()