OVH Cloud OVH Cloud

[PB] Hidden field toujours vide!!!

4 réponses
Avatar
Frédéric Mériot
Voil=E0 mon probl=E8me :
J'ai une page A avec un formulaire =E0 remplir. Sur cette=20
page il y a des checkbox qui provoquent un PostBack afin=20
d'afficher d'autre options de saisie. Jusque l=E0 pas de pb.

Toujours sur cette page A il y a un ImageButton qui, sur=20
l'ev=E8nement "Click", fait un Server.Transfert vers une=20
page B.

Il y a aussi dans cette page A un HtmlInputHidden=20
(runat=3Dserver) qui me sert =E0 stocker une valeur que je=20
d=E9sire r=E9cup=E9rer aussi dans la page B.

Lorsque je clique sur le bouton je fais ceci:

void Mon_But_Click(object sender, ImageClickEventArgs e) {
Mon_Champ_Hidden.Value =3D "toto";
Server.Transfer("B");
}

Lorsque j'arrive dans la page B, Mon_Champ_Hidden est vide.

J'ai beau passer par RegisterHiddenField() ou faire le=20
Mon_Champ_Hidden.Value =3D "toto"; dans la m=E9thode Page_Load
(), rien n'y fait, Mon_Champ_Hidden est toujours vide.


En debuggant le script, je m'aper=E7ois que quand je clique=20
sur mon bouton, Page_Load() se lance (Mon_Champ_Hidden est=20
rempli), puis c'est au tour de Mon_But_Click(). Et c'est=20
lorsque j'entre dans Mon_But_Click() que le contenu de=20
Mon_Champ_Hidden est vid=E9.

HELP!

4 réponses

Avatar
Vko
il faut utiliser la seconde version de la méthode
Transfer :

public void Transfer(string, bool);

le 2nd parametre permet de préciser si tu veux que le
queryString (les valeurs des balise input donc) de ton
formulaire soit conservées.

Donc :

Server.Transfer("B.aspx", true);

-----Message d'origine-----
Voilà mon problème :
J'ai une page A avec un formulaire à remplir. Sur cette
page il y a des checkbox qui provoquent un PostBack afin
d'afficher d'autre options de saisie. Jusque là pas de pb.

Toujours sur cette page A il y a un ImageButton qui, sur
l'evènement "Click", fait un Server.Transfert vers une
page B.

Il y a aussi dans cette page A un HtmlInputHidden
(runat=server) qui me sert à stocker une valeur que je
désire récupérer aussi dans la page B.

Lorsque je clique sur le bouton je fais ceci:

void Mon_But_Click(object sender, ImageClickEventArgs e) {
Mon_Champ_Hidden.Value = "toto";
Server.Transfer("B");
}

Lorsque j'arrive dans la page B, Mon_Champ_Hidden est


vide.

J'ai beau passer par RegisterHiddenField() ou faire le
Mon_Champ_Hidden.Value = "toto"; dans la méthode Page_Load
(), rien n'y fait, Mon_Champ_Hidden est toujours vide.


En debuggant le script, je m'aperçois que quand je clique
sur mon bouton, Page_Load() se lance (Mon_Champ_Hidden


est
rempli), puis c'est au tour de Mon_But_Click(). Et c'est
lorsque j'entre dans Mon_But_Click() que le contenu de
Mon_Champ_Hidden est vidé.

HELP!



.



Avatar
Pierre Lagarde [MS]
Bonjour Frédéric,

Les champs hidden sont sauvegardés dans le viewstate car non trasmis dans
l'objet formulaire standard (HTML).
Donc quand tu changes de page le viewstate est réinitialisé donc pert ton
champs.

Attention à la solution Transfert('....',true) car ton viewsstate grossi !
Pour passer des paramètres d'une page à une autre il faut mieux utiliser les
sessions ou le mieux est de rester sur la même page. Normalement je dis bien
normalement en ASP.NET une page doit travailler avec son formulaire. Et si
une donnée doit être partagé entre plusieurs page alors elle doit être en
session. mais on écrit plus un formulaire dans une page et une action dans
une autre page !!!

--
Pierre Lagarde
Microsoft France

Frédéric Mériot wrote:
Voilà mon problème :
J'ai une page A avec un formulaire à remplir. Sur cette
page il y a des checkbox qui provoquent un PostBack afin
d'afficher d'autre options de saisie. Jusque là pas de pb.

