2011-01-27 4 views
0

OK Le temps pour un autre Q stupide de votre part.Persistance des propriétés d'un contrôle

J'ai un contrôle qui a des propriétés qui doivent être conservées dans ViewState. Je dois également m'assurer que les propriétés ne sont pas remplacées si le contrôle apparaît plus d'une fois sur la page.

Je pensais écrire quelque chose comme ...

ViewState[String.Format("{0}_{1}", "BaseKey", this.ClientID)] = ... 

Mais la valeur des ClientID change du cycle de vie grâce à mi-chemin de la page. Il commence comme quelque chose comme "MyControl1" et devient ensuite "ctl001_MyControl1". Ainsi, toutes les valeurs appliquées avant que les modifications soient perdues.

La même chose se produit si j'utilise UniqueID à la place.

Je sais que je manque quelque chose d'évident, et je vais blâmer les pilules que je prends donc je ne regarde pas trop stupide.

- Stuart

Répondre

2

il semble que vous faites cela dans le contrôle de l'utilisateur, si cela est vrai, vous n'avez pas besoin de faire une expérience unique clé pour viewstate, chaque instance de chaque contrôle gère son propre état viewstate donc tout ce dont vous avez besoin est une clé connue de votre contrôle, quelque chose comme ça:

ViewState[@"somekey"] = ... 
+0

Voir; J'ai * dit * il me manquait quelque chose! :-) –

1

Essayez de le faire sur Page_PreRender plutôt que Page_Load?

+0

Hmm. Mais si le développeur utilisant le contrôle définit l'une de ces propriétés dans la balise de la page, je les aurai perdues. –

+0

Il semble que les valeurs du balisage soient définies * avant * les changements d'ID. –

1

Ne stockez pas la valeur nommée par rapport au nom de sortie du contrôle lui-même. Donnez-lui un nom unique et immuable, puis assurez-vous que toutes vos règles de liaison s'adaptent à ce nom au lieu du nom du client.

Edit:
Comme un petit exemple de ce que je veux dire:

MyControl ctrl1 = new MyControl(); 
ctrl1.ID = "MyControlA"; 
ctrl1.Text = "Some text"; 
ViewState[ctrl1.ID] = ctrl1.Text; 

MyControl ctrl2 = new MyControl(); 
ctrl2.ID = "MyControlB"; 
ctrl2.Text = "Some other text"; 
ViewState[ctrl2.ID] = ctrl2.Text; 
+0

Mais alors j'ai besoin de persister la valeur unique que j'ai utilisée et j'ai besoin de faire la clé de persistance que j'utilise pour enregistrer cette valeur unique et ... –

+0

@Stuart Hemming - Je ne suis pas sûr que je suis. Si vous appelez cette variable 'Steve', c'est toujours' Steve'. Il est mis dans le ViewState et il ne change jamais. À un moment donné dans votre code, il y a un identifiant unique qui n'a rien à voir avec l'identifiant du client. Même si vous générez dynamiquement un identifiant dans le code, il a un identifiant. Si vous utilisez vraiment cet identifiant, vous pouvez toujours casser la chaîne clientID en la divisant sur '_' et en utilisant l'index final comme ID. –

+0

Je suis évidemment très faible ici. Si j'ai 2 instances de MyControl - MyControlA et MyControlB et que j'ai une propriété appelée "Steve" que je sauvegarde dans viewstate, ce n'est pas une tentative d'écriture dans MyControlA.Steve (persistant comme "Steve" dans viewstate) désordre avec la valeur précédemment enregistrée pour MyControlB.Steve (également persisté comme "Steve" dans viewstate, en utilisant le même code)? Si je crée une clé unique pour MyControlA et MyControlB, je dois persister quelque part * pour que je puisse y revenir plus tard. N'est-ce pas? –

Questions connexes