RSS feed
Marcação HTML mais limpa com Formulários Web da ASP.NET 4 - Client IDs (Série de posts sobre VS 2010 e .NET 4.0) - ScottGu's Blog em Português

Marcação HTML mais limpa com Formulários Web da ASP.NET 4 - Client IDs (Série de posts sobre VS 2010 e .NET 4.0)


Este é o décimo sexto de uma série de posts que estou escrevendo sobre o próximo lançamento do VS 2010 e .NET 4.

O post de hoje é o primeiro de alguns posts que vou escrever, os quais falam sobre algumas mudanças importantes que tivemos que fazer nos formulários web (Web Forms) na ASP.NET 4 para gerar marcação HTML limpa, compatível com padrões e amigável com CSS. Hoje eu vou escrever sobre o trabalho que estamos fazendo para prover melhor controle sobre os atributos "ID" renderizados no lado do cliente através de controles do servidor.

[Além do blog, eu também estou agora utilizando o Twitter para atualizações rápidas e para compartilhar links.Siga-me em: twitter.com/scottgu]

Marcação HTML Limpa, Baseada em Padrões, Amiga da CSS

Uma das reclamações mais comuns que os desenvolvedores têm frequentemente no que diz respeito aos Formulários Web da ASP.NET é que quando eles usam controles do servidor, eles não têm a capacidade de gerar marcação HTML limpa e amigável. Algumas das queixas específicas com referência às versões anteriores da ASP.NET incluem:

  • Atributos ID gerados automaticamente dentro da marcação HTML tornam difícil escrever JavaScript e estilos CSS.
  • O uso de tabelas em vez de uma marcação semântica para determinados controles (em especial o controle asp:menu) torna feio os estilos aplicados.
  • Alguns controles renderizam propriedades de estilo inline (juntamente com o HTML do controle), mesmo que nenhuma propriedade de estilo do controle tenha sido definida.
  • O objeto ViewState muitas vezes pode ser maior do que o ideal.

A ASP.NET 4 oferece melhor suporte nativo para a construção de páginas compatíveis com os padrões do mercado. Os controles do servidor <asp:> nativos com a ASP.NET 4 agora geram marcação HTML mais limpa e suportam a aplicação de estilos CSS - e ajudam a resolver todos os problemas listados acima. 

Compatibilidade da Marcação HTML Quando Atualizando Aplicações que usam Formulários Web

Uma pergunta comum que as pessoas muitas vezes fazem ao ouvir sobre a marcação HTML mais limpa que está chegando com a ASP.NET 4 é "Ótimo - mas e minhas aplicações existentes?" Estas mudanças/melhorias quebrarão o código quando eu atualizar?

Para ajudar a assegurar que nós não quebraremos suposições em torno da marcação HTML e estilos nas aplicações que usam Formulários Web, nós permitimos a configuração de um flag (sinalizador) - controlRenderingCompatbilityVersion - dentro do arquivo Web.config que permite que você decida se você quer usar a nova abordagem de marcação HTML mais limpa que é padrão com aplicações da ASP.NET 4, ou se por motivos de compatibilidade você quer renderizar a mesma marcação HTML que versões anteriores da ASP.NET usavam:

imagem 

Quando o sinalizador controlRenderingCompatbilityVersion é definido como "3.5" a sua aplicação e controles do servidor renderizarão código de saída usando a mesma marcação HTML usada com o VS 2008 e .NET 3.5. Quando o sinalizador controlRenderingCompatbilityVersion é definido como "4.0" sua aplicação e controles do servidor irão aderir à especificação XHTML 1.1, terão IDs no lado do cliente mais limpos, serão renderizados com correção semântica em mente e não terão os estilos CSS inline estranhos.

O sinalizador terá como padrão o valor 4.0 para todas as novas aplicações de Formulários Web da ASP.NET que sejam criadas usando a ASP.NET 4. Qualquer aplicação anterior que for atualizada usando o VS 2010 terá o sinalizador controlRenderingCompatbilityVersion automaticamente ajustado para 3.5 através do assistente de atualização para garantir compatibilidade com versões anteriores. Você pode, opcionalmente, alterar o valor do sinalizador (no nível da aplicação ou definindo escopos dentro do arquivo Web.config para que o sinalizador seja empregado por página ou nível de diretório) para o caso de você modificar as suas páginas para usar CSS, permitindo que você tire proveito da nova renderização de HTML.

O Tópico de Hoje sobre Marcação HTML mais Limpa: Client IDs - IDs no lado do Cliente

