Sur publication, comment puis-je vérifier quel contrôle cause la publication dans l'événement Page_Init.
protected void Page_Init(object sender, EventArgs e)
{
//need to check here which control cause postback?
}
Merci
Je constate qu’il existe déjà de très bons conseils et méthodes suggérés sur la manière d’obtenir le contrôle de retour. Cependant, j'ai trouvé une autre page Web ( blog Mahesh ) avec une méthode permettant de récupérer un ID de contrôle post back.
Je vais l'afficher ici avec une petite modification, notamment pour en faire une classe d'extension. J'espère que c'est plus utile de cette façon.
/// <summary>
/// Gets the ID of the post back control.
///
/// See: http://geekswithblogs.net/mahesh/archive/2006/06/27/83264.aspx
/// </summary>
/// <param name = "page">The page.</param>
/// <returns></returns>
public static string GetPostBackControlId(this Page page)
{
if (!page.IsPostBack)
return string.Empty;
Control control = null;
// first we will check the "__EVENTTARGET" because if post back made by the controls
// which used "_doPostBack" function also available in Request.Form collection.
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 and we need to
// iterate over the form collection to find it
// ReSharper disable TooWideLocalVariableScope
string controlId;
Control foundControl;
// ReSharper restore TooWideLocalVariableScope
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 IButtonControl)) continue;
control = foundControl;
break;
}
}
return control == null ? String.Empty : control.ID;
}
Mise à jour (2016-07-22): La vérification de type pour Button
et ImageButton
a été modifiée pour rechercher IButtonControl
pour permettre la reconnaissance des publications de contrôles tiers.
Voici un code qui pourrait faire l'affaire pour vous (tiré de blog de Ryan Farley )
public static Control GetPostBackControl(Page page)
{
Control control = null;
string ctrlname = page.Request.Params.Get("__EVENTTARGET");
if (ctrlname != null && ctrlname != string.Empty)
{
control = page.FindControl(ctrlname);
}
else
{
foreach (string ctl in page.Request.Form)
{
Control c = page.FindControl(ctl);
if (c is System.Web.UI.WebControls.Button)
{
control = c;
break;
}
}
}
return control;
}
Soit directement dans les paramètres de formulaire, soit
string controlName = this.Request.Params.Get("__EVENTTARGET");
Edit: Pour vérifier si un contrôle a provoqué une publication (manuellement):
// input Image with name="imageName"
if (this.Request["imageName"+".x"] != null) ...;//caused postBack
// Other input with name="name"
if (this.Request["name"] != null) ...;//caused postBack
Vous pouvez également parcourir tous les contrôles et vérifier si l’un d’eux a provoqué un post-retour en utilisant le code ci-dessus.
Si vous devez vérifier quel contrôle est à l'origine de la publication, vous pouvez simplement comparer directement ["__EVENTTARGET"]
Au contrôle qui vous intéresse:
if (specialControl.UniqueID == Page.Request.Params["__EVENTTARGET"])
{
/*do special stuff*/
}
Cela suppose que vous allez de toute façon comparer le résultat de toute méthode d'extension GetPostBackControl(...)
. Il peut ne pas gérer CHAQUE situation, mais si cela fonctionne, c'est plus simple. De plus, vous ne parcourrez pas la page à la recherche d'un contrôle qui vous importait au début.
if (Request.Params["__EVENTTARGET"] != null)
{
if (Request.Params["__EVENTTARGET"].ToString().Contains("myControlID"))
{
DoWhateverYouWant();
}
}
En supposant qu'il s'agisse d'un contrôle serveur, vous pouvez utiliser Request["ButtonName"]
Pour voir si un bouton spécifique a été cliqué: if (Request["ButtonName"] != null)
Un ajout aux réponses précédentes, à utiliser Request.Params["__EVENTTARGET"]
vous devez définir l’option suivante:
buttonName.UseSubmitBehavior = false;
Pour obtenir le nom exact du contrôle, utilisez:
string controlName = Page.FindControl(Page.Request.Params["__EVENTTARGET"]).ID;