Compartilhar via


Visão geral do estado de exibição do ASP.NET

O estado de exibição é o método que a estrutura de página do ASP.NET usa para preservar valores de página e controle entre idas.Quando a marcação MTML para a página é processada, o estado atual da página e valores que devem ser mantidos durante uma postagem são serializados em sequências codificadas na base 64.Essa informação é, em seguida, inserida no campo ou campos ocultos de estado de exibição.

Esse tópico contém:

  • Cenários

  • Recursos de estado de exibição

  • Segundo plano

  • Referência de Classe

  • Recursos adicionais

  • O que há de novo

Cenários

O estado de exibição é usado automaticamente pela estrutura da página ASP.NET para manter as informações que devem ser mantidas entre postagens.Essa informação inclui quaisquer valores de controles não padrão.

Você também pode usar estado de exibição para armazenar dados de aplicativo que são específicos para uma página.

Voltar ao topo

Recursos

O estado da exibição é um repositório em uma página ASP.NET que pode armazenar valores que precisam ser retidos durante a postagem.A estrutura de página usa estado de exibição para manter as configurações de controle entre postagens.

Você pode usar estado de exibição em seus próprios aplicativos para fazer o seguinte:

  • Manter valores entre postagens sem armazená-los em estado de sessão ou em um perfil de usuário.

  • Armazenar os valores das propriedades de página ou controle que você define.

  • Criar um provedor de estado de exibição personalizado que permite que você armazene informações do estado de exibição em um banco de dados SQL Server ou em outro armazenamento de dados.

Por exemplo, você pode armazenar informações no estado de exibição que seu código pode acessar durante o evento page load (carregar página) na próxima vez em que a página for enviada ao servidor.Para obter recomendações de uso, consulte Recomendações sobre Gerenciamento de Estado do ASP.NET.

Voltar ao topo

Segundo plano

Um aplicativo da Web é independente.Uma nova instância da classe página da Web é criada sempre que a página é solicitada a partir do servidor.Isso normalmente significa que todas as informações na página e em seus controles poderiam ser perdidas com cada processamento.Por exemplo, por padrão se um usuário digita informações em uma caixa de texto em um página da Web MTML, essas informações são enviadas para o servidor.No entanto, ele não é retornado ao navegador na resposta.

Para superar essa limitação intrínseca da programação da Web, a estrutura da página ASP.NET inclui vários recursos de gerenciamento de estado para preservar valores de página e controle entre idas para o servidor Web.Um desses recursos é o estado de exibição Visão Geral sobre o Gerenciamento de Estado do ASP.NET.

Por padrão, a estrutura da página ASP.NET usa estado de exibição para preservar valores de página e controle entre idas.Quando o MTML para a página é processada, o estado atual da página e valores que devem ser mantidos durante uma postagem são serializados em sequências codificadas na base 64.Em seguida, eles são colocados em um campo ou campos ocultos na página.

Você pode acessar estado de exibição no seu código usando a propriedade ViewState da página.A propriedade ViewState é um dicionário que contém pares chave/valor que contêm os dados do estado de exibição.

Observação de segurança:

É fácil para um usuário mal-intencionado ver e modificar o conteúdo de um campo oculto.Para obter mais informações sobre como proteger os dados de estado de exibição, consulte Protegendo o estado de exibição posteriormente neste tópico.

Para obter recomendações sobre quando você deve armazenar informações em estado de exibição, consulte Recomendações sobre Gerenciamento de Estado do ASP.NET.

Você pode alterar o comportamento padrão e armazenar estado de exibição em outro local, como um banco de dados SQL Server implementando uma classe PageStatePersister personalizada para armazenar os dados da página.Para obter um exemplo de como armazenar o estado de página em um fluxo em vez de em um campo oculto, consulte o exemplo para a classe PageStatePersister.

Considerações para usar o estado de exibição

O estado de exibição fornece informações do estado de uma página ASP.NET específica.Se você precisar usar informações em mais de uma página, ou se você precisar das informações para persistir em visitas ao site da Web, você deve usar outro método para manter o estado.Você pode usar o estado do aplicativo, estado de sessão ou propriedades de perfil.

Informações do estado de exibição são serializados em XML e, em seguida, codificados usando codificação base 64, que pode gerar grandes quantidades de dados.Quando a página é postada, o conteúdo do estado da exibição é enviado como parte das informações de postagem da página.Se o estado de exibição contém uma grande quantidade de informações, ele pode afetar Desempenho da página.Teste o desempenho das suas páginas usando dados típicos para seu aplicativo para determinar se o tamanho de estado de exibição está causando problemas de desempenho.Para alternativas ao uso de estado de exibição, consulte Recomendações sobre Gerenciamento de Estado do ASP.NET.

