[ASPNET] PostBack, ID du contrôle qui l'a déclenché [Résolu]

Signaler
Messages postés
14
Date d'inscription
samedi 4 octobre 2003
Statut
Membre
Dernière intervention
28 juillet 2006
-
Messages postés
14
Date d'inscription
samedi 4 octobre 2003
Statut
Membre
Dernière intervention
28 juillet 2006
-
Bonjour à tous,

Voilà je me gratte la tête car ça ne vient pas...

Je programme en AspNet 2, VBNet

J'ai une page aspx qui créait dynamiquement les contrôles qui la compose.
Lors du postback je voudrais savoir quel est l'id du contrôle qui l'a déclenché.
Ceci afin d'éviter de recréer tous les contrôles de ma page, uniquement le bouton qui généré le postback afin que l'évenement associé par le addhandler soit activé.

PS : j'ai essayé le

Dim str
As
String = Request.Form(
"__EVENTTARGET").ToString

mais il est = à ""

Merci d'avance pour votre aide...

PilouLR

17 réponses

Messages postés
14
Date d'inscription
samedi 4 octobre 2003
Statut
Membre
Dernière intervention
28 juillet 2006

CA MARCHE ::::::: MERCIIIIII

Merci pour le soucis que tu as de résoudre nos soucis.
Merci pour le profesionalisme dont tu fais preuve !!!!

JPL
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
27
Bonjour,

c'est bizarre que __EventTarget soit nul :s

je viens de tester et tout fonctionne bien pour moi :

Partial Class admin_test_Default
Inherits System.Web.UI.Page


Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
If Not Page.IsPostBack Then
Dim btn As New Button()
AddHandler btn.Click, AddressOf btn_click
btn.ID = "toto"
btn.Text = "coucou :)"


form1.Controls.Add(btn)
End If


If Request.Form("__EVENTTARGET") = "toto" Then
btn_click(Nothing, EventArgs.Empty)
End If
End Sub


Protected Sub btn_click(ByVal sender As Object, ByVal e As System.EventArgs)
Response.Write("je suis clické")
End Sub
End Class



<HR>
Cyril - MVS - MCP ASP
Messages postés
14
Date d'inscription
samedi 4 octobre 2003
Statut
Membre
Dernière intervention
28 juillet 2006

Merci de ta réponse (rapide :))

En fait le résultat vaut Nothing !!!

Je dois peut-être ajouter que mes contrôles sont créés dans un PlaceHolder.

En fait, j'utilise une MasterPage dans laquelle j'ai mis dans le Content un PlaceHolder.

Mes contrôles ont tous une ID de définie :

Arrrgggg que se passe t'il ? tu as une idée?
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
27
Et si tu fais dans le meme esprit que mon code pour tester ?

sinon donne moi ton code que je voie mieux ce qui se passe


<HR>
Cyril - MVS - MCP ASP
Messages postés
14
Date d'inscription
samedi 4 octobre 2003
Statut
Membre
Dernière intervention
28 juillet 2006

Protected
Sub Page_Load(
ByVal sender
As
Object,
ByVal e
As System.EventArgs)
Handles
Me.Load



if
Not Page.IsPostBack
Then

PRoutines =
New Web.AppCode.PageRoutines

'Création des contrôles
PRoutines.CreateControls(BodyHolder)
PRoutines.UpdateControls(BodyHolder)



Dim toto
As
New Button
toto.ID =
"eee"
toto.Text =
"ererer"
BodyHolder.Controls.Add(toto)

Else

Dim str
As
String = Request.Form(
"__EVENTTARGET").ToString

'Le PostBack :
'1) Il est déclencher par une action (bouton, imagebouton,...), dans ce cas il faut impérativement recréer le controle
' pour pouvoir déclencher l'événement
'2) Autres, il faut recréer tous les controles
PRoutines =
New Web.AppCode.PageRoutines

'Affectation des valeurs aux controles
'PRoutines.CreateControls(BodyHolder)
'PRoutines.UpdateControls(BodyHolder)
End
If
If Request.Form(
"__EVENTTARGET") =
"toto"
Then :::::::::::: ICI le résultat vaut ""
' btn_click(Nothing, EventArgs.Empty)
End
If
End
Sub

En mettant simplement l'ajout du bouton TOTO, le résultat est incorrect !!!!!
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
27
Si tu supprimes New Web.AppCode.PageRoutines tu as le bon résultat ? car tu retombes sur le meme code que moi .. mis à part que je suis dans le page_init qui est l'evenement conseillé pour rajotué des controles dynamiquement :)


<HR>
Cyril - MVS - MCP ASP
Messages postés
14
Date d'inscription
samedi 4 octobre 2003
Statut
Membre
Dernière intervention
28 juillet 2006

Voici le code de ma page Aspx


<%
@
Page
Language="VB"
MasterPageFile="~/CellDefault.master"
AutoEventWireup="false"
CodeFile="Default.aspx.vb"
Inherits="_Default"
title="Default Page" %>
Messages postés
14
Date d'inscription
samedi 4 octobre 2003
Statut
Membre
Dernière intervention
28 juillet 2006

Bon j'ai supprimé :

PRoutines = New Web.AppCode.PageRoutines

'Création des contrôles
PRoutines.CreateControls(BodyHolder)
PRoutines.UpdateControls(BodyHolder)

Et j'obtient le même résultat :: je n'y comprend rien : mon code est pourtant simple !!!

???
Messages postés
14
Date d'inscription
samedi 4 octobre 2003
Statut
Membre
Dernière intervention
28 juillet 2006

Quand je suis en debug et que je pointe ma sourie sur la le Request.Form(
"__EVENTTARGET"),

Il y a un champ qui se nomme AllKeys composée de 5 valeurs dont une vaut : clt00$ContentPlaceHolder$eee qui est l'id de mon bouton...
Mais le Request me rend tjrs "" (mais en passant par le Handle Me.init)

Est-ce que cela peut aider ?
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
27
Request.form est un string ! donc tu peux pas avoir une propriété allkeys dans ton string, ca n'a pas de sens :p

tu travailles en .net 1 ou en .net 2 ?

pour "clt00$ContentPlaceHolder$eee" c'est normal puisque les id "héritent" de leur parent pour assurer une unicité au sein de la page !

en tout cas mon exemple fonctionne :p et je pige pas pourquoi toi non



<HR>
Cyril - MVS - MCP ASP
Messages postés
14
Date d'inscription
samedi 4 octobre 2003
Statut
Membre
Dernière intervention
28 juillet 2006

Je travail .NET2

RequestForm est un HTTPValueCollection composé d'un certain nombre de propriété.

Une de ces propriétés est AllKeys.

Le debug me montre simplement la structure du RequestForm mais le résulat de
Request.Form(
"__EVENTTARGET") est égal à ""

:(
Messages postés
14
Date d'inscription
samedi 4 octobre 2003
Statut
Membre
Dernière intervention
28 juillet 2006

Je viens de trouver ce message sur un forum : qu'en penses-tu ?

it works the same way in c#. but Request.Form["__EVENTTARGET"] is only used
with controls that use javascript to postback, not with asp:button or
asp:imagebutton controls. you check for their postback by checking
Request.Form for an entry with their name.
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
27
je voulais dire request.form("__truc") est un string ...

et si tu met la trace =true dans la directive de page tu verras les informations de debugage sinon utilises fiddler pour voir le contenu de l'en-tete de ta requete, on va bien finir par trouver ce qui se passe :)


<HR>
Cyril - MVS - MCP ASP
Messages postés
14
Date d'inscription
samedi 4 octobre 2003
Statut
Membre
Dernière intervention
28 juillet 2006

Voici ce que me dit Fiddler (donc après le clique sur le bouton et un break dans le page.init)

Au format Raw voici le texte :

OST /CellWeb/Default.aspx HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*
Referer: http://localhost:1043/CellWeb/Default.aspx
Accept-Language: fr
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: localhost:1043
Content-Length: 409
Proxy-Connection: Keep-Alive
Pragma: no-cache
Cookie: ASP.NET_SessionId=rxqbme55jicpivbcj3nqauuh; login=A154838827654CA705EE77D97C27B408D67D7762BC3DC9EA8EA7EB9440601BACF2C7CF8AF4457D36952720E20F209EF22FB773DE675D157C0F5018CA12F4D15F


__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=%2FwEPDwUKLTMxNjc3NTM3NWQYAgUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgIFI2N0bDAwJExvZ2luVmlldzIkTG9naW5TdGF0dXMxJGN0bDAxBSNjdGwwMCRMb2dpblZpZXcyJExvZ2luU3RhdHVzMSRjdGwwMwUQY3RsMDAkTG9naW5WaWV3Mg8PZAIBZBl%2Bg0pEsjhjQ%2FXZvWdrel9NK8bW&ctl00%24ContentPlaceHolder%24eee=ererer&__EVENTVALIDATION=%2FwEWAwKhsrVPApmM%2B%2BICAvvA%2FvcIjlAUmjCwb34BlafErol8eb%2BKcqg%3D

Je vois mon bouton eee dans ce texte mais le request.form me rend tjrs ""

Peut être quec comme il est dit dans le message précédent, le requestform ne fonctionne pas avec les Asp:Button ???
Messages postés
14
Date d'inscription
samedi 4 octobre 2003
Statut
Membre
Dernière intervention
28 juillet 2006

Et voici le texte de ma page :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head><link href="App_Themes/SilverTheme/Silver.css" type="text/css" rel="stylesheet" /><title>
Default Page
</title><style type="text/css">
</style></head>

<form name="aspnetForm" method="post" action="Default.aspx" id="aspnetForm">

<script type="text/javascript"


<!--
var theForm = document.forms['aspnetForm'];
if (!theForm) {
theForm = document.aspnetForm;
}


function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}}
// -->
</script>


......
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
27
je comprens plus rien :(

j'ai retesté mon code et ca marche plus :(

par contre si je met un linkbutton ca marche, et effectivement avec des boutons le principe est différent par contre je comprend pas pourquoi l'id est aprés le viewstate

une des solutions serait donc de rajouter une fonction javascript sur le onclick du bouton qui va setter l'__eventtarget pour qu'il est le bon id :s

Je regarderais ce soir à tete "reposé" car la je suis un peu tout embrouillé :)


<HR>
Cyril - MVS - MCP ASP&
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
27
Bonjour,

voici ce que j'ai fait niveau javascript :

Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init


If Not Page.IsPostBack Then


Dim btn As New Button()
' AddHandler btn.Click, AddressOf btn_click
btn.ID = "toto"
btn.Text = "coucou :)"
btn.Attributes.Add("onclick", "document.getElementById('__EVENTTARGET').value=this.id")


form1.Controls.Add(btn)
Else
If (Request.Form("__EVENTTARGET") & String.Empty).EndsWith("toto") Then
btn_click(Nothing, EventArgs.Empty)
End If
End If


End Sub


Protected Sub btn_click(ByVal sender As Object, ByVal e As System.EventArgs)
Response.Write("je suis clické")
End Sub


par contre il faut être sur qu'il existe l'input hidden __EventTarget sinon ca plante :)



<HR>



Cyril - MVS - MCP ASP