Conserver ses données en passant d'une page à l'autre [Résolu]

marhoa 41 Messages postés mercredi 20 juillet 2005Date d'inscription 17 octobre 2006 Dernière intervention - 3 août 2005 à 14:30 - Dernière réponse : marhoa 41 Messages postés mercredi 20 juillet 2005Date d'inscription 17 octobre 2006 Dernière intervention
- 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
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
jesusonline 6827 Messages postés dimanche 15 décembre 2002Date d'inscription 13 octobre 2010 Dernière intervention - 3 août 2005 à 15:41
3
Merci
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

Merci jesusonline 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 68 internautes ce mois-ci

Commenter la réponse de jesusonline
marhoa 41 Messages postés mercredi 20 juillet 2005Date d'inscription 17 octobre 2006 Dernière intervention - 4 août 2005 à 17:22
0
Merci
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
Commenter la réponse de marhoa
jesusonline 6827 Messages postés dimanche 15 décembre 2002Date d'inscription 13 octobre 2010 Dernière intervention - 4 août 2005 à 17:28
0
Merci
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
Commenter la réponse de jesusonline
marhoa 41 Messages postés mercredi 20 juillet 2005Date d'inscription 17 octobre 2006 Dernière intervention - 8 août 2005 à 15:30
0
Merci
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.
Commenter la réponse de marhoa
jesusonline 6827 Messages postés dimanche 15 décembre 2002Date d'inscription 13 octobre 2010 Dernière intervention - 8 août 2005 à 16:05
0
Merci
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
Commenter la réponse de jesusonline
marhoa 41 Messages postés mercredi 20 juillet 2005Date d'inscription 17 octobre 2006 Dernière intervention - 9 août 2005 à 10:10
0
Merci
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.
Commenter la réponse de marhoa
jesusonline 6827 Messages postés dimanche 15 décembre 2002Date d'inscription 13 octobre 2010 Dernière intervention - 9 août 2005 à 10:15
0
Merci
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
Commenter la réponse de jesusonline
marhoa 41 Messages postés mercredi 20 juillet 2005Date d'inscription 17 octobre 2006 Dernière intervention - 9 août 2005 à 12:00
0
Merci
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)
Commenter la réponse de marhoa

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.