2009-03-15 10 views
15

Venant d'un environnement PHP j'aime utiliser des URL propres pour récupérer des données d'un service à un autre.Comment désactiver viewstate pour de bon?

Cependant, certains de mes projets ASP.NET je reçois le paramètre ViewState horrible dans mes URL.

Existe-t-il un moyen de l'éteindre globalement?

Quel effet cela aura-t-il sur mon application ASP.NET?

Répondre

34

Vous pouvez désactiver ViewState pour tout le site comme celui-ci:

<system.web> 
<pages enableViewState="false" /> 

Cela dit, vous ne devriez pas être obtenir sur l'url. ViewState est un champ caché qui est envoyé au serveur avec une publication (qui utilise normalement la publication). Il conserve l'état des contrôles lorsque la page a été rendue au client, l'envoyant à chaque publication. Si cela fonctionne pour l'application, vous pouvez passer à l'utilisation de post à la place (le formulaire de problème utilise sûrement get), sinon jetez un oeil à la réponse de Jon.

Vérifiez ce lien pour plus d'informations sur la façon dont le ViewState s'inscrit dans le cycle de vie de asp.net: http://msdn.microsoft.com/en-us/library/ms972976.aspx.

4

Ajouter ceci au fichier web.config:

<Pages enableViewState="false"/> 
10

J'ai eu un similar question lors de l'écriture du Reputation Tracker.

Je ne sais pas comment vous le faites globalement autrement que de ne jamais utiliser un formulaire avec runat="server", ce qui est plus une question de discipline qu'un paramètre. En particulier, si vous avez runat="server" ensemble sur un formulaire Je crois que vous aurez toujours un paramètre viewstate, même si vous avez activé hors tension partout afin de ne pas valeurs. C'était mon expérience, de toute façon. Il est évident que cela vous limite un peu, mais j'ai trouvé que l'utilisation des contrôles serveur HTML (au lieu des contrôles ASP.NET) pour les parties appropriées d'ASP.NET peut rendre la vie beaucoup plus simple à comprendre.

+0

@TFD: Bien que cela arrive parfois, je ne suis pas convaincu que ce soit le cas ici. L'utilisation de formulaires avec runat = "server" en conjonction avec les actions GET (au lieu de POST) entraîne exactement le type de comportement que l'utilisateur ne souhaite pas. En quoi ma réponse n'est-elle pas pertinente? –

+0

@TFD Jon a raison, vous voudrez peut-être vérifier les liens qu'il a publiés avant de rendre public comme ça;) – eglasius

+1

GET est probablement inapproprié quand vous voulez vraiment viewstate - mais c'est très utile quand vous n'avez * pas besoin de viewstate. En particulier, il est beaucoup plus facile de mettre en signet une URL avec des paramètres GET que de trier l'affichage de viewstate :) –

3

Vous pouvez passer à ASP.Net MVC. D'après ce que je comprends, il n'utilise pas ViewState.

2

ne me rappelle, cependant, que certains comportements attendus par la plupart des formulaires Web ASP.NET de développeurs ne fonctionneront pas sans ViewState. Le but de ViewState est de donner l'illusion que diverses propriétés de page et de contrôle persistent d'une requête à l'autre. ViewState ne contient pas toutes les propriétés du contrôle, seulement celles qui ont changé. L'idée est que ViewState conserve ces propriétés telles qu'elles étaient au moment où le formulaire a été rendu.

Un bon exemple est un événement SelectedIndexChanged sur un menu déroulant (qui n'a pas autopostback défini). Cela fonctionne parce que ViewState conserve l'index précédent, et le formulaire publie l'index actuel, et le contrôle compare les deux afin de savoir que l'index sélectionné a changé. C'est à ce moment qu'il déclenche l'événement SelectedIndexChanged. Sans ViewState, cet événement ne se déclenchera pas. Même pour les événements TextChanged, etc.

En l'absence de la situation GET (que je n'ai jamais rencontrée), le gros problème avec ViewState est de l'utiliser là où ce n'est pas nécessaire. Votre contrôle de grille n'a pas besoin de conserver les valeurs précédentes de tous les contrôles dans toutes ses lignes, n'activez donc pas ViewState.

8

Désactivez ViewState par défaut en utilisant un élément <page> dans le fichier web.config. L'utilisation de EnableViewState="true" dans la directive @Page ne fonctionnera plus une fois que vous aurez désactivé ViewState dans le fichier web.config. Si vous décidez ultérieurement que vous avez besoin de ViewState pour une page spécifique, vous pouvez la réactiver pour cette page uniquement en utilisant un élément <location>.

<configuration> 
    <system.web> 
    <pages enableViewState="false" /> 
    </system.web> 

    <location path="MyFolder/MyPage.aspx"> 
    <system.web> 
     <pages enableViewState="true" /> 
    </system.web> 
    </location> 
    <location path="Site.master"> 
    <system.web> 
     <pages enableViewState="true" /> 
    </system.web> 
    </location> 
</configuration> 

Vous devez faire la même chose pour toutes les pages maîtres utilisées par votre page ViewState.

Questions connexes