A capacidade de ter atributos ID em elementos HTML mais limpos, previsíveis é algo que os desenvolvedores pedem já há muito tempo para os Formulários Web (valores de ID como "ctl00_ContentPlaceholder1_ListView1_ctrl0_Label1" não são muito populares e amigáveis). Ter controle sobre os valores de ID renderizados ajuda a tornar muito mais fácil a escrita de código JavaScript que referencia a marcação HTML gerada, torna fácil aplicar estilos CSS nos elementos e em páginas grandes pode ajudar a reduzir o tamanho da Marcação HTML gerada.

Nova Propriedade ClientIDMode em Controles

A ASP.NET 4 suporta uma propriedade nova chamada ClientIDMode na classe base Control. A propriedade ClientIDMode indica como os controles devem gerar valores de ID no lado do cliente quando estes forem renderizados. A propriedade ClientIDMode suporta quatro valores possíveis:

  • AutoID—Renderiza a saída como no .NET 3.5 (IDs gerados automaticamente, os quais ainda renderizarão prefixos iguais ctrl00 por motivos de compatibilidade)
  • Predictable/Previsível (Padrão)—Remove qualquer string de ID "ctl00" , e se for um controle de lista/contêiner, concatena IDs filhos (por exemplo: id = "ParentControl_ChildControl")
  • Static/Estático—Passa para a mão do desenvolvedor o controle completo sobre o nome dado ao atributo ID - o que o desenvolvedor definir como o ID do controle é o que será processado (por exemplo: id = "JustMyId")
  • Inherit/Herdar—Sinaliza ao controle para que este use o modo de nomeação de controles proveniente do controle pai

A propriedade ClientIDMode pode ser definida diretamente em controles individuais (ou dentro de controles do contêiner - neste caso, os controles dentro do contêiner herdarão a configuração do contêiner):

imagem

A propriedade ClienteIDMode também pode ser especificada no nível da página ou de um UserControl - controle definido/criado pelo usuário (usando diretivas <@% Page %> ou <%@ Control %>) - neste caso os controles que ficam dentro das páginas/usercontrols herdam a configuração (e podem, opcionalmente, substituí-la):

imagem

A propriedade ClienteIDMode também pode ser definida no arquivo Web.config de uma aplicação - neste caso as páginas que ficam dentro da aplicação herdam a configuração (e, opcionalmente, podem substituí-la):

imagem

Isso lhe dá a flexibilidade para personalizar/substituir o comportamento de nomeação como quiser.

Exemplo: Usando a propriedade ClientIDMode para controlar os IDs dos Controles que Não São Listas

Vamos dar uma olhada em como podemos usar a nova propriedade ClientIDMode para controlar a renderização de elementos "ID" dentro de uma página. Para ajudar a ilustrar isso, podemos criar uma página simples chamada "SingleControlExample.aspx" que é baseada em uma master-page chamada "Site.Master ", e que tem um único controle <asp:label> com um ID igual a "Message" que está contido dentro de um controle contêiner <asp:content> chamado "MainContent":

imagem

Dentro do nosso arquivo de code-behind, vamos então adicionar um código simples, como o mostrado a seguir para preencher dinamicamente a propriedade Text do label no tempo de execução:

imagem 

Se estivéssemos executando esta aplicação com a ASP.NET 3.5 (ou se tivéssemos configurado nossa aplicação ASP.NET 4 para ser executada usando a renderização da ASP.NET 3.5 ou ClientIDMode = AutoID), então a marcação HTML gerada e enviada para o cliente ficaria como a mostrada a seguir:

imagem

Essa identificação é única (o que é bom) - mas um pouco feia em virtude do prefixo "ct100" (o que é ruim).

Renderização de Marcação HTML quando ASP.NET 4 é utilizada e ClientIDMode é configurada com "Predictable"

Com a ASP.NET 4, controles do servidor por padrão agora renderizam seus IDs usando ClientIDMode="Predictable". Isso ajuda a garantir que os valores de ID sejam únicos e que os mesmos não estejam em conflito em uma página, e ao mesmo tempo faz com que os IDs sejam menos verbosos e mais previsíveis. Isto significa que a marcação HTML gerada para nosso controle <asp:label> acima será por padrão com a ASP.NET 4 igual ao código mostrado a seguir:

imagem

Observe que o prefixo "ct100" não aparece mais. Em virtude do controle "Message" estar dentro de um controle contêiner chamado "MainContent", por padrão seu ID será prefixado com "MainContent_Message" para evitar possíveis colisões/conflitos com outros controles em algum outro lugar dentro da página.

Renderização de Marcação HTML quando ASP.NET 4 é utilizada e ClientIDMode é configurada com "Static"

