Al momento sei offline in attesa che la connessione Internet venga ristabilita

PRB: Messaggio di errore "Valore di ViewState non valido" quando si utilizza Server.Transfer

Dichiarazione di non responsabilità per articoli della Microsoft Knowledge Base su prodotti non più supportati
Questo articolo è stato scritto sui prodotti per cui Microsoft non offre più supporto. L’articolo, quindi, viene offerto ‘così come è’ e non verrà più aggiornato.
Sintomi
Quando si utilizza HttpServerUtility.Transfer("nome pagina", true), viene visualizzato un messaggio di errore analogo al seguente:
Valore di ViewState non valido per la pagina e probabilmente danneggiato.
Cause
Questo problema si verifica perché per impostazione predefinita l'attributo EnableViewStateMac dell'elemento <pages> è impostato su true. Quando questo attributo è impostato su true, in ASP.NET viene eseguito un controllo di autenticazione messaggi (MAC, Message Authentication Check) sullo stato di visualizzazione della pagina quando viene eseguito il postback della pagina dal client. Questo controllo determina se lo stato di visualizzazione della pagina è stato modificato nel client. Per ragioni di protezione, si consiglia di lasciare questo attributo impostato su true.

Quando si chiama il metodo Server.Transfer e si imposta il secondo parametro su true, si conservano gli insiemi QueryString e Form. Uno dei campi del form è il campo nascosto __VIEWSTATE, che contiene lo stato di visualizzazione relativo alla pagina. Il controllo di autenticazione messaggi dello stato di visualizzazione ha esito negativo perché viene solo controllata ogni pagina. Lo stato di visualizzazione della pagina che chiama Server.Transfer non è pertanto valido nella pagina di destinazione.

Lo stato di visualizzazione rientra nell'ambito della pagina ed è valido solo per tale pagina. È consigliabile non trasferire da una pagina all'altra lo stato di visualizzazione.
Risoluzione
Per risolvere il problema, utilizzare uno dei metodi descritti di seguito.

Risoluzione 1

Trasferire i valori tra le pagine per passare i valori di controllo del server alle altre pagine. Per ulteriori informazioni, fare riferimento alla documentazione di MSDN (informazioni in lingua inglese):
Passaggio di valori di controllo del server tra le pagine
http://msdn2.microsoft.com/en-us/library/6c3yckfw(vs.71).aspx
Per questa operazione è necessario creare proprietà pubbliche per ogni proprietà di un controllo a cui si desidera accedere dalla pagina di destinazione.

Se si dispone di più controlli e si desidera accedere alle proprietà di questi controlli da un'altra pagina, è inoltre possibile dichiarare tali controlli come variabili pubbliche. Ad esempio:

Page1.aspx
Public Class Page1    Public WithEvents TextBox1 As System.Web.UI.WebControls.TextBox    'Insert your code here.End Class				
Page2.aspx
            Dim sourcePage As Page1            sourcePage = CType(Context.Handler, WebForm1)            Response.Write(sourcePage.TextBox1.Text)				

Risoluzione 2

Non passare il secondo parametro (per impostazione predefinita, false) quando si chiama Server.Transfer. Ad esempio:
Server.Transfer("<page name>")				
Questo codice non invia i campi QueryString e Form alla pagina chiamata. Quando non viene trasferito alcun dato, in ASP.NET non viene eseguito il controllo di autenticazione messaggi.
Informazioni

Procedura per riprodurre il problema

  1. Creare una pagina aspx denominata WebForm1.aspx che trasferisce l'esecuzione a un'altra pagina. Aggiungere il codice seguente a WebForm1.aspx:
    <%@ Page language="vb" AutoEventWireup="true" %><html>    <body>	    <form id="WebForm1" method="post" runat="server">      <asp:TextBox id="txtName" runat="server">Your Name</asp:TextBox><br>      <asp:Button id="Button1" runat="server" Text="Submit" 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. Creare un'altra pagina aspx denominata WebForm2.aspx e quindi aggiungere il codice seguente:
    <%@ 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.PageDim nameTextBox As TextBox	thisPage = CType(Context.Handler, System.Web.UI.Page)	nameTextBox =  CType(thisPage.FindControl("txtName"), System.Web.UI.Control)	lblName.Text = "Your name is '" & nameTextBox.Text & "'."		End Sub</script>					
  3. Aprire WebForm1.aspx nel browser e quindi fare clic su Invia.
ViewState
Proprietà

ID articolo: 316920 - Ultima revisione: 06/15/2007 10:37:13 - Revisione: 3.2

Microsoft ASP.NET 1.0

  • kbprb kbstate kbwebforms KB316920
Feedback