PRB: "estado de vista no es válido" mensaje de Error cuando utiliza Server.Transfer

Exención de responsabilidades de contenido KB retirado

Este artículo se refiere a productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

Síntomas

Cuando se utiliza HttpServerUtility.Transfer ("nombre de página", true), recibirá el siguiente mensaje de error:
El estado de vista no es válido para esta página y podría estar dañado

Causa

Este problema se produce porque el atributo EnableViewStateMac del elemento < pages > se establece en true de forma predeterminada. Cuando este atributo se establece en true, ASP.NET se ejecuta una comprobación de autenticación de mensajes (MAC) en el estado de vista de la página cuando la página se devuelve desde el cliente. Esta comprobación determina si se ha modificado el estado de vista de la página en el cliente. Por motivos de seguridad, se recomienda que tenga este atributo establecido en true.

Cuando llame al método Server.Transfer y establezca el segundo parámetro en true, se conservan la cadena de consulta y las colecciones de formulario . Uno de los campos de formulario es el campo de formulario oculto __VIEWSTATE, que guarda el estado de vista de la página. Se produce un error en la comprobación de autenticación de mensaje de estado de vista porque la comprobación de autenticación de mensaje sólo comprueba cada página. Por lo tanto, el estado de vista de la página que llama a Server.Transfer no es válido en la página de destino.

Estado de vista está página limitada y es válido para esa página solamente. Estado de vista no debe ser transferido a través de páginas.

Solución

Para resolver este problema, utilice uno de los métodos siguientes.

Resolución 1

Transferir valores entre páginas para pasar valores de control de su servidor a las otras páginas. Para obtener más información, consulte la siguiente documentación de MSDN:
Pasar valores de Control de servidor entre páginas
http://msdn2.microsoft.com/en-us/library/6c3yckfw(vs.71).aspx
Esto requiere la creación de propiedades públicas para cada propiedad de un control que desea tener acceso desde la página de destino.

Si tiene muchos controles, y desea tener acceso a las propiedades de estos controles desde otra página, también puede declarar esos controles como variables públicas. Por ejemplo:

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)

Resolución 2

No pase el segundo parámetro (que es false de forma predeterminada) al llamar a Server.Transfer. Por ejemplo:
Server.Transfer("<page name>")
Este código no envía la cadena de consulta y los campos de formulario a la página que se llama. Cuando no se transferirán datos, ASP.NET no se ejecuta la comprobación de autenticación de mensaje.

Más información

Pasos para reproducir el comportamiento

  1. Crear una página .aspx denominada WebForm1.aspx que transfiere la ejecución a otra página. A WebForm1.aspx, agregue el código siguiente:
    <%@ 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. Cree otra página .aspx denominada WebForm2.aspx y, a continuación, agregue el código siguiente:
    <%@ 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 = "Your name is '" & nameTextBox.Text & "'."

    End Sub

    </script>

  3. Abra WebForm1.aspx en el explorador y, a continuación, haga clic en Enviar.
Propiedades

Id. de artículo: 316920 - Última revisión: 17 ene. 2017 - Revisión: 1

Comentarios