2010-10-29 16 views
0

J'ai un contrôle composite qui a quelques champs privés qui référencent des valeurs dans le cache et ces champs privés sont appelés au cours de la méthode constructeur. Comme une clé de chaîne est utilisée pour identifier la valeur dans le cache, je dois avoir un moyen de stocker cette clé de manière à ce qu'elle soit disponible au moment où le contrôle est instancié, et je dois pouvoir le référencer sur les postbacks sans changer.Comment enregistrer la valeur à travers les publications pour un contrôle composite sans utiliser viewstate

En outre, cette clé est générée la première fois que le contrôle est chargé, mais il ne doit pas être modifié à nouveau après cette première fois.

Comment puis-je accomplir ceci?

J'ai déjà essayé de l'enregistrer dans viewstate, mais cela ne fonctionne pas car viewstate n'est pas encore disponible au moment où le contrôle est instancié. J'ai essayé d'utiliser un champ privé et de vérifier par la suite contre Page.IsPostback dans le constructeur et si ce n'est pas la publication, j'attribue une valeur au champ privé, mais lors des postbacks suivants, il perd sa valeur, et je peux Ne le réattribuez pas dans le Page.IsPostBack car il s'agit d'un GUID autogénéré.

Cela doit être quelque chose les gens ont dû faire avant ....

Répondre

0

Il n'y a pas beaucoup d'informations par l'État lors de la construction de contrôle du tout, donc cela pourrait être difficile. Y a-t-il une raison pour laquelle vous ne pouvez pas déplacer votre code qui accède aux informations du cache dans l'événement Init du contrôle?

Je suppose que vous ne pouvez pas utiliser Session car les informations stockées sont liées à cette requête/publication spécifique. Si ce n'est pas spécifique à cette requête, l'utilisation de Session pourrait être une possibilité - mais je pense que vous pourriez rencontrer d'autres problèmes en essayant de gérer l'état de contrôle si tôt dans la vie.


Après avoir vu votre commentaire à l'autre réponse; vous devriez pouvoir déplacer votre code qui vérifie la source de données mise en cache dans l'événement Init ou même Load du contrôle, de sorte que l'état sera disponible.

Également, incidemment; Êtes-vous sûr de devoir vraiment mettre en cache ces données? Cela pourrait finir par prendre beaucoup de mémoire du serveur.

+0

J'utilise le cache pour pouvoir réinitialiser les données à leur état d'origine lorsque l'utilisateur clique sur un bouton "reset" dans le contrôle composite. C'est l'objectif principal de toute façon .. Je suis en train de tester en essayant de déplacer le code qui assigne la source de données dans l'événement init. –

+0

Okay; Cela devrait fonctionner tant que vous n'avez rien d'autre qui se passe dans des moments étranges qui dépendent de ce qui se passe à un certain moment. En règle générale, la liaison de données est mieux fait dans l'événement Load (Page ou Control), mais j'ai suggéré au moins Init de réduire les chances de toucher un autre problème si quelque chose dépend d'autres choses que vous faites en même temps. –

+0

Et je préfère ne pas encombrer cette Question avec une discussion sur ce que vous stockez dans Cache/Application; mais il peut aussi y avoir une meilleure façon de gérer cela, en fonction de ce que vous stockez. –

0

Avez-vous essayé Session?

Vous pouvez stocker tout ce que vous voulez dans l'objet de session pour un utilisateur particulier, en conservant la valeur/l'objet entre les publications.

Si vous souhaitez stocker sur une base globale et non par base de ser, essayez Application

+0

Eh bien, je stocke actuellement la "source de données" utilisée par ce contrôle dans le ApplicationCache. Le problème est que j'essaie d'identifier de manière unique cette source de données dans le cache afin que le contrôle puisse l'obtenir. Actuellement, la clé de cache est composée de l'ID du contrôle, de l'identificateur de session, puis d'un nom pour la source de données (il y en a deux, "current" et "original"). Ceci est correct tant que la page sur laquelle le contrôle existe n'a qu'un de ces contrôles, mais s'il y en a un second, ils finissent par référencer la même source de données. Donc j'essayais d'ajouter un GUID à la clé cache. –

0

Bien que ce ne soit pas la meilleure solution (réorganisation de votre logique pour s'adapter au cycle de vie en général), avez-vous essayé d'accéder directement à la requête? Une fois, je voulais vraiment obtenir la valeur sélectionnée au large DropDownList très tôt dans le cycle de vie pour que je puisse ajuster certains éléments dans le bâtiment, et je l'ai fait comme ceci:

myDropDownList.SelectedValue = Page.Request.Form[myDropDownList.UniqueID]; 

Ainsi, au lieu d'attendre que le viewstate pour charger les valeurs du proxie côté serveur, je l'ai moi-même obtenu à partir de la valeur de contrôle côté client qui a été transmise sur le poste. Je ferais probablement les choses différemment si je remanié cette page, mais cela semble avoir fonctionné correctement pour l'instant et cela a résolu le problème que j'avais.