Às vezes você não deseja que seus valores de ID sejam aninhados hierarquicamente, e ao invés disso, você somente quer que o ID renderizado tenha o valor definido por você. Para permitir isso, você pode agora usar ClientIDMode="Static". Neste caso, o ID renderizado será exatamente o mesmo que você definiu no lado do servidor que está sob seu controle. Isso fará com que a marcação HTML mostrada a seguir seja renderizada com a ASP.NET 4:

imagem

Esta opção te dá agora a capacidade de controlar completamente no lado do cliente os valores de ID enviados pelos controles.

Exemplo: Usando a propriedade ClientIDMode para controlar a lista de IDs dos controles ligados/vinculados a dados

Controles de lista/grid ligados a dados têm sido historicamente os mais difíceis para usar e aplicar estilos CSS quando trabalhamos com IDs gerados automaticamente nos Formulários Web. Vamos agora dar uma olhada em um cenário onde nós vamos personalizar o ID renderizado usando um controle ListView com a ASP.NET 4.

O trecho de código a seguir é um exemplo de um controle ListView que exibe o conteúdo de uma coleção de dados vinculados - neste caso, aeroportos:

imagem

Podemos então escrever o código mostrado a seguir dentro do nosso arquivo code-behind para dinamicamente vincularmos uma lista de aeroportos na ListView declarada acima:

imagem

Em tempo de execução, será gerada então por padrão uma lista <ul> de aeroportos como mostrado a seguir. Note que, devido os elementos <ul> e <li> no template da ListView não serem controles do servidor, nenhum ID é gerado em nossa marcação HTML:

imagem

Adicionando IDs no Lado do Cliente para Cada Item/Linha

Agora, vamos dizer que queremos adicionar um ID no lado do cliente na saída HTML, para que possamos acessar programaticamente cada elemento <li> via JavaScript. Queremos que estes ID's sejam únicos, previsíveis e identificáveis.

Uma primeira abordagem seria marcar cada elemento <li> dentro do template/modelo como sendo um controle do servidor (dando-lhe um atributo runat=server) e dando a cada um uma ID de "aeroporto":

imagem

Por padrão, a ASP.NET 4 vai agora renderizar IDs limpos, como mostrado a seguir (ids com ctl001 não serão renderizados):

imagem 

Usando a Propriedade ClientIDRowSuffix

Nosso modelo acima agora gera um ID único para cada elemento <li> - mas se nós iremos acessá-los programaticamente no cliente usando JavaScript, podemos querer que os IDs contenham o código do aeroporto dentro dos elementos <li> para que seja fácil referenciá-los. A boa notícia é que nós podemos fazer isso facilmente, aproveitando a nova propriedade ClientIDRowSuffix em controles de dados vinculados da ASP.NET 4 para controlar de maneira melhor os ID's dos nossos elementos de linha.

Para fazer isso, vamos definir a propriedade ClientIDRowSuffix com "Code" no nosso controle ListView. Isso informa a ListView para que esta use a propriedade "Code" da nossa classe Airport ao gerar o ID:

imagem

Agora, ao invés de termos sufixos de linha como "1", "2" e "3", teremos o valor do código do aeroporto (Airport.Code) inserido dentro dos IDs (por exemplo: _CLE, _CAK, _PDX, etc):

imagem

Você pode usar essa abordagem ClientIDRowSuffix com outros controles de dados vinculados, como o GridView também. Esta abordagem é útil quando você quiser programar elementos de linha no lado cliente - e usar IDs limpos/identificáveis para facilmente referenciá-los a partir do código JavaScript.

Resumo

A ASP.NET 4 permite a você gerar marcação HTML muito mais limpa a partir de controles do servidor e a partir de suas aplicações Web Forms/Formulários Web. 

No post de hoje eu cobri como você pode agora facilmente controlar os valores de ID do cliente que são renderizados pelos controles do servidor. Nos próximos posts eu vou cobrir algumas das outras melhorias de marcação HTML que também estão chegando com o lançamento da ASP.NET 4.

Espero que ajude,

Scott

 

Texto traduzido do post original por Leniel Macaferi.

Published Tuesday, March 30, 2010 9:02 PM by Leniel Macaferi

Comments

# re: Marcação HTML mais limpa com Formulários Web da ASP.NET 4 - Client IDs (Série de posts sobre VS 2010 e .NET 4.0)

Sunday, January 9, 2011 6:20 PM by Claudio Shiniti

Muito bom o artigo. Parabéns...

Me ajudou a resolver alguns problemas no meu projeto. Obrigado...