Se você não tiver que armazenar informações de controle para controles individuais, você pode desativar estado de exibição para um controle.Se um controle em uma página for atualizado a partir de armazenamento de dados em cada postagem, você pode desativar estado de exibição do controle para reduzir o tamanho de estado de exibição.Por exemplo, você pode desativar estado de exibição para um controle como o controle GridView.

Observação:

Mesmo quando você explicitamente desativa estado de exibição, um campo oculto ainda é enviada ao navegador para indicar que está ocorrendo um postagem para a página.

Outro consideração é que se a quantidade de dados em um campo oculto se torna grande, alguns proxies e firewalls impedirão o acesso para a página que os contém.Como a quantidade máxima permitida pode variar com diferentes implementações de firewall e proxy, campos ocultos grandes podem esporadicamente ser problemáticos.Se a quantidade de dados que são armazenados na propriedade ViewState exceder o valor especificado na propriedade MaxPageStateFieldLength da página, a página divide o estado de exibição em vários campos ocultos.Isso reduz o tamanho dos campos ocultos individuais abaixo do tamanho que firewalls rejeitam.

Alguns dispositivos móveis não permitem campos ocultos.Portanto, o estado da exibição não funcionará para esses dispositivos.Para mais informações e alternativas, consulte Visão geral sobre Desenvolvimento de Aplicativos para Dispositivos ASP.NET Móveis.

Estado de controle

Além do estado de exibição, o ASP.NET suporta estado de controle.A página usa estado de controle para manter informações de controle que devem ser retidas entre postagens, mesmo se estado de exibição estiver desativada para a página ou para um controle.Como estado de exibição, estado do controle é armazenado em um ou mais campos ocultos.

Salvar valores em estado de exibição

Você pode acessar informações de estado de exibição usando a propriedade ViewState da página, que expõe um objeto de dicionário.Você pode usar esse dicionário para armazenar valores personalizados.Um uso típico é para armazenar o valor das propriedades personalizadas que você define na página.

Porque o estado de exibição é enviado como uma campo oculto, você pode fazer alterações no estado de exibição até o evento PreRenderComplete da página.Após a página ser processada para o navegador, alterações no estado de exibição não serão salvas.

A informação no campo estado de exibição oculto pode ser vista pelos usuários se eles visualizarem a fonte da página da Web e puderem decodificar sequências codificadas na base 64.Isso cria um problema de segurança em potencial.Para obter mais informações sobre problemas de segurança com estado de exibição, consulte Protegendo o estado de exibição posteriormente contidas neste tópico.

Observação:

Para usar a propriedade ViewState, a página da Web ASP.NET deve ter um elemento form que possui o atributo .

Para salvar um valor para estado de exibição, crie um novo item que contém o valor para salvar e adicione o item ao dicionário do estado de exibição.O exemplo a seguir mostra um página da Web ASP.NET com o código que salva uma sequência e um valor inteiro em estado de exibição.

<%@ Page Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >
  ' Sample ArrayList for the page.
  Dim PageArrayList As ArrayList

  Function CreateArray() As ArrayList
    ' Create a sample ArrayList.
    Dim result As ArrayList
    result = New ArrayList(4)
    result.Add("item 1")
    result.Add("item 2")
    result.Add("item 3")
    result.Add("item 4")
    Return result
  End Function

  Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
    If (Me.ViewState("arrayListInViewState") IsNot Nothing) Then
      PageArrayList = CType(Me.ViewState("arrayListInViewState"), ArrayList)
    Else
      ' ArrayList isn't in view state, so it must be created and populated.
      PageArrayList = CreateArray()
    End If
    ' Code that uses PageArrayList.
  End Sub

  Sub Page_PreRender(ByVal sender As Object, ByVal e As EventArgs)
    ' Save PageArrayList before the page is rendered.
    Me.ViewState.Add("arrayListInViewState", PageArrayList)
  End Sub
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
    <title>View state sample</title>
</head>
<body>
    <form id="form1" >
    <div>
    </div>
    </form>
