PRB : Message d'erreur "État d'affichage non valide" lorsque vous utilisez Server.Transfer

Traductions disponibles Traductions disponibles
Numéro d'article: 316920 - Voir les produits auxquels s'applique cet article
Ancien nº de publication de cet article : F316920
Agrandir tout | Réduire tout

Sommaire

Symptômes

Lorsque vous utilisez HttpServerUtility.Transfer(" nom de page", true), le message d'erreur suivant apparaît :
L'état d'affichage n'est pas valide pour cette page et peut être endommagé.

Cause

Ce problème se produit car l'attribut EnableViewStateMac de l'élément <pages> est défini par défaut sur true. Lorsque cet attribut a la valeur true, ASP.NET exécute un contrôle d'identification des messages (MAC, Message Authentication Check) sur l'état d'affichage de la page lorsque celle-ci est renvoyée par le client. Ce contrôle détermine si l'état d'affichage de la page a été modifié sur le client. Pour des raisons de sécurité, il est recommandé de conserver cet attribut sur la valeur true.

Lorsque vous appelez la méthode Server.Transfer et définissez le deuxième paramètre sur true, vous préservez les collections QueryString et Form. L'un des champs de formulaire est le champ masqué __VIEWSTATE, qui contient l'état d'affichage associé à la page. Le contrôle d'authentification des messages pour l'état d'affichage échoue car ce contrôle vérifie uniquement chaque page. Par conséquent, l'état d'affichage de la page qui appelle Server.Transfer n'est pas valide sur la page de destination.

L'état d'affichage est étendu à la page et sa validité se limite uniquement à cette page. L'état d'affichage ne doit pas être transféré d'une page à l'autre.

Résolution

Pour résoudre ce problème, appliquez l'une des méthodes suivantes :

Résolution 1

Transférez des valeurs entre les pages pour passer vos valeurs de contrôle serveur aux autres pages. Pour plus d'informations, reportez-vous à la documentation MSDN suivante :
Passage des valeurs de contrôle serveur entre des pages
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconpassingservercontrolvaluesbetweenpages.asp
Ceci impose la création de propriétés publiques pour chaque propriété d'un contrôle auquel vous voulez accéder à partir de la page de destination.

Si vous disposez d'un grand nombre de contrôles et si vous voulez accéder aux propriétés de ces contrôles à partir d'une autre page, vous pouvez également déclarer ces contrôles comme des variables publiques. Par exemple :

Page1.aspx
Public Class Page1
    Public WithEvents TextBox1 As System.Web.UI.WebControls.TextBox

    'Insérez votre code ici.
End Class
Page2.aspx
            Dim sourcePage As Page1
            sourcePage = CType(Context.Handler, WebForm1)
            Response.Write(sourcePage.TextBox1.Text)

Résolution 2

Ne passez pas le second paramètre (qui a par défaut la valeur false) lorsque vous appelez Server.Transfer. Par exemple :
Server.Transfer("<nom de page>")
Ce code n'envoie pas les champs QueryString et Form à la page appelée. Lorsque aucune donnée n'est transférée, ASP.NET n'exécute pas le contrôle d'authentification des messages.

Plus d'informations

Étapes à suivre pour reproduire ce comportement

  1. Créez une page .aspx nommée WebForm1.aspx qui transfère une exécution à une autre page. Ajoutez le code suivant à WebForm1.aspx :
    <%@ Page language="vb" AutoEventWireup="true" %>
    
    <html>
      <body>	
        <form id="WebForm1" method="post" runat="server">
          <asp:TextBox id="txtName" runat="server">Votre Nom</asp:TextBox><br>
          <asp:Button id="Button1" runat="server" Text="Envoyer" OnClick="Button1_Click"></asp:Button>
        </form>	
      </body>
    </html>
    
    <script runat=server>
    Sub Button1_Click(sender As Object, e As System.EventArgs)
    	Server.Transfer("WebForm2.aspx",true)
    End Sub
    
    </script>
  2. Créez une autre page .aspx nommée WebForm2.aspx, puis ajoutez le code suivant :
    <%@ Page language="vb" AutoEventWireup="true" %>
    
    <html>
      <body>	
        <form id="WebForm2" method="post" runat="server">
          <asp:Label id="lblName" runat="server" >Web Form 2</asp:Label>
        </form>
    	
      </body>
    </html>
    
    <script runat=server>
    Sub Page_Load(sender As Object, e As EventArgs)
    
    Dim thisPage As System.Web.UI.Page
    Dim nameTextBox As TextBox
    
    	thisPage = CType(Context.Handler, System.Web.UI.Page)
    	nameTextBox =  CType(thisPage.FindControl("txtName"), System.Web.UI.Control)
    
    	lblName.Text = "Votre nom est '" & nameTextBox.Text & "'."	
    	
    End Sub
    
    </script>
  3. Ouvrez WebForm1.aspx dans votre navigateur, puis cliquez sur Envoyer.

Propriétés

Numéro d'article: 316920 - Dernière mise à jour: mercredi 30 janvier 2002 - Version: 1.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft ASP.NET (inclus dans le .NET Framework)
Mots-clés : 
kbconfig kbctrl kbprb kbsecurity kbservercontrols kbstate kbvalidation kbwebforms KB316920
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.
Exclusion de responsabilité concernant les contenus obsolètes dans la Base de connaissances
Cet article concerne des produits pour lesquels Microsoft n'offre plus de support. Il est par conséquent fourni « en l'état » et ne sera plus mis à jour.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com