2010-03-03 1 views
3

J'ai un contrôle (par exemple, un DataGrid ou un ComboBox) qui est un enfant d'un contrôle utilisateur. Je veux DataBind à chaque requête, plutôt que de laisser son état persister à travers ViewState. Je dois laisser EnableViewState=true cependant. Cela signifie, je pense, que j'ai besoin d'appeler DataBind avant que TrackViewState() soit appelé.Comment éviter la persistance des données via ViewState pour un contrôle enfant dans ASP.NET?

J'ai lu le blog fantastique TRULY Understanding ViewState et il répond à ma question en 4. Initializing child controls programmatically. Cependant, les solutions de l'article ne sont pas idéales: créer dynamiquement des contrôles enfants (je ne suis pas et ne peux pas - trop de code existant), utilisez un code de tiers tiers (préfèrerais que ce soit en code-behind), et utilisez OnPreInit (qui "ne vous aide pas si jamais vous développez un contrôle").

Étant donné que cet article est plutôt ancien (vers 2006), j'espérais que les nouvelles versions d'ASP.NET corrigent la situation de sorte qu'il y ait de meilleures solutions maintenant. Alors, communauté, y a-t-il de BONNE façon de faire cela?

+1

Le contrôle personnalisé ne prend pas en charge le fichier .aspx comme le contrôle utilisateur. Vous devez donc ajouter des contrôles enfants par programme. Etes-vous sûr que vous parlez de contrôle personnalisé ici? – Vitaly

+0

Oui, sauf si ma sémantique est confuse. Un contrôle personnalisé est-il différent d'un contrôle utilisateur? J'ai un .aspx qui utilise un .ascx. Le .ascx utilise de manière déclarative une grille de données et une zone de liste déroulante, et je veux DataBind les sans persister les données dans ViewState. –

+0

Oui, le contrôle personnalisé et le contrôle utilisateur sont différents. Le fichier ASCX signifie que vous avez le contrôle utilisateur. Pourquoi avez-vous besoin de garder EnableViewState = true? Vous avez juste besoin de le mettre à false et dans Page.Load ajouter des lignes pour initialiser DataSource et faire DataBind. – Vitaly

Répondre

0

Scott,

Je pense qu'il ya une mauvaise compréhension de la façon dont le cadre de formulaires Web ASP.NET fonctionne. Donc, juste un peu de théorie en premier.

Les pages ASP.NET Web Forms contiennent des fichiers de conception et de code-behind. Le fichier de conception comporte un balisage HTML et des «contrôles» qui sont des balises de référence pour les contrôles utilisateur ou personnalisés. Chaque élément qui a l'attribut runat = "server" est le contrôle du serveur (ce qui signifie qu'il est accessible à partir du code derrière son ID). Lorsque la page est ouverte dans le navigateur, ASP.NET prend le fichier de dessin et traite ces références de contrôle et génère finalement du code HTML pur.

ViewState est une variable cachée en HTML qui conserve l'état interne de tous les contrôles marqués runat = "server" et dont la propriété EnableViewState est définie sur True.

Dites que vous avez DataGrid avec EnableViewState = False. Cette grille contient des lignes qui contiennent des contrôles serveur et que vous voulez qu'elles soient dans ViewState. Vous pouvez toujours les avoir EnableViewState = True et être dans ViewState et vous pouvez toujours lier aux événements pour ces sous-contrôles.

Ainsi, même si DataGrid n'est pas dans ViewState, ses enfants peuvent être dans ViewState et vous pouvez gérer les événements appropriés.

Vous devrez initialiser DataGrid dans l'événement PageLoad à chaque fois si vous souhaitez qu'il affiche des données après chaque publication. ViewState conserve l'état de contrôle interne, de sorte que vous ne pouvez pas avoir certaines propriétés de contrôle dans ViewState et d'autres qui ne sont pas dans ViewState. Mais vous pouvez avoir des contrôles enfants (ce ne sont pas des propriétés, ce sont des sous-entités!) Pour être dans ViewState même si le contrôle parent n'est pas dans ViewState. Faites-moi savoir si vous voulez que je sois plus précis à ce sujet. Si vous voulez aller au plus profond de vous, il y a un livre brillant de Nikhil Kothari sur le développement de contrôles. Je pense que je l'ai vu quelque part comme e-book.

+0

Merci pour un bon résumé de ViewState, mais je ne crois pas qu'il réponde à ma question. Lisez l'article que j'ai référencé, si vous ne l'avez pas déjà fait, en particulier la section que j'ai mentionnée, et je pense que vous verrez ce que je veux dire. –

+0

Scott, pourriez-vous dire quelles questions avez-vous encore après mon explication? – Vitaly

Questions connexes