Conserver ses données en passant d'une page à l'autre

Résolu
marhoa Messages postés 41 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 17 octobre 2006 - 3 août 2005 à 14:30
marhoa Messages postés 41 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 17 octobre 2006 - 9 août 2005 à 12:00
Salut,
J'ai créé une page aspx où l'utilisateur doit entrer des informations qui seront enregistrées dans une table de base de données. Et, pour éviter d'avoir à faire des requètes supplémentaires avant d'éxécuter ma requète, j'ai voulu créer une classe dont certains champs sont remplis pdt que l'utilisateur fait ses choix. Afin que celle si soit accessible de l'ensemble des fonctions que j'utilise, je l'instancie en dehors des fonctions, juste après sa déclaration, comme ci-dessous:

public class CIntervention
{
public CIntervention(){}

public decimal dNature;
public decimal dRefSite;
public string sRefIntervenant;
};
CIntervention oIntervention = new CIntervention();

Oui mais voilà, les choix de l'utilisateurs sont effectués grâce à des listes déroulantes qui entrainent le rechargement de la page lorsqu'on les sélectionne (propriété autopostback à true) et aujourd'hui, je m'aperçois qu'au chargement de la page mon objet oIntervention est réinstancié et mes données sont écrasées.

Je me demande donc s'il y a un moyen de stocker mes données autrement. Je me demande aussi si la façon de gérer mais classes est vraiment conforme à ce qu'on doit faire sur asp.net, à ce sujet si quelqu'un connait un livre, un site ou un tutorial expliquant le fonctionnement des classes sous asp.net, pourrait-il me dire comment me les procurer?
Une autre question me taraude au plus haut point, est-il vraiment possible de faire ce que je veux faire?

Voilà, merci de votre aide

8 réponses

jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
3 août 2005 à 15:41
Bonjour,



pour la gestion des classes, n'importe quelle bouquin traitant de la
programmation orienté object fera l'affaire, en VB.net je ne pense pas
que ca existe, mais tu pourras trouver les concepts important de la COO
dans n'importe quel bouquin traitant du sujet (généralement en C++)



Pour ton problème d'ecrasement, c'est normal, il faut bien voir que
chaque requete entraine le rechargement complet de la page, donc à
chaque fois il va passer par lepage_load etc... pour savoir si la page
vient d'un postback tu as la propriété page.ispostback et tu peux
egalement stocké des variables simples dans le viewstate de la page,
mais attention ca ecrit ca dans un champ caché de la page HTML, donc le
transfert de la donnée se fait 2 fois ...



pour cela, il faut que t'as classe soit serializable et ensuite tu met
ton objet dans le viewstate. Pour rendre ta classe serializable, il
faut utiliser l'attribut Serializable



[serializable()]

public class CIntervention

{ ... }


et enfin pour recuperer / mettre la variable dans le viewstate on utilise généralement une propriété



public property obj as Tonobject

get

if not viewstate("keyobj") is nothing then

'c'est pas bien de parser comme ca !!!

try

return ctype(viewstate("keyobj"))

catch

return defobj

end try

end if

return defobj

end get

set (byval value as TonObject)

viewstate("keyobj") = value

end set

end property





Je viens d'y penser pour un bouquin pour les classes en C# il y a le
formation à C# de Ms press, et pour la gestion de projet en asp.net
j'ai pas lu de bouquins en parlant bien. C'est surtout l'experience ...