</body>
</html>

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >
  // Sample ArrayList for the page.
  ArrayList PageArrayList;

  ArrayList CreateArray()
  {
    // Create a sample ArrayList.
    ArrayList result = new ArrayList(4);
    result.Add("item 1");
    result.Add("item 2");
    result.Add("item 3");
    result.Add("item 4");
    return result;
  }

  void Page_Load(object sender, EventArgs e)
  {
    if (ViewState["arrayListInViewState"] != null)
    {
      PageArrayList = (ArrayList)ViewState["arrayListInViewState"];
    }
    else
    {
      // ArrayList isn't in view state, so it must be created and populated.
      PageArrayList = CreateArray();
    }
    // Code that uses PageArrayList.
  }
    
  void Page_PreRender(object sender, EventArgs e)
  {
    // Save PageArrayList before the page is rendered.
    ViewState.Add("arrayListInViewState", PageArrayList);
  }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
    <title>View state sample</title>
</head>
<body>
    <form id="form1" >
    <div>
    </div>
    </form>
</body>
</html>

Tipos de dados que você pode armazenar em estado de exibição

Você pode armazenar objetos dos seguintes tipos em estado de exibição:

  • Sequências

  • Números inteiros

  • Boolean valores

  • Objetos do Array

  • Objetos do ArrayList

  • Tabelas de hash

  • Conversores de tipo personalizados (consulte a classe TypeConverter para obter mais informações)

Você pode armazenar outros tipos de dados também, mas a classe deve ser compilada com o atributo Serializable para que seus valores podem ser serializados para estado de exibição.

Valores de leitura do estado de exibição

Para ler um valor de um estado de exibição, você obtém a propriedade ViewState da página e, em seguida, lê o valor do dicionário do estado de exibição.

O exemplo a seguir mostra como você pode obter um objeto ArrayList chamado arrayListInViewState do estado de exibição e, em seguida, acoplar um controle GridView para o objeto como uma fonte de dados.

Dim arrayList As ArrayList
arrayList = CType(ViewState("arrayListInViewState"), ArrayList)

Me.GridView1.DataSource = arrayList
Me.GridView1.DataBind()

arrayList = new ArrayList();
arrayList = (ArrayList)ViewState["arrayListInViewState"];

this.GridView1.DataSource = arrayList;
this.GridView1.DataBind();

Valores em estado de exibição são digitadas como String.Em Visual Basic, se você definir Option Strict On, você deve converter valores de estado de exibição para o tipo apropriado antes de usá-los, conforme mostrado no exemplo anterior.Em C#, você sempre deve converter para o tipo apropriado ao ler valores do estado da exibição.

Nenhuma exceção é lançada se você tentar obter um valor do estado da exibição que não existe.Para certificar-se que um valor está em estado de exibição, verifique primeiro se o objeto existe.O exemplo a seguir mostra como verificar uma entrada de estado de exibição.

If ViewState("color") Is Nothing Then
    ' No such value in view state, take appropriate action.
End If
if (ViewState["color"] == null)
    // No such value in view state, take appropriate action.

Se você tentar usar uma entrada de estado de exibição inexistente de alguma forma (por exemplo, para examinar seu tipo), uma exceção NullReferenceException é acionada.

Voltar ao topo

Protegendo o Estado de Exibição da Página

Por padrão, dados de estado de exibição são armazenados na página em um campo oculto e são codificados usando codificação base 64.Além disso, um hash dos dados de estado de exibição é criado a partir de dados usando uma chave de código de autenticação da máquina (MAC).O valor de hash é adicionado aos dados de estado de exibição codificados e a sequência de caracteres resultante é armazenada na página.Quando a página é lançada de volta para o servidor, a estrutura da página ASP.NET recomputa o valor de hash e o compara com o valor armazenado em estado de exibição.Se os valores de hash não corresponderem, é levantada uma exceção que indica que dados do estado de exibição podem ser inválidos.

Criando um valor de hash, a estrutura da página ASP.NET pode testar se os dados do estado de exibição foram corrompidos ou violados.No entanto, mesmo que não tenham sido adulterados, dados do estado de exibição podem ainda ser interceptados e lidos por usuários mal-intencionados.

Usando o MAC para computação do valor de hash de estado de exibição

A chave MAC que é usada para calcular o valor de hash do estado de exibição é gerado automaticamente ou especificado no arquivo Machine.config.Se a chave é gerada automaticamente, ela é criada com base no endereço MAC do computador, que é o valor GUID exclusivo do adaptador de rede no computador.

Pode ser difícil para os usuários mal-intencionados usarem a engenharia reversa na chave MAC baseados no valor de hash do estado de exibição.Assim, codificação MAC é uma maneira razoavelmente confiável de determinar se os dados do estado de exibição foram alterados.

