Partilhar via


Controles de servidor

pela Microsoft

ASP.NET 2.0 aprimora os controles do servidor de várias maneiras. Neste módulo, abordaremos algumas das alterações de arquitetura da maneira como o ASP.NET 2.0 e o Visual Studio 2005 lidam com controles de servidor.

ASP.NET 2.0 aprimora os controles do servidor de várias maneiras. Neste módulo, abordaremos algumas das alterações de arquitetura da maneira como o ASP.NET 2.0 e o Visual Studio 2005 lidam com controles de servidor.

Estado de exibição

A principal alteração no estado de exibição no ASP.NET 2.0 é uma redução significativa no tamanho. Considere uma página com apenas um controle Calendário nela. Aqui está o estado de exibição no ASP.NET 1.1.

dDwtMTg1NDkwMjc0Nzt0PDtsPGk8MT47PjtsPHQ8O2w8aTwxPjs
+O2w8dDxAMDxwPHA8bDxTRDs+O2w8bDxTeXN0ZW0uRGF0ZVRpbWUsIG1
zY29ybGliLCBWZXJzaW9uPTEuMC41MDAwLjAsIEN1bHR1cmU9bmV1dHJ
hbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OTwyMDA1LTE
xLTA4Pjs+Oz4+Oz47Ozs7Ozs7Ozs7Pjs7Pjs+Pjs+Pjs+lkX2YWqfACtP
/VWr8G03pob/+tU=

Agora, aqui está o estado de exibição em uma página idêntica no ASP.NET 2.0.

/wEPDwULLTEzNjg5MjAxMzgPZBYCAgMPZBYCAgEPPCsAC
gEADxYCHgJTRBYBBgDAEX8OsscIZGRkllfArINjlhvzQX7Xfign2q6HK5E=

Essa é uma alteração bastante significativa e, considerando que o estado de exibição é levado para frente e para trás durante a transmissão, essa alteração pode dar aos desenvolvedores um aumento significativo de desempenho. A redução no tamanho do estado de exibição deve-se, em grande parte, à maneira como lidamos com ele internamente. Lembre-se de que o estado de exibição é uma cadeia de caracteres codificada em Base64. Para entender melhor a alteração no estado de exibição no ASP.NET 2.0, vamos dar uma olhada nos valores decodificados dos exemplos acima.

Aqui está o estado de exibição 1.1 decodificado:

t<-1854902747;t<;l<i<1>;>;l<t<;l<
i<1>;>;l<t<@0<p<p<l<SD;>;l<l<
System.DateTime, mscorlib, Version=1.0.5000.0, Culture=neutral, 
PublicKeyToken=b77a5c561934e089<2005-11-08>;>;>>;
>;;;;;;;;;;>;;>;>>;>>;>Eaj

Isso pode parecer um pouco sem sentido, mas há um padrão aqui. No ASP.NET 1.x, usamos caracteres únicos para identificar tipos de dados e valores delimitados usando os <> caracteres. O "t" no exemplo de estado de exibição acima representa um Triplet. O Triplet contém um par de ArrayLists (o "l" representa um ArrayList.) Uma dessas ArrayLists contém um Int32 ("i") com um valor de 1 e o outro contém outro Triplet. O Triplet contém um par de ArrayLists etc. O importante a lembrar é que usamos trigêmeos que contêm pares, identificamos os tipos de dados por meio de uma letra e usamos os < caracteres e > como delimitadores.

No ASP.NET 2.0, o estado de exibição decodificado parece um pouco diferente.

