É necessário manter informações de estado das páginas da Web e seus controles. No entanto, como as aplicações web são construídas sobre o protocolo HTTP, que é um protocolo sem estado, a manutenção das informações de estado torna-se muito difícil. Para resolver este problema, a tecnologia ASP.NET 2.0 oferece uma variedade de soluções, como uso de Sessão, Cookie, estado de visualização, estado de controle, campos ocultos, strings de consulta, configuração personalizada do usuário (Perfil), etc. Para usar a tecnologia ASP.NET 2.0 para criar controles de servidor, manter as informações de estado também é muito importante. A principal solução é usar o estado de visualização e o estado de controle. Este artigo explica detalhadamente o conhecimento básico do estado de visualização (ViewState) e apresenta o método de aplicação do estado de visualização por meio de aplicativos típicos.
Visão geral do estado de exibição
Visualizar estado é uma tecnologia muito importante que permite que a página e os controles na página mantenham informações de estado durante o percurso de ida e volta do servidor ao cliente e de volta do cliente. Dessa forma, um efeito de página com estado e executado continuamente pode ser criado em um ambiente sem estado como a Web. Esta seção apresenta principalmente o mecanismo operacional, métodos de aplicação, tipos de dados armazenados, desempenho e segurança, bloqueio de estado de visualização (este é um novo recurso do ASP.NET 2.0), vantagens e desvantagens do estado de visualização.
(1)
O processo de execução específico do estado de visualização do mecanismo em execução é: sempre que o usuário solicita uma página .aspx, o framework .NET primeiro serializa os dados de estado dos controles relacionados em uma string e, em seguida, transforma-os em um arquivo chamado __VIEWSTATE O valor Value do campo oculto é enviado ao cliente. Se a página for solicitada pela primeira vez, o controle do servidor também será executado pela primeira vez. O campo oculto denominado __VIEWSTATE contém apenas as informações padrão do controle, que geralmente está vazio ou nulo. No evento de postback subsequente, o estado da propriedade do controle de servidor disponível no postback anterior é salvo em ViewState. Isso permite que o controle do servidor monitore o estado antes que ocorra o evento de postback atualmente tratado. Esses processos são atendidos pelo framework .NET e, para os usuários, a execução da página .aspx terá o efeito de execução contínua.
(2) Tipos de dados armazenados
O estado de visualização pode armazenar vários tipos de dados e, para melhorar a eficiência operacional, o próprio estado de visualização também inclui um conjunto de métodos de serialização otimizados para tipos comuns. Os tipos de dados suportados pelo método de serialização de estado de visualização por padrão incluem o seguinte: String, Int32, Unit, Color, Array, ArrayList, HashTable e conversor de tipo personalizado TypeConverter.
O estado de visualização foi otimizado para objetos Array, ArrayList e HashTable contendo os tipos listados acima. Portanto, ao usar o estado de visualização em controles, você deve tentar limitar seu uso aos tipos de dados simples acima, bem como aos tipos otimizados. Aqui, precisamos nos concentrar no conversor de tipo personalizado TypeConverter, que fornece um método unificado para converter o tipo de valor em outros tipos e acessar valores padrão e subpropriedades. Por exemplo, você pode usar TypeConverter para converter uma string em um valor numérico ou um valor numérico em uma string. Se não houver conversor de tipo, a estrutura da página usará a função de serialização binária fornecida pela estrutura .NET para serializar o objeto. Este processo consome muitos recursos.
(3) Desempenho e Segurança
Ao usar o estado de visualização, os objetos devem ser serializados primeiro e depois desserializados via postback. Portanto, precisamos saber algo sobre o desempenho do ViewState. Por padrão, o ViewState do controle estará habilitado. Se você não precisar usar o ViewState, é melhor desligá-lo. ViewState não será mais necessário nas seguintes situações: (1) O controle não define eventos do lado do servidor (os eventos de controle neste momento são todos eventos do lado do cliente e não participam do postback); nenhum valor de propriedade dinâmico ou vinculado a dados. A maneira de desativar o estado de visualização é definir o valor EnableViewState do controle como "false", ou seja, EnableViewState="false".
Por padrão, quando o conteúdo relacionado ao estado de visualização é compilado e enviado ao cliente, o leitor verá o conteúdo do campo oculto __VIEWSTATE no código HTML da página. Estas são algumas strings sem sentido e são o resultado da codificação do conteúdo relevante pela estrutura .NET por meio da codificação Base64. Eles são enviados entre o cliente e o servidor em texto não criptografado. Em alguns casos, como quando conteúdo confidencial, como senhas, contas, cadeias de conexão, etc., está envolvido, é muito inseguro usar o método padrão. Para esse fim, o .NET framework fornece dois mecanismos de segurança para ViewState:
Mecanismo de verificação:
você pode instruir o .NET framework para anexar um código hash aos dados do ViewState definindo o atributo EnableViewStateMAC="true" (o código hash é um A tipo SHA1 com comprimento de 160 bits, portanto afetará seriamente o desempenho da execução). Quando ocorre um evento de postback, o código hash será restabelecido e deverá corresponder ao código hash original. Desta forma, pode-se verificar efetivamente se o ViewState pode ser adulterado durante o processo de transmissão. Por padrão, o .NET Framework usa o algoritmo SHA1 para gerar códigos hash ViewState. Além disso, você também pode selecionar o algoritmo MD5 definindo <machineKey> no arquivo machine.config, conforme mostrado abaixo: <machineKey validação="MD5" />. O desempenho do algoritmo MD5 é melhor que o do algoritmo SHA1, mas também não é seguro o suficiente.
· O mecanismo de criptografia
usa criptografia para proteger os valores reais dos dados nos campos ViewState. Primeiro, EnableViewStatMAC="true" deve ser definido conforme descrito acima. Em seguida, defina o tipo de validação machineKey como 3DES, ou seja, <machineKey validaçãoKey="AutoGenerate" decryptionKey="AutoGenerate" validação="3DES" />, que instrui o ASP.NET a usar o algoritmo de criptografia 3DES para criptografar o valor ViewState.
(4) Bloqueio de estado de visualização
O conteúdo acima apresenta alguns conhecimentos básicos sobre estado de visualização. No entanto, alguns leitores podem ficar confusos: e se os dados do estado de visualização se tornarem muito grandes em alguns casos? Obviamente, isso terá algumas consequências não intencionais. Para esse fim, o ASP.NET 2.0 adiciona um novo recurso chamado "visualização de bloqueio de estado". Se a quantidade de dados no estado de visualização se tornar muito grande, a fragmentação do estado de visualização quebra automaticamente os dados em vários blocos e os coloca em vários campos de formulário ocultos.
Para ativar a fragmentação do estado de exibição, defina a propriedade MaxPageStateFieldLength com o tamanho máximo permitido em um único campo de estado de exibição, em bytes. Quando a página é postada de volta no servidor, a página analisa a sequência de estado de visualização durante a fase de inicialização da página e restaura as informações de propriedade na página. A configuração padrão é -1, o que significa que não há tamanho máximo e o estado de visualização não será dividido em partes.
(5) Vantagens e Desvantagens
O uso do estado de visualização tem as três vantagens a seguir: 1. Consome menos recursos do servidor (em comparação com Aplicativo e Sessão). Porque os dados do estado de visualização são gravados no computador cliente. 2. Fácil de manter. Por padrão, o sistema .NET habilita automaticamente a manutenção dos dados de estado de controle. 3. Recursos de segurança aprimorados. Os valores no estado de visualização são hash, compactados e codificados na implementação Unicode, que é mais seguro do que usar campos ocultos.
Usar o estado de visualização tem as três desvantagens a seguir: 1. Considerações de desempenho. Como o estado de visualização é armazenado na própria página, se um valor grande for armazenado, o usuário ainda poderá ficar lento ao exibir e enviar a página, mesmo que o estado de visualização seja fragmentado. 2. Limitações do equipamento. Os dispositivos móveis podem não ter capacidade de memória suficiente para armazenar grandes quantidades de dados de estado de visualização. Portanto, ao mover controles de servidor em um dispositivo, um método de implementação diferente é usado. 3. Potenciais riscos de segurança. O estado de visualização é armazenado em um ou mais campos ocultos na página. Embora o estado de visualização armazene dados em formato hash, eles podem ser adulterados. Se você visualizar a fonte de saída da página diretamente, poderá ver informações em campos ocultos, levando a possíveis problemas de segurança.
Aplicações típicas
No processo de desenvolvimento de controles de servidor usando a tecnologia ASP.NET 2.0, há muitos aspectos onde o estado de visualização pode ser usado. É comum usar o dicionário ViewState para implementar propriedades de controle de servidor. ViewState é do tipo System.Web.UI.StateBag - um dicionário de pares chave/valor no qual os valores das propriedades de controle do servidor podem ser armazenados. A seguir, é usado um exemplo típico para ilustrar o método de aplicação do ViewState.
No controle de servidor personalizado LabelInViewState, duas propriedades Text e TextInViewState são implementadas. O primeiro é criado usando variáveis privadas e o último é implementado usando ViewState. Todos eles são usados para obter ou definir conteúdo de texto. O código-fonte do arquivo de implementação de controle customizado LabelInViewState.cs é o seguinte.
usando System; usando System.Collections.Generic; usando System.ComponentModel; usando System.Text; usando System.Web; usando System.Web.UI; usando System.Web.UI.WebControls;namespace WebControlLibrary{ [Propriedade Padrão("Texto")] [ToolboxData("<{0}:LabelInViewState runat=servidor></{0}:LabelInViewState>")] classe pública LabelInViewState: WebControl { private string _text; //Implementar o atributo Text public string Text { pegar { retornar (_text == nulo)? string.Empty: _text; } definir {_texto = valor}; } //Use ViewState para implementar a propriedade TextInViewState public string TextInViewState { pegar { String s = (String)ViewState["TextInViewState"]; retornar ((s == nulo)? String.Empty: s); } definir {ViewState["TextInViewState"] = valor }; } // Substitui o método RenderContents protected override void RenderContents(HtmlTextWriter output) { saída.Write("Texto = "); saída.Write(Texto); saída.Write("<br/>"); saída.Write("TextInViewState = "); saída.Write(TextInViewState); } } } |
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%@ Register Namespace="WebControlLibrary" Assembly="WebControlLibrary" TagPrefix="sample" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="servidor"> void Button1_Click(objeto remetente, EventArgs e) { demoLabel.Text = TextBox1.Text; demoLabel.TextInViewState = TextBox2.Text; } </roteiro> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="servidor"> <title>Usar estado de visualização ViewState </title> </cabeça> <body style="tamanho da fonte: pequeno;"> <form id="form1" runat="servidor"> <div> Nome: |
O código acima exibido na página inclui duas caixas de texto, dois botões e um controle de servidor personalizado LabelInViewState. Conforme mostrado no manipulador de eventos Button1_Click, quando o botão "Enviar" é clicado, o controle LabelInViewState obterá o texto na caixa de texto e o exibirá. As renderizações do aplicativo são mostradas nas Figuras 1 e 2.
![]() Figura 1 Clique no botão enviar | ![]() Figura 2 Clique no botão recarregar |