Em geral, quanto maior a chave MAC que for usada para gerar o hash, menos provável é que o valor de hash para diferentes sequências de caracteres seja a mesma.Quando a chave é gerada automaticamente, o ASP.NET usa a codificação SHA-1 para criar uma chave grande.No entanto, em um ambiente Web farm, a chave deve ser a mesma entre todos os servidores.Se não a chave é a mesma, e a página está lançada novamente para um servidor diferente daquele que criou a página, a estrutura da página ASP.NET irá levantar uma exceção.Portanto, em um ambiente Web farm, você deve especificar uma chave no arquivo Machine.config em vez de permitir que o ASP.NET gere uma automaticamente.Nesse caso, certifique-se de criar uma chave que é longa o bastante para oferecer segurança suficiente para o valor de hash.No entanto, quanto mais longa a chave é, mais tempo leva para criar um hash.Portanto, você deve avaliar as necessidades de segurança versus necessidades de desempenho.

Criptografando o estado de exibição

Embora codificação MAC ajude a evitar a violação dos dados de estado de exibição, ela não impede que os usuários de visualizar os dados.Você pode impedir que pessoas veja esses dados de duas maneiras: transmitindo a página via SSL e criptografia de dados de estado de exibição.Exigir que a página seja enviada pelo SSL pode ajudar a impedir o rastreamento de pacotes de dados e o acesso a dados não autorizado por pessoas que não sejam os destinatários pretendidos pela página.

No entanto, o usuário que solicitou a página ainda pode visualizar os dados do estado de exibição porque o SSL descriptografa a página para exibí-lo no navegador.Isso basta se você não estiver preocupado sobre o acesso de usuários autorizados aos dados do estado de exibição.No entanto, em alguns casos, os controles podem usar estado de exibição para armazenar informações a que nenhum usuário deve ter acesso.Por exemplo, a página pode conter um controle de vinculação de dados que armazena identificadores de item (chaves de dados) em estado de exibição.Se os identificadores contiverem dados confidenciais, como de identificações de clientes, você deve criptografar os dados do estado de exibição além de, ou em vez de enviar a página pelo SSL.

Para criptografar os dados, defina a propriedade ViewStateEncryptionMode da página para true.Se você armazenar informações em estado de exibição, você pode usar técnicas de leitura e gravação regulares; a página trata de toda a criptografia e descriptografia para você.Criptografar os dados de estado de exibição pode afetar o desempenho do seu aplicativo.Portanto, não use criptografia a menos que precisar.

Estado de controle de criptografia

Controles que usam estado do controle podem exigir que estados de exibição sejam criptografados chamando o método RegisterRequiresViewStateEncryption.Se qualquer controle na página requer que o estado de exibição seja criptografado, todos os estado de exibição na página serão criptografados.

Codificação de estado de exibição por usuário

Se um site da Web autentica os usuários, você pode definir a propriedade ViewStateUserKey no manipulador de eventos Page_Init para associar o estado de exibição da página a um usuário específico.Isso ajuda a evitar ataques com um único clique, no qual um usuário mal-intencionado cria uma página da Web válida, pré-preenchida com estados de exibição de uma página criada anteriormente.Em seguida, o invasor atrai uma vítima para clicar em um link que envia a página para o servidor usando a identidade da vítima.

Quando a propriedade ViewStateUserKey é definida, identidade do invasor é usada para criar o hash do estado de exibição da página original.Quando a vítima reenvia a página, os valores de hash serão diferentes, pois as chaves do usuário são diferentes.A página falhará verificação e vai ser apresentada uma exceção.

Você deve associar a propriedade ViewStateUserKey com um valor exclusivo para cada usuário, como a nome de usuário ou identificador.

Proteção de configuração em ambiente de hospedagem compartilhada

Em um ambiente de hospedagem compartilhada, usuários mal-intencionados podem potencialmente modificar propriedades de gerenciamento de estado que podem afetar outros aplicativos no computador.Isso pode ser feito por meio modificação direta do arquivo Machine.config, modificação por meio de classes de configuração e outras ferramentas de administração e configuração.Você pode evitar a modificação de suas configurações de aplicativo criptografando seções dos arquivos de configuração.Para mais informações, consulte: Criptografando informações de configuração usando configuração protegida.

Referência de Classe

ViewState

Fornece um objeto de dicionário para retenção de valores entre as solicitações para a mesma página.

PageStatePersister

Fornece um meio para definir um mecanismo personalizado para armazenar informações de estado de exibição, como em um banco de dados de SQL Server.

Voltar ao topo

Consulte também

Conceitos

Visão Geral sobre o Gerenciamento de Estado do ASP.NET

Recomendações sobre Gerenciamento de Estado do ASP.NET

Referência

Voltar ao topo