2011-04-11 5 views
2

Dans le but d'accélérer mon site, j'essaie de désactiver le viewstate car je ne pense pas l'utiliser partout. J'ai une configuration de page maître avec les contrôles utilisateur chargés (en utilisant LoadControl) dans default.aspx. Ma mise en page typique serait:ViewState Disabled - La liste déroulante ne retourne pas les valeurs

Main.master -> Default.aspx -> ControlWrapper.ascx -> MyControl.ascx

J'ai mis EnableViewState = "false" dans ma page Default.aspx. Maintenant, quand j'essaie de lire une valeur à partir d'un DropDownList in MyControl.ascx, il revient vide lorsque le formulaire est posté. Tout d'abord, pourquoi est-ce? Je pensais que je devrais encore être capable de lire la valeur de la liste déroulante?

J'ai ensuite essayé d'activer ViewState sur ce contrôle et cela n'a pas fonctionné.

J'ai également essayé d'activer viewstate sur l'événement Page_Init de MyControl.ascx en utilisant Page.EnableViewState = True; mais cela n'a pas aidé non plus.

Je suppose que je suis un peu malentendu le viewstate, quelqu'un peut-il me diriger dans la bonne direction s'il vous plaît?

p.s Je ne sais pas si cette information est pertinente mais j'ajoute dynamiquement le contenu de DropDownList dans l'événement Page_Load. (Penser à ce sujet, cela pourrait-il être les problèmes - Test cela maintenant).

Merci.

Répondre

1

Je suppose que vous utilisez .NET 4. View State est la méthode utilisée par la structure de page ASP.NET pour conserver les valeurs de page et de contrôle entre les allers-retours. La raison pour laquelle cela n'a pas fonctionné lorsque vous avez désactivé View State est que ce contrôle a été rendu à nouveau lorsque vous avez effectué un PostBack sur le serveur, ce qui signifie que vous avez perdu la valeur sélectionnée.

La raison pour laquelle cela n'a pas fonctionné pour vous lorsque View State était hors de la page, mais pour le contrôle est dû au fait afin que de travailler, le following conditions must be met:

  • La propriété EnableViewState pour la la page est définie sur true.
  • La propriété EnableViewState du contrôle est définie sur true.
  • La propriété ViewStateMode du contrôle est définie sur Activé ou hérite du paramètre Activé.

ASP .NET View State Overview

+0

Ok, j'utilise .NET 2.0 (désolé de ne pas pouvoir dire dans OP), est-ce que cela fait une différence à l'un des points? – webnoob

+0

Si je me souviens bien, non, cela ne devrait pas faire de différence. ASP.NET 4 vous donne juste quelques options supplémentaires pour gérer votre ViewState. Vous en aurez toujours besoin pour votre page et votre contrôle si vous voulez être en mesure de récupérer la valeur sélectionnée de votre liste déroulante. Si j'étais vous, je l'allumerais par défaut, et l'éteindrais sélectivement là où c'est logique. Si vous avez des problèmes de performances, vous pouvez utiliser d'autres méthodes, telles que l'enregistrement de ViewState dans une base de données. – BrandonZeider

+0

Comment l'enregistrer dans une base de données fonctionnerait-il? Pouvez-vous recommander des articles pour cela? – webnoob

0

Lorsque vous avez fait EnableViewState = false; sur une page, vous ne devriez pas attendre DropdownList.SelectedValue après la publication.

Ce sera bien si vous activez/désactivez ViewState sur des contrôles particuliers plutôt que de désactiver l'état d'affichage complet en le spécifiant sur la directive page.

+0

Je suis d'accord que ce serait mieux, mais j'ai des centaines de contrôle, dont la plupart n'ont pas besoin activé. C'est pourquoi je voulais désactiver et activer pour ce dont j'ai besoin pour. – webnoob

2

Avec viewstate éteint, les valeurs que vous chargez dans Page_Load ne sont plus dans la liste lorsque vous republier (jusqu'à ce que vous les recharger évidemment). Si vous voulez travailler sans viewstate, vous devez définir l'élément sélectionné à partir de la valeur dans Request.Form.

protected void Page_Load(object sender, System.EventArgs e) 
{ 
    ddlItems.Items.Add(new ListItem("test1", "test1")); 
    ddlItems.Items.Add(new ListItem("test2", "test2")); 
    ddlItems.Items.Add(new ListItem("test3", "test3")); 

    if (Page.IsPostBack) 
     ddlItems.SelectedValue = Request.Form["ddlItems"]; 
} 
2

Lorsque vous avez défini ViewState false dans le menu déroulant doit se rempli avant chargement de la page - ce qui signifie que vous devriez probablement le faire à la page d'initialisation.Quelque chose comme ceci:

protected void Page_Init(object sender, System.EventArgs e) 
{ 
    ddlItems.Items.Add(new ListItem("test1", "test1")); 
    ddlItems.Items.Add(new ListItem("test2", "test2")); 
    ddlItems.Items.Add(new ListItem("test3", "test3")); 
} 

alors vous devriez être en mesure de lire la valeur à la charge:

protected void Page_Load(object sender, System.EventArgs e) 
{ 
    someTextBox = ddlItems.SelectedValue; 
} 

Un peu de fond:

Sur cette page: Microsofts page cycle

A l'image avec le cycle de page, il y a les méthodes "ProcessPostData" et "LoadPostData" tirant entre Init et Load. Les données postales de la liste déroulante contiennent la valeur sélectionnée - mais pas les valeurs possibles. Ainsi, lors du chargement des données de poste, il est essentiel que les valeurs possibles soient déjà présentes (ou ne puissent pas définir la valeur sélectionnée). De même, avant que les données de poste aient été chargées, la valeur sélectionnée n'a pas été définie.

Si viewstate est activé, il enregistre et récupère les valeurs possibles entre les publications.

Questions connexes