-1368920138 d 
 d 
 
 
 SD 
 dddWc A ('ڮ

Você deve observar uma grande alteração na aparência do estado de exibição decodificado. Essa alteração tem vários fundamentos arquitetônicos. O estado de exibição no ASP.NET 1.x usou o LosFormatter para serializar dados. Na versão 2.0, usamos a nova classe ObjectStateFormatter. Essa classe foi projetada especificamente para auxiliar na serialização e desserialização do estado de exibição e do estado de controle. (O estado de controle será abordado na próxima seção.) Há muitos benefícios obtidos alterando o método pelo qual a serialização e a desserialização ocorrem. Um dos mais dramáticos é o fato de que, ao contrário do LosFormatter que usa um TextWriter, o ObjectStateFormatter usa um BinaryWriter. Isso permite que ASP.NET 2.0 armazene o estado de exibição de uma série de bytes em vez de cadeias de caracteres. Veja, por exemplo, um inteiro. No ASP.NET 1.1, um inteiro exigia 4 bytes de estado de exibição. No ASP.NET 2.0, esse mesmo inteiro requer apenas 1 byte. Outros aprimoramentos foram feitos para diminuir a quantidade de estado de exibição armazenado. Os valores de DateTime, por exemplo, agora são armazenados usando um TickCount em vez de uma cadeia de caracteres.

Como se tudo isso não fosse suficiente, foi dada atenção especial ao fato de que um dos maiores consumidores do estado de exibição em 1.x era o DataGrid e controles semelhantes. Uma grande desvantagem dos controles, como o DataGrid, no que diz respeito ao estado de exibição, é que ele geralmente contém grandes quantidades de informações repetidas. No ASP.NET 1.x, essas informações repetidas eram simplesmente armazenadas repetidamente, resultando em um estado de exibição bloated. No ASP.NET 2.0, usamos a nova classe IndexedString para armazenar esses dados. Se uma cadeia de caracteres se repetir, apenas armazenaremos o token para IndexedString e o índice dentro de uma tabela em execução de objetos IndexedString.

Estado do controle

Uma das principais reclamações que os desenvolvedores tinham com o estado de exibição foi o tamanho que ele adicionou ao conteúdo HTTP. Conforme mencionado anteriormente, um dos maiores consumidores do estado de exibição é o controle DataGrid. Para evitar grandes quantidades de estado de exibição geradas por um DataGrid, muitos desenvolvedores simplesmente desabilitam o estado de exibição para esse controle. Infelizmente, essa solução nem sempre foi boa. O estado de exibição no ASP.NET 1.x contém não apenas os dados necessários para a funcionalidade correta do controle. Ele também contém informações sobre o estado da interface do usuário do controle. Isso significa que, se você quiser permitir a paginação em um DataGrid, deverá habilitar o estado de exibição mesmo que não precise de todas as informações da interface do usuário que o estado de exibição contém. É um cenário tudo ou nada.

No ASP.NET 2.0, o estado de controle resolve bem esse problema por meio da introdução do estado de controle. O estado de controle contém os dados absolutamente necessários para a funcionalidade adequada de um controle. Ao contrário do estado de exibição, o estado de controle não pode ser desabilitado. Portanto, é importante que os dados armazenados no estado de controle sejam cuidadosamente controlados.

Observação

O estado de controle é mantido junto com o estado de exibição no campo de formulário oculto __VIEWSTATE.

Este vídeo é um passo a passo do estado de exibição e do estado de controle.

Captura de tela do vídeo passo a passo que descreve os campos estado de exibição e estado de controle, mostrando uma janela do navegador do Windows Explorer.

Abrir vídeo Full-Screen

Para que um controle de servidor leia e escreva no estado de controle, você deve executar três etapas.

Etapa 1: Chamar o método RegisterRequiresControlState

O método RegisterRequiresControlState informa ASP.NET que um controle precisa persistir o estado de controle. Ele usa um argumento do tipo Control, que é o controle que está sendo registrado.

É importante observar que o registro não persiste da solicitação para a solicitação. Portanto, esse método deve ser chamado em cada solicitação se um controle for persistir o estado de controle. É recomendável que o método seja chamado em OnInit.

protected override void OnInit(EventArgs e) { Page.RegisterRequiresControlState(this); base.OnInit(e); }

Etapa 2: substituir SaveControlState

O método SaveControlState salva as alterações de estado de controle para um controle desde o último postback. Ele retorna um objeto que representa o estado do controle.

Etapa 3: Substituir LoadControlState

O método LoadControlState carrega o estado salvo em um controle . O método usa um argumento do tipo Object que contém o estado salvo para o controle.

Conformidade XHTML completa

Qualquer desenvolvedor da Web sabe a importância dos padrões em aplicativos Web. Para manter um ambiente de desenvolvimento baseado em padrões, ASP.NET 2.0 é totalmente compatível com XHTML. Portanto, todas as marcas são renderizadas de acordo com os padrões XHTML em navegadores que dão suporte a HTML 4.0 ou superior.

A definição de DOCTYPE no ASP.NET 1.1 foi a seguinte:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN

No ASP.NET 2.0, a definição doctype padrão é a seguinte:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Se você escolher, poderá alterar a conformidade XHTML padrão por meio do nó xhtmlConformance no arquivo de configuração. Por exemplo, o seguinte nó no arquivo web.config alterará a conformidade XHTML para XHTML 1.0 Strict:

<xhtmlConformance mode="Strict" />

Se você escolher, também poderá configurar ASP.NET para usar a configuração herdada usada no ASP.NET 1.x da seguinte maneira:

<xhtmlConformance mode="Legacy" />

Renderização adaptável usando adaptadores

No ASP.NET 1.x, o arquivo de configuração continha uma <seção browserCaps> que populava um objeto HttpBrowserCapabilities. Esse objeto permitiu que um desenvolvedor determinasse qual dispositivo está fazendo uma solicitação específica e renderizasse o código adequadamente. No ASP.NET 2.0, o modelo melhorou e agora usa a nova classe ControlAdapter. A classe ControlAdapter substitui eventos no ciclo de vida do controle e controla a renderização de controles com base nos recursos do agente do usuário. Os recursos de um agente de usuário específico são definidos por um arquivo de definição de navegador (um arquivo com uma extensão de arquivo .browser) armazenado na pasta c:\windows\microsoft.net\framework\v2.0.****\CONFIG\Browsers.

Observação

A classe ControlAdapter é uma classe abstrata.

Assim como a <seção browserCaps> na 1.x, o arquivo de definição do navegador usa uma Expressão Regular para analisar a cadeia de caracteres do agente do usuário para identificar o navegador solicitante. Ela define recursos específicos para esse agente de usuário. O ControlAdapter renderiza o controle por meio do método Render. Portanto, se você substituir o método Render, não deverá chamar Render na classe base. Isso pode fazer com que a renderização ocorra duas vezes, uma para o adaptador e outra para o próprio controle.

Desenvolvendo um adaptador personalizado

Você pode desenvolver seu próprio adaptador personalizado herdando de ControlAdapter. Além disso, você pode herdar da classe abstrata PageAdapter nos casos em que um adaptador é necessário para uma página. O mapeamento de controles para o adaptador personalizado é realizado por meio do <elemento controlAdapters> no arquivo de definição do navegador. Por exemplo, o XML a seguir de um arquivo de definição do navegador mapeia o controle Menu para a classe MenuAdapter:

<controlAdapters> <adapter controlType="System.Web.UI.WebControls.Menu" adapterType="System.Web.UI.WebControls.Adapters.MenuAdapter" /> </controlAdapters>

Usando esse modelo, torna-se muito fácil para um desenvolvedor de controle direcionar um determinado dispositivo ou navegador. Também é bastante simples para um desenvolvedor ter controle total sobre como as páginas são renderizadas em cada dispositivo.

renderização de Per-Device

As propriedades de controle do servidor no ASP.NET 2.0 podem ser especificadas por dispositivo usando um prefixo específico do navegador. Por exemplo, o código abaixo alterará o Texto de um rótulo dependendo de qual dispositivo está sendo usado para navegar na página.

<asp:Label ID="lblBrowser" runat="server" Text="You are browsing from an unknown device." ie:Text="You are browsing from Internet Explorer." mozilla:Text="You are browsing from Firefox."> </asp:Label>

Quando a página que contém esse rótulo for navegada da Internet Explorer, o rótulo exibirá o texto dizendo "Você está navegando da Internet Explorer". Quando a página for navegada do Firefox, o rótulo exibirá o texto "Você está navegando do Firefox". Quando a página for navegada de qualquer outro dispositivo, ela exibirá "Você está navegando de um dispositivo desconhecido". Qualquer propriedade pode ser especificada usando essa sintaxe especial.

Configurando Foco

ASP.NET desenvolvedores 1.x frequentemente perguntaram sobre como definir o foco inicial em um controle específico. Por exemplo, em uma página de logon, é útil fazer com que a caixa de texto ID de Usuário tenha o foco quando a página for carregada pela primeira vez. No ASP.NET 1.x, fazer isso exigia a gravação de algum script do lado do cliente. Embora esse script seja uma tarefa trivial, ele não é mais necessário em ASP.NET 2.0 graças ao método SetFocus. O método SetFocus usa um argumento que indica o controle que deve receber o foco. Esse argumento pode ser a ID do cliente do controle como uma cadeia de caracteres ou o nome do controle Server como um objeto Control. Por exemplo, para definir o foco inicial para um controle TextBox chamado txtUserID quando a página for carregada pela primeira vez, adicione o seguinte código a Page_Load:

if (!IsPostBack) {
    SetFocus(txtUserID);
}

--Ou

if (!IsPostBack) {
    SetFocus(txtUserID.ClientID);
}

ASP.NET 2.0 usa o manipulador Webresource.axd (discutido anteriormente) para renderizar uma função do lado do cliente que define o foco. O nome da função do lado do cliente é WebForm_AutoFocus conforme mostrado aqui:

<script type="text/javascript"> <!-- WebForm_AutoFocus('txtUserID'); // --> </script>

Como alternativa, você pode usar o método Focus para um controle para definir o foco inicial para esse controle. O método Focus deriva da classe Control e está disponível para todos os controles ASP.NET 2.0. Também é possível definir o foco para um controle específico quando ocorre um erro de validação. Isso será abordado em um módulo posterior.

Novos controles de servidor no ASP.NET 2.0

Veja a seguir novos controles de servidor no ASP.NET 2.0. Entraremos em mais detalhes sobre alguns deles em módulos posteriores.

Controle ImageMap

O controle ImageMap permite adicionar pontos de acesso a uma imagem que pode iniciar uma postagem de volta ou navegar até uma URL. Há três tipos de hotspots disponíveis; CircleHotSpot, RectangleHotSpot e PolygonHotSpot. Os hotspots são adicionados por meio de um editor de coleção no Visual Studio ou programaticamente no código. Não há nenhuma interface do usuário disponível para pontos de acesso de desenho em uma imagem. As coordenadas e o tamanho ou o raio do ponto de acesso devem ser especificados declarativamente. Também não há representação visual de um ponto de acesso no designer. Se um hotspot estiver configurado para navegar até uma URL, a URL será especificada por meio da propriedade NavigateUrl do hotspot. No caso de um ponto de acesso pós-back, a propriedade PostBackValue permite que você passe uma cadeia de caracteres na postagem de volta que pode ser recuperada no código do lado do servidor.

Captura de tela da tela Editor de Coleção HotSpot sendo exibida na janela de arquivo SP X do ponto padrão.

Figura 1: Editor de Coleção HotSpot no Visual Studio

Controle BulletedList

O controle BulletedList é uma lista com marcadores que pode ser facilmente associada a dados. A lista pode ser ordenada (numerada) ou desordenada por meio da propriedade BulletStyle. Cada item na lista é representado por um objeto ListItem.

Captura de tela do menu suspenso Tarefas da Lista com Marcadores em uma lista não ordenada, com a opção Escolher Fonte de Dados sendo focalizado.

Figura 2: Controle BulletedList no Visual Studio

Controle HiddenField

O controle HiddenField adiciona um campo de formulário oculto à sua página, cujo valor está disponível no código do lado do servidor. Geralmente, espera-se que o valor de um campo de formulário oculto permaneça inalterado entre os postbacks. No entanto, é possível que um usuário mal-intencionado altere o valor antes de postar de volta. Se isso acontecer, o controle HiddenField aumentará o evento ValueChanged. Se você tiver informações confidenciais no controle HiddenField e quiser garantir que elas permaneçam inalteradas, você deverá manipular o evento ValueChanged em seu código.

Controle FileUpload

O controle FileUpload no ASP.NET 2.0 possibilita carregar arquivos em um servidor Web por meio de uma página ASP.NET. Esse controle é bastante semelhante à classe HtmlInputFile ASP.NET 1.x com algumas exceções. No ASP.NET 1.x, foi recomendável que a propriedade PostedFile fosse verificada como nula para determinar se você tinha um bom arquivo. O controle FileUpload no ASP.NET 2.0 adiciona uma nova propriedade HasFile que você pode usar para a mesma finalidade e é um pouco mais eficiente.

A propriedade PostedFile ainda está disponível para acesso a um objeto HttpPostedFile, mas algumas das funcionalidades do HttpPostedFile agora estão disponíveis intrinsecamente com o controle FileUpload. Por exemplo, para salvar um arquivo carregado no ASP.NET 1.x, você chama o método SaveAs no objeto HttpPostedFile. Usando o controle FileUpload no ASP.NET 2.0, você chamaria o método SaveAs no próprio controle FileUpload.

Outra alteração significativa no comportamento 2.0 (e provavelmente a alteração mais significativa) é que não é mais necessário carregar um arquivo carregado inteiro na memória antes de salvá-lo. No 1.x, qualquer arquivo carregado é salvo inteiramente na memória antes de ser gravado em disco. Essa arquitetura impede o carregamento de arquivos grandes.

No ASP.NET 2.0, o atributo requestLengthDiskThreshold do elemento httpRuntime permite configurar quantos Kilobytes são mantidos em um buffer na memória antes de serem gravados em disco.

IMPORTANTE: a documentação do MSDN (e a documentação em outro lugar) especifica que esse valor está em bytes (não kilobytes) e que o padrão é 256. Na verdade, o valor é especificado em Kilobytes e o valor padrão é 80. Ao ter um valor padrão de 80K, garantimos que o buffer não acabe no heap de objetos grandes.

Controle do Assistente

É bastante comum encontrar ASP.NET desenvolvedores lutando para tentar coletar informações em uma série de "páginas" usando painéis ou transferindo de página para página. Na maioria das vezes, o esforço é frustrante e é demorado. O novo controle assistente resolve os problemas permitindo etapas lineares e não lineares em uma interface do assistente com a qual os usuários estão familiarizados. O controle Assistente apresenta formulários de entrada em uma série de etapas. Cada etapa é de um tipo específico especificado pela propriedade StepType do controle . Os tipos de etapa disponíveis são os seguintes:

Tipo de etapa Explicação
Auto O assistente determina automaticamente o tipo de etapa com base em sua posição dentro da hierarquia de etapas.
Iniciar A primeira etapa, geralmente usada para apresentar uma instrução introdutória.
Etapa Uma etapa normal.
Concluir A etapa final, geralmente usada para apresentar um botão para concluir o assistente.
Concluir Apresenta uma mensagem comunicando êxito ou falha.

Observação

O controle Assistente controla seu estado usando ASP.NET estado de controle. Portanto, a propriedade EnableViewState pode ser definida como false sem qualquer prejuízo.

Este vídeo é um passo a passo do controle Assistente.

Captura de tela de um passo a passo do vídeo do Controle do Assistente. A tela Controles do Servidor com uma janela do Microsoft Visual Studio é exibida.

Abrir vídeo Full-Screen

Localizar Controle

O controle Localize é semelhante a um controle Literal. No entanto, o controle Localize tem uma propriedade Mode que controla como a marcação adicionada a ele é renderizada. A propriedade Mode dá suporte aos seguintes valores:

Modo Explicação
Transformação A marcação é transformada de acordo com o protocolo do navegador que está fazendo a solicitação.
Passagem A marcação é renderizada no momento em que se encontra.
Codificar A marcação adicionada ao controle é codificada usando HtmlEncode.

Controles MultiView e View

O controle MultiView atua como um contêiner para controles View e o controle View atua como um contêiner (assim como um controle Panel) para outros controles. Cada exibição em um controle MultiView é representada por um único controle View. O primeiro controle Exibir no MultiView é o modo de exibição 0, o segundo é o modo de exibição 1, etc. Você pode alternar exibições especificando o ActiveViewIndex do controle MultiView.

Controle de substituição

O controle Substituição é usado em conjunto com o cache de ASP.NET. Nos casos em que você deseja aproveitar o cache, mas tem partes de uma página que devem ser atualizadas em cada solicitação (em outras palavras, partes de uma página isentas de cache), o componente Substituição fornece uma ótima solução. Na verdade, o controle não renderiza nenhuma saída por conta própria. Em vez disso, ele está associado a um método no código do lado do servidor. Quando a página é solicitada, o método é chamado e a marcação retornada é renderizada no lugar do controle de substituição.

O método ao qual o controle Substituição está associado é especificado por meio da propriedade MethodName . Esse método deve atender aos seguintes critérios:

  • Deve ser um método estático (compartilhado no VB).
  • Ele aceita um parâmetro do tipo HttpContext.
  • Ele retorna uma cadeia de caracteres que representa a marcação que deve substituir o controle na página.

O controle Substituição não tem a capacidade de modificar qualquer outro controle na página, mas tem acesso ao HttpContext atual por meio de seu parâmetro.

Controle GridView

O controle GridView é a substituição do controle DataGrid. Esse controle será abordado mais detalhadamente em um módulo posterior.

Controle DetailsView

O controle DetailsView permite exibir um único registro de uma fonte de dados e editá-lo ou excluí-lo. Ele é abordado com mais detalhes em um módulo posterior.

Controle FormView

O controle FormView é usado para exibir um único registro de uma fonte de dados em uma interface configurável. Ele é abordado com mais detalhes em um módulo posterior.

Controle AccessDataSource

O controle AccessDataSource é usado para associar dados a um banco de dados do Access. Ele é abordado com mais detalhes em um módulo posterior.

Controle ObjectDataSource

O controle ObjectDataSource é usado para dar suporte a uma arquitetura de três camadas para que os controles possam ser associados a dados a um objeto de negócios de camada intermediária em vez de um modelo de duas camadas em que os controles são associados diretamente à fonte de dados. Ele será discutido mais detalhadamente em um módulo posterior.

Controle XmlDataSource

O controle XmlDataSource é usado para associar dados a uma fonte de dados XML. Ele é abordado com mais detalhes em um módulo posterior.

Controle SiteMapDataSource

O controle SiteMapDataSource fornece associação de dados para controles de navegação do site com base em um mapa do site. Ele será discutido mais detalhadamente em um módulo posterior.

Controle SiteMapPath

O controle SiteMapPath exibe uma série de links de navegação comumente chamados de trilhas. Ele é abordado com mais detalhes em um módulo posterior.

O controle Menu exibe menus dinâmicos usando DHTML. Ele é abordado com mais detalhes em um módulo posterior.

Controle TreeView

O controle TreeView é usado para exibir uma exibição de árvore hierárquica de dados. Ele é abordado com mais detalhes em um módulo posterior.

Controle de logon

O controle Logon fornece um mecanismo para fazer logon em um site. Ele é abordado com mais detalhes em um módulo posterior.

Controle LoginView

O controle LoginView permite a exibição de diferentes modelos com base no logon de um usuário status. Ele é abordado com mais detalhes em um módulo posterior.

Controle PasswordRecovery

O controle PasswordRecovery é usado para recuperar senhas esquecidas por usuários de um aplicativo ASP.NET. Ele é abordado com mais detalhes em um módulo posterior.

LoginStatus

O controle LoginStatus exibe o logon de um usuário status. Ele é abordado com mais detalhes em um módulo posterior.

LoginName

O controle LoginName exibe o nome de usuário de um usuário depois de ser conectado a um aplicativo ASP.NET. Ele é abordado com mais detalhes em um módulo posterior.

Createuserwizard

O CreateUserWizard é um assistente configurável que oferece aos usuários a capacidade de criar uma conta de associação ASP.NET para uso em um aplicativo ASP.NET. Ele é abordado com mais detalhes em um módulo posterior.

ChangePassword

O controle ChangePassword permite que os usuários alterem sua senha para um aplicativo ASP.NET. Ele é abordado com mais detalhes em um módulo posterior.

Várias WebParts

ASP.NET 2.0 é fornecido com várias Web Parts. Eles serão abordados em detalhes em um módulo posterior.