PROBLEMA: "estado da vista é inválido" mensagem de erro quando utilizar o método Server.Transfer

Traduções de Artigos Traduções de Artigos
Artigo: 316920 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Quando utilizar HttpServerUtility.Transfer ("page name", true), receberá a seguinte mensagem de erro:
O estado da vista é inválido para esta página e pode estar danificado

Causa

Este problema ocorre porque o atributo EnableViewStateMac o <pages> elemento está definido como true por predefinição. Quando este atributo estiver definido como true , ASP.NET executa uma verificação de autenticação de mensagem (MAC) no estado da vista da página quando é registada a página anterior do cliente. Esta verificação determina se o estado da vista da página foi modificado no cliente. Por motivos de segurança, recomenda-se que mantenha este atributo definido como true .

Quando chamar o método Server.Transfer e definido o segundo parâmetro como true , manter QueryString e as colecções de formulário . Um dos campos de formulário é o campo de formulário ocultos __VIEWSTATE, que contém o estado da vista para a página. A autenticação de mensagem de estado de vista verificar falhar porque a verificação de autenticação de mensagem só verifica cada página. Por conseguinte, o estado da vista da página que chama Server.Transfer não é válido na página de destino.

Estado da vista página âmbito e é válido apenas dessa página. Estado da vista não deve ser transferido através de páginas.

Resolução

Para resolver este problema, utilize um dos seguintes métodos.

Resolução 1

Transferir valores entre páginas para passar valores de controlo de seu servidor para outras páginas. Para mais informações, consulte a MSDN seguinte documentação:
Valores de controlo do servidor de passagem entre páginas
http://msdn2.microsoft.com/en-us/library/6c3yckfw(vs.71).aspx
Isto requer que crie as propriedades públicas para cada propriedade de um controlo que pretende aceder a partir da página de destino.

Se tiver muitos controlos, e se pretender aceder às propriedades destes controlos de outra página, pode declarar também os controlos como as variáveis públicas. Por exemplo:

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)
				

Resolução 2

Não for aprovado o segundo parâmetro (que é false por predefinição) quando chama Server.Transfer . Por exemplo:
Server.Transfer("<page name>")
				
este código não envia QueryString e os campos de formulário para a página que é chamada. Quando não existem dados transferidos, o ASP.NET não executa a verificação de autenticação de mensagem.

Mais Informação

Passos para reproduzir o comportamento

  1. Crie uma página .aspx denominada WebForm1.aspx transfere execução para outra página. Adicione o seguinte código para 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. Crie outra página .aspx denominada WebForm2.aspx e adicione o seguinte código:
    <%@ 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 no browser e, em seguida, clique em Submeter .

Propriedades

Artigo: 316920 - Última revisão: 19 de abril de 2007 - Revisão: 3.2
A informação contida neste artigo aplica-se a:
  • Microsoft ASP.NET 1.0
Palavras-chave: 
kbmt kbprb kbstate kbwebforms KB316920 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 316920
Exclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.

Submeter comentários

 

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