<hr> Cyril - MCP ASP.net
Webmaster de : Hoshimi.CodeS-SourceS.fr
3
marhoa Messages postés 41 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 17 octobre 2006
4 août 2005 à 17:22
Merci pour la serialisation, ça m'a bien aidé. Par contre j'ai pas étudié le viewstate, en fait je créé un fichier xml ou je stocke les données de ma classe (à l'aide de la méthode serialize)et lorsque la page se relance j'utilise la méthode deserialize pour réintroduire les données dans mon instance de classe. Peut être que plus tard j'essaierai avec viewstate mais là j'ai pas trop le temps.
Pour la programmation en objet j'ai pas de problème mais c'est la gestion des classes par asp.net dont je suis pas sûr mais là ça marche donc ça doit pas être trop mal.
Quand au livre "Formation à c#", ça fait un moment que j'en ai entendu parler mais il est toujours en rupture de stock, il va falloir que j'aille voir sur d'autres sites.

En tout cas merci, Serialize m'a sauvé la vie! (et toi aussi)
Salut
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
4 août 2005 à 17:28
ben si t'as fait un serialize tu stockes ou le xml ? sur le dd ? et si plusieurs personnes font la requete ?

pour le viewstate, c'est tout con au lieu de sauvegarder le fichier xml sur le dd ou ailleurs tu fais

viewstate(key) = instance_de_ton_object

puis ensuite pour le recuperer un simple ctype(viewstate(key), typedetonobject) et c'est finit :)


<HR>
Cyril - MCP ASP.net
Webmaster de : Hoshimi.CodeS-SourceS.fr
0
marhoa Messages postés 41 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 17 octobre 2006
8 août 2005 à 15:30
oui je stocke le fichier sur le disque dur mais chaque utilisateur étant identifié, chacun a un fichier avec un nom différent (dès fois je réfléchis un peu quand meme). Mais je crois que je vais essayer avec le viewstate parceque, apparemment VS aurait un bug avec la gestion des fichers xml (moi j'utilise WebMatrix mais bon...).
Lorsque je tente de charger le fichier xml, je recois l'erreur suivante:

The process cannot access the file "\\PRINTSIEGC04N2\DevOuest\MitelOrga\donneesSEB.xml" because it is being used by another process.

Apparemment le seul moyen de fixer ce problème est de modifier l'antivirus du serveur mais je n'ai pas accès à mon serveur IIS, je ne peux pas effectuer ces manips.
Donc je vais faire comme tu dis, en plus ça évitera de crééer pleins de petits fichiers sur le serveur.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
8 août 2005 à 16:05
Le problème que tu décris, c'est que IIS a déjà la main sur le fichier,
et 2 process ne peux pas locker le fichier en meme temps et
heureusement, mais peut etre que tu as oublié de faire un dispose dans
ton code ?

<hr> Cyril - MCP ASP.net
Webmaster de : Hoshimi.CodeS-SourceS.fr
0
marhoa Messages postés 41 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 17 octobre 2006
9 août 2005 à 10:10
ba le dispose il en veut pas:

monStreamReader.Dispose();
->'System.IO.TextWriter.Dispose(bool)' is inaccessible due to its protection level

Par contre j'ai essayé d'utiliser viewstate mais là encore... (tu vas croire que j'en fait exprès). Je n'ai pas pu utiliser CType car ça n'existe pas en c# mais j'ai forcé la conversion et ça semble passer mais...

CIntervention Intervention2 = new CIntervention();
Intervention2 = (CIntervention)ViewState["intervention"];
->Object reference not set to an instance of an object.

Pourtant j'ai cherché mais le problème ne vient pas des fonctions utilisées mais de l'objet (enfin c'est ce que je crois d'après mais faibles compétences et aussi d'après la phrase d'erreur) et là pour comprendre c'est plus chaud. Il parle de référence, serait-ce un problème de pointeur?

Là, je m'en remets à toi! ou à une autre âme charitable qui passerait dans le coin parceque là ça bloque un petit peu l'avancer de mon projet, Merci d'avance.
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
9 août 2005 à 10:15
ctype n'existe pas en c# mais l'equivalent est bien ce que tu as fait :)

Ton problème est normal !

la premiere fois que tu vas chercher ton objet le viewstate est vide et en faisant ce que tu veux ca revient à faire

(CIntervention)null

et il aime pas caster null en un autre objet :p

c'est pour ca que si tu regardes le code que j'ai mis plus haut, j'avais fait

if ! viewstate["intervention"] == null then

Le problème est il compris ?


<HR>
Cyril - MCP ASP.net
Webmaster de : Hoshimi.CodeS-SourceS.fr
0
marhoa Messages postés 41 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 17 octobre 2006
9 août 2005 à 12:00
Mais c'est biensur!

Je suis vraiment naze, c'était pourtant pas compliqué à voir mais j'étais carrément parti voir ailleurs: je pensais que justement lors de la première execution ca marchait mais que c'était lorsque le ViewState était plein que ça faisait tout planté. Enfin bon, encore une fois, c'est une victoire de superJesusOnline! Merci JE T'AIME! :) (bon ok je me calme)
0
Rejoignez-nous