2010-06-17 2 views
1

Je génère dynamiquement des contrôles, et parfois je veux créer un contrôle et lui faire ignorer le viewstate. Par exemple, l'utilisateur a parfois cliqué sur un bouton indiquant qu'il souhaite charger un formulaire différent, de sorte que l'arbre de contrôle que je génère lors de la publication est différent de l'arborescence de contrôle d'origine. C'est bien, sauf quand j'appelle Controls.Add alors il essaye de charger le viewstate en passant les anciens contrôles dans les nouveaux contrôles si la structure de l'arbre de contrôle est similaire, et je veux qu'ils ignorent plutôt viewstate (et ignorent aussi les valeurs de publication) pour les contrôles d'entrée aussi bien). Puis-je faire quelque chose comme définir les identifiants des contrôles ou quelque chose qui me permettrait de les empêcher conditionnellement d'obtenir les données viewstate/postback de la requête précédente? Edit: Si je laisse l'utilisateur du contrôle charger le formulaire à la demande dans le gestionnaire de publication, les données de publication ne sont pas appliquées lorsque j'appelle Controls.Add (cela ressemble vraiment à une faille dans ASP.NET, parce que je Je pense que si vous allez appliquer des données viewstate "après coup" via Controls.Add, il semblerait que vous appliquiez ensuite automatiquement les données de publication après le chargement des données viewstate. Le vrai problème que je rencontre est que mon contrôle est très dynamique, mais l'utilisateur de mon contrôle ne peut pas vraiment lui dire quoi faire jusqu'à ce que son gestionnaire de publication déclenche, parce que l'un des choses qu'un utilisateur peut faire est de sélectionner différentes formes à chargé via certains boutons de liaison. Donc, ce n'est que lorsque le gestionnaire de postback s'exécute qu'ils savent ce que l'uesr a demandé, et peuvent donc demander à mon contrôle de charger un certain formulaire. Je dois donc leur demander de faire des choses convalues ​​comme enregistrer le formID qui identifie le dernier formulaire à une variable de session, et dans OnInit ils indiquent à mon formulaire ce que l'ancien formID était via une propriété. Mon contrôle charge ensuite le formulaire dans OnLoad afin qu'il puisse consommer les données viewstate et postback, et plus tard dans le gestionnaire de publication du programmeur, ils peuvent choisir d'effacer le formulaire et en charger un autre s'ils le souhaitent. Edit2: FYI Générer des ID pour chaque contrôle unique au formulaire fonctionne très bien, alors j'ai pensé que je pourrais éliminer le chargement inutile de l'ancien formulaire jusqu'à ce que le programmeur demande un formulaire à charger dans son gestionnaire de publication. Mais comme je l'ai mentionné ci-dessus, ce que j'ai trouvé était que le chargement du formulaire après que la gestion des données de publication a eu lieu signifie que les données sont perdues. Alors que viewstate est chargé via Contorls.Add, en rattrapant le cycle de vie de la page, il semble que les données de publication ne le soient pas! Donc, il semble que je suis vaincu à chaque tour.Comment ignorer viewstate d'une demande précédente pour un contrôle particulier?

Répondre

2

Donner aux ID différents contrôles empêcherait certainement ViewState d'être chargé, ce serait un moyen.

Vous pouvez également manipuler la propriété ViewStateMode de vos commandes en la définissant sur "Désactivé". Je ne suis pas sûr que cela l'empêche de charger (cela les empêche définitivement d'enregistrer viewstate), mais vous pouvez l'essayer.

+0

+1 Tout le monde, mais je marque cela comme la réponse car elle répond directement La question posée à propos de l'ignorance de viewstate. De plus, la définition des ID restera une partie de ma solution même si je ne peux pas vraiment éliminer le chargement de l'ancien formulaire, il sera important de ne pas charger l'ancien formulaire car il n'est plus valide pour que je puisse ignorer le viewstate (longue histoire que je n'entrerai pas dans). Autant dire merci. – AaronLS

1

Avez-vous essayé d'appeler controls.clear avant d'ajouter les nouveaux?

MISE À JOUR

Je commence à croire que vous générez les contrôles au mauvais endroit dans le cycle de vie de la page. Quel est votre flux?

+0

J'ai essayé cela, et ce que je devais faire comme solution de contournement était pendant la publication, générer dynamiquement le formulaire précédent afin qu'ils puissent consommer viewstate/postback, puis appeler Clear, puis créer le nouveau formulaire. Si je ne générais pas l'ancien formulaire avant d'appeler clear, les contrôles n'existaient pas encore dans le formulaire, et donc le viewstate attendrait toujours et serait appliqué au nouveau formulaire, ce qui entraînait souvent une exception lorsque les types de contrôle étaient différent. – AaronLS

+0

J'ai essayé différentes combinaisons de onload, oninit, et aussi à la demande par un appel de fonction de l'utilisateur de mon contrôle (qui appelle à partir d'un gestionnaire de publication comme un clic), mais peu importe quand vous appelez Controls.Add puis asp.net exécute vos contrôles à travers tous les événements qui se sont déjà produits, donc viewstate est chargé indépendamment. Donc, dans mes tests, ça ne semble pas faire la différence. – AaronLS

+0

En fait, je mens parce que les données de publication sont perdues si j'ajoute les contrôles trop tard dans le cycle de vie. Voir éditer. – AaronLS

3

Vous allez éviter les problèmes si vous jouez avec la durée de vie du contrôle. Fondamentalement, chaque fois que vous avez un contrôle qui rend, il est préférable de s'assurer que le contrôle est recréé lors de la prochaine publication, même si vous n'en aurez plus besoin. Le premier but d'une publication devrait être de restaurer l'état précédent - seulement ALORS faites-vous des changements.

je l'ai décrit le mieux dans cette réponse:

Wrong state in Server Controls with same ID's when dynamically adding UserControl to UpdatePanel

+0

+1 c'est une bonne réponse au problème – NotMe

+0

Ugghhh Je pense que vous avez raison, il n'y aura aucun moyen de contourner cela. – AaronLS

1

Vous devez être générer des commandes dynamiques sur postback dans pageload:

protected void Page_Load(object sender, EventArgs e) 
    { 
     --Generate Dynamic Controls-- 
    } 

Vous devez le faire comme:

protected override void OnInitComplete(EventArgs e) 
    { 
     base.OnInitComplete(e); 
    } 

    protected void OnInit() 
    { 
    --Generate Dynamic Controls-- 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 
Questions connexes