OVH Cloud OVH Cloud

viewstate, input, HtmlTextWriter (bouh...)

4 réponses
Avatar
Bonjour,=20

J'ai cr=E9=E9 un controle qui genere du code html dont un=20
certain nombre de input type text.=20

Comment faire pour que ces input soit int=E9gr=E9s ds le=20
viewstate ?=20

Lors de mes controles de validation, s'il y a une erreur,=20
(donc postback), toutes les valeurs saisies dans ces=20
input sont effac=E9es....=20

Si QQn a un tuyau, merci

4 réponses

Avatar
Paul Bacelar
Peux-tu nous donner un code minimal avec le problème, car normalement cela
se fait tout seul.

--
Paul Bacelar
Demandeur d'emploi

wrote in message
news:7e8101c4957b$2752a460$
Bonjour,

J'ai créé un controle qui genere du code html dont un
certain nombre de input type text.

Comment faire pour que ces input soit intégrés ds le
viewstate ?

Lors de mes controles de validation, s'il y a une erreur,
(donc postback), toutes les valeurs saisies dans ces
input sont effacées....

Si QQn a un tuyau, merci
Avatar
Frederic Melantois
Bonjour,

Il n'est pas nécessaire de gérer un viewstate si vous avez simplement des
Input type=text

Il vous suffit de connaître le nom des input renvoyés par le client, en
principe c'est vous qui le fixez.

Vous implémentez dans votre webcontrol l'interface IPostBackDataHandler

Vous redéfinissez cette implémentation :

public bool LoadPostData(string postDataKey, NameValueCollection
postCollection)
{
this.MaproprieteDeMonInput1 postCollection["lenomdemoninput"].ToString();
return true;
}

ensuite dans le pré-rendu, il faut inscrire votre webcontrol dans la page
comme control gérant le post-back. Cela se fait de cette manière :

Page.RegisterRequiresPostBack(this);

Ensuite dans le rendu, bien évidemment, quand vous construisez votre imput
text, sa valeur doit être donnée par la propriété MaproprieteDeMonInput1 de
votre webcontrol.

Frédéric Mélantois

a écrit dans le message de
news:7e8101c4957b$2752a460$
Bonjour,

J'ai créé un controle qui genere du code html dont un
certain nombre de input type text.

Comment faire pour que ces input soit intégrés ds le
viewstate ?

Lors de mes controles de validation, s'il y a une erreur,
(donc postback), toutes les valeurs saisies dans ces
input sont effacées....

Si QQn a un tuyau, merci
Avatar
Voila un bout de code....
AfficheGrille() genere le code html, disp stocke tout
dans la propriété _output puis render.


Protected Overrides Sub Render(ByVal Output As
HtmlTextWriter)

AfficheGrille()
Output.Write(_output)

End Sub

Private Function disp(ByVal txt As String) As
String
_output &= txt
Return _output
End Function


Private Sub AfficheGrille()
....
disp("<td class='ligne2f'>")
disp("&nbsp;<INPUT type='text' id=" &
IdTxb("DEB11", Ind) & " name=" & IdTxb("DEB11", Ind) & "
maxLength='2' size='1' class='inp'" & deb11 & "
onchange='MetEnForme(this)'>&nbsp;h&nbsp;<INPUT
type='text' id=" & IdTxb("DEB12", Ind) & " name=" & IdTxb
("DEB12", Ind) & " maxLength='2' size='1' class='inp'" &
deb12 & " onchange='MetEnForme(this)'>")
disp("</td>")
....
Avatar
Zazar
Bonsoir,

Voila un bout de code....
AfficheGrille() genere le code html, disp stocke tout
dans la propriété _output puis render.


Protected Overrides Sub Render(ByVal Output As
HtmlTextWriter)

AfficheGrille()
Output.Write(_output)

End Sub

Private Function disp(ByVal txt As String) As
String
_output &= txt
Return _output
End Function


Private Sub AfficheGrille()
....
disp("<td class='ligne2f'>")
disp("&nbsp;<INPUT type='text' id=" &
IdTxb("DEB11", Ind) & " name=" & IdTxb("DEB11", Ind) & "
maxLength='2' size='1' class='inp'" & deb11 & "
onchange='MetEnForme(this)'>&nbsp;h&nbsp;<INPUT
type='text' id=" & IdTxb("DEB12", Ind) & " name=" & IdTxb
("DEB12", Ind) & " maxLength='2' size='1' class='inp'" &
deb12 & " onchange='MetEnForme(this)'>")
disp("</td>")
....




Il va vous falloir revoir votre manière de penser.
1) Votre fonction disp() ne sert à rien, utilisez directement le HtmlWriter
: ça évite d'écrire du code inutile et en plus ça sera plus rapide
2) Mettez le code qui sert à générer le html dans la méthode Render() : ça
ne sert à rien que Render() se contente de faire un appel à une unique
fonction
3) La partie du code qui génère le html doit contenir le moins de html
possible :)

Le 3) signifie que dans la plupart des cas vous n'avez pas à vous soucier du
html, il faut se servir des contrôles déjà existant. Dans votre situation,
vous devriez rajouter quelques HtmlInputText à la collection Control et ne
pas substituer Render

Bref, un bon bouquin expliquant l'écriture de contrôles personnalisés vous
serait surement profitable. Sinon, jetez aussi un oeil sur :
http://www.dotnetjunkies.com/quickstart/aspplus/doc/webctrlauthoring.aspx
http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/cpguide/html/cpcondevelopingwebformscontrols.asp



Enfin pour répondre à votre question initiale, vérifiez que vous attribuez
bien toujours les mêmes ID à vos zones de texte d'une fois sur l'autre.

--
Zazar