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

Exclusion de responsabilité du contenu obsolète de la base de connaissances

Cet article a été rédigé sur les produits pour lesquels Microsoft n’offre plus aucune prise en charge. Par conséquent, cet article est proposé « en l’état » et ne sera plus mis à jour.

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 : 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

ID d'article : 316920 - Dernière mise à jour : 30 janv. 2002 - Révision : 1

Commentaires