Toujours sur cette page A il y a un ImageButton qui, sur
l'evènement "Click", fait un Server.Transfert vers une
page B.

Il y a aussi dans cette page A un HtmlInputHidden
(runat=server) qui me sert à stocker une valeur que je
désire récupérer aussi dans la page B.

Lorsque je clique sur le bouton je fais ceci:

void Mon_But_Click(object sender, ImageClickEventArgs e) {
Mon_Champ_Hidden.Value = "toto";
Server.Transfer("B");
}

Lorsque j'arrive dans la page B, Mon_Champ_Hidden est vide.

J'ai beau passer par RegisterHiddenField() ou faire le
Mon_Champ_Hidden.Value = "toto"; dans la méthode Page_Load
(), rien n'y fait, Mon_Champ_Hidden est toujours vide.


En debuggant le script, je m'aperçois que quand je clique
sur mon bouton, Page_Load() se lance (Mon_Champ_Hidden est
rempli), puis c'est au tour de Mon_But_Click(). Et c'est
lorsque j'entre dans Mon_But_Click() que le contenu de
Mon_Champ_Hidden est vidé.

HELP!


Avatar
Frederic
ok, merci. Mais j'utilise Transfer car j'ai une
cinématique avec 5 etapes A->B->C->D->E, et tout gérer
dans la même page devient vite le gros bordel :-{


-----Message d'origine-----
Bonjour Frédéric,

Les champs hidden sont sauvegardés dans le viewstate car


non trasmis dans
l'objet formulaire standard (HTML).
Donc quand tu changes de page le viewstate est


réinitialisé donc pert ton
champs.

Attention à la solution Transfert('....',true) car ton


viewsstate grossi !
Pour passer des paramètres d'une page à une autre il faut


mieux utiliser les
sessions ou le mieux est de rester sur la même page.


Normalement je dis bien
normalement en ASP.NET une page doit travailler avec son


formulaire. Et si
une donnée doit être partagé entre plusieurs page alors


elle doit être en
session. mais on écrit plus un formulaire dans une page


et une action dans
une autre page !!!

--
Pierre Lagarde
Microsoft France

Frédéric Mériot wrote:
Voilà mon problème :
J'ai une page A avec un formulaire à remplir. Sur cette
page il y a des checkbox qui provoquent un PostBack afin
d'afficher d'autre options de saisie. Jusque là pas de




pb.

Toujours sur cette page A il y a un ImageButton qui, sur
l'evènement "Click", fait un Server.Transfert vers une
page B.

Il y a aussi dans cette page A un HtmlInputHidden
(runat=server) qui me sert à stocker une valeur que je
désire récupérer aussi dans la page B.

Lorsque je clique sur le bouton je fais ceci:

void Mon_But_Click(object sender, ImageClickEventArgs




e) {
Mon_Champ_Hidden.Value = "toto";
Server.Transfer("B");
}

Lorsque j'arrive dans la page B, Mon_Champ_Hidden est




vide.

J'ai beau passer par RegisterHiddenField() ou faire le
Mon_Champ_Hidden.Value = "toto"; dans la méthode




Page_Load
(), rien n'y fait, Mon_Champ_Hidden est toujours vide.


En debuggant le script, je m'aperçois que quand je




clique
sur mon bouton, Page_Load() se lance (Mon_Champ_Hidden




est
rempli), puis c'est au tour de Mon_But_Click(). Et c'est
lorsque j'entre dans Mon_But_Click() que le contenu de
Mon_Champ_Hidden est vidé.

HELP!




.



Avatar
Pierre Lagarde [MS]
Re,

Et en jouant avec les panels visible / non visible ?
Sinon il y a des composants de step by step en ASP.NET tout fait qui marche
très bien...
C'est même trés rapide à refaire :) Il faut mieux mettre tout dans la même
page.

Voila 2 users control pour faire ton Step by Step 2 fichiers:
UCWizardDefault.ascx.cs qui est le UserControl master:
namespace WebApplication1.Wizard
{
using System;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

/// <summary>
/// Summary description for UCWizardDefault.
/// </summary>
public class UCWizardDefault : System.Web.UI.UserControl
{

private void Page_Load(object sender, System.EventArgs e)
{
if (! Page.IsPostBack)
{
//Au premier passage
//Selection du premier Item
foreach (Control c in Controls)
if (c is UCWizardItemDefault)
{
SelectItem(c);
break;
}
}
else
{
//Aux autres passage
//Recherche et activation du Panel visible
foreach (Control c in Controls)
if (c is UCWizardItemDefault)
{
if (c.Visible)
{
SelectItem(c);
break;
}
}
}
}


//Item Wizard Courrent
private UCWizardItemDefault currentWizardItem = null;
public UCWizardItemDefault CurrentWizardItem
{
get
{
return currentWizardItem;
}
}

//Passage à l'item suivant
public bool Next()
{
bool findNext = false;
foreach (Control c in Controls)
if (c is UCWizardItemDefault)
{
if (findNext)
{
SelectItem(c);
return true;
}
if (c == currentWizardItem)
findNext = true;
}
return false;
}

//Passage à Visible de UC séléctionné
public void SelectItem(Control item)
{
foreach (Control c in Controls)
if (c is UCWizardItemDefault)
c.Visible = (c == item);
currentWizardItem = (UCWizardItemDefault) item;
}

//Passage à l'item précédent
public bool Previous()
{
Control previousControl = null;
foreach (Control c in Controls)
if (c is UCWizardItemDefault)
{
if (c == currentWizardItem)
if (previousControl == null)
return false;
else
{
SelectItem(previousControl);
return true;
}
previousControl = c;
}
return false;
}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}


ET les UserControl Items qui doivent hérité de UCWizardItemDefault
UCWizardItemDefault.ascx.cs
namespace WebApplication1.Wizard
{
using System;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

/// <summary>
/// Summary description for UCWizardItemDefault.
/// </summary>
public class UCWizardItemDefault : System.Web.UI.UserControl
{

private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
}

//Wizard parent
public UCWizardDefault Wizard
{
get
{
return (UCWizardDefault) Parent;
}
}

//Appel du Next du parent
public void Next()
{
Wizard.Next();
}

//Appel du Previous du Parent
public void Previous()
{
Wizard.Previous();
}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion
}
}



--
Pierre Lagarde
Microsoft France

Frederic wrote:
ok, merci. Mais j'utilise Transfer car j'ai une
cinématique avec 5 etapes A->B->C->D->E, et tout gérer
dans la même page devient vite le gros bordel :-{


-----Message d'origine-----
Bonjour Frédéric,

Les champs hidden sont sauvegardés dans le viewstate car non trasmis
dans l'objet formulaire standard (HTML).
Donc quand tu changes de page le viewstate est réinitialisé donc
pert ton champs.

Attention à la solution Transfert('....',true) car ton viewsstate
grossi ! Pour passer des paramètres d'une page à une autre il faut
mieux utiliser les sessions ou le mieux est de rester sur la même
page. Normalement je dis bien normalement en ASP.NET une page doit
travailler avec son formulaire. Et si une donnée doit être partagé
entre plusieurs page alors elle doit être en session. mais on écrit
plus un formulaire dans une page et une action dans une autre page
!!!

--
Pierre Lagarde
Microsoft France

Frédéric Mériot wrote:
Voilà mon problème :
J'ai une page A avec un formulaire à remplir. Sur cette
page il y a des checkbox qui provoquent un PostBack afin
d'afficher d'autre options de saisie. Jusque là pas de pb.

Toujours sur cette page A il y a un ImageButton qui, sur
l'evènement "Click", fait un Server.Transfert vers une
page B.

Il y a aussi dans cette page A un HtmlInputHidden
(runat=server) qui me sert à stocker une valeur que je
désire récupérer aussi dans la page B.

Lorsque je clique sur le bouton je fais ceci:

void Mon_But_Click(object sender, ImageClickEventArgs e) {
Mon_Champ_Hidden.Value = "toto";
Server.Transfer("B");
}

Lorsque j'arrive dans la page B, Mon_Champ_Hidden est vide.

J'ai beau passer par RegisterHiddenField() ou faire le
Mon_Champ_Hidden.Value = "toto"; dans la méthode Page_Load
(), rien n'y fait, Mon_Champ_Hidden est toujours vide.


En debuggant le script, je m'aperçois que quand je clique
sur mon bouton, Page_Load() se lance (Mon_Champ_Hidden est
rempli), puis c'est au tour de Mon_But_Click(). Et c'est
lorsque j'entre dans Mon_But_Click() que le contenu de
Mon_Champ_Hidden est vidé.

HELP!




.