Tag Archives: WebForms

ASP.NET – Obtendo o valor de um WebControl no OnInit do WebForms

Bom, outro dia disse que também sabia escrever sobre .NET. Como o pessoal de tecnologia é cético e apesar dos artigos já escritos aqui, vou tentar me arriscar em mais para tirar a prova.

Se tem algo que gosto no WebForms, é a versatilidade. Montagem de páginas dinâmicas (entenda montar como adicionar controles na página em tempo de execução) foi algo com que sempre me dei bem. CMSs como DotNetNuke e Umbraco são exemplos dessa “dinamicidade”. Quem vive disso sabe do que estou falando, das suas vantagens, e problemas.

Dentre eles, é que, como trabalhamos com controle dinâmicos, temos o cuidado de montar todos eles no evendo OnInit da página para manter o ViewState intacto. Até aqui, sem segredos. O problema é quando precisamos aplicar alguma regra de negócio na montagem dos controles que dependa por exemplo, de um valor num TextBox. Isso é um problema porque no OnInit, o ViewState ainda não foi aplicado.

Bom, a informação está lá no ViewState, mas como chegar até ela? Na necessidade, vasculhando o próprio ViewState e com a ajuda deste “How To” da Microsoft, cheguei num método que recebe como parâmetro o UniqueID do controle e o HttpRequest, você consegue chegar no valor antes antes do Page_Load.

public static string getControlValueByRequest(string UniqueID, HttpRequest request)
{
    System.Collections.Specialized.NameValueCollection postedValues = request.Form;
    String nextKey;
    String value = string.Empty;
 
    for (int i = 0; i < postedValues.AllKeys.Length; i++)
    {
        nextKey = postedValues.AllKeys[i];
        if (nextKey.Substring(0, 2) != "__")
        {
            if (nextKey == UniqueID)
            {
                value = postedValues[i];
            }
        }
    }
 
    return value;
}

Aos mais entendidos, sabemos que a informação pode ser recuperada pelo Request.Form, mas o vínculo do valor com o controle de origem da informação que é o complicado, e é onde o método acima faz o trabalho sujo de passar por todo o conjunto de chaves/valor guardado no Request.Form e aplicando uma “regrinha” (atenção ao if (nextKey.Substring(0, 2) != “__”)) para chegar no valor desejado.

Isto posto, mais um helper para seus projetos WebForms, pelo menos para que ainda os cria. 🙂

Bom proveito!

How To da Microsoft

http://msdn.microsoft.com/en-us/library/6c3yckfw.aspx

ASP.NET – Adicionando mensagens do ValidationSummary

Faz tempo que tinha essa necessidade. Já que utilizamos o ValitadionSummary como um concentrador de mensagens de erro, porque não mantê-lo, inclusive para mostrar nossas próprias mensagens, além daquelas que os controles de validação do ASP.NET WebForms nos fornece?

Haviam algumas opções a isso, como criar seus próprios validators, utilizar o CustomValidator em alguns casos ou até um BulletList apontando para o mesmo CssClass no ValitadionSummary para dar a impressão de se tratar da mesma lista. Bom, nenhuma delas era uma solução completa, já que cheiravam a POG.

Bom, uma navegada na internet é o código abaixo me é apresentado:

public class ValidationError : IValidator
{
    private ValidationError(string message)
    {
        ErrorMessage = message;
        IsValid = false;
    }
 
    public string ErrorMessage { get; set; }
 
    public bool IsValid { get; set; }
 
    public void Validate()
    {
        // no action required
    }
 
    public static void Display(string message)
    {
        Page currentPage = HttpContext.Current.Handler as Page;
        currentPage.Validators.Add(new ValidationError(message));
    }
}

Crie esta classe em um local acessível ao seu projeto Web. Agora, no momento em que desejar adicionar uma mensagem, basta usar a seguinte linha de código:

ValidationError.Display("Oops, Aconteceu algum erro.");

Heresia ou não, quase tão simples quando ativar um MessageBox, não? Quando esse código é chamado, o efeito é o mesmo do que tivesse ativado uma função de um CustomValidator (sem client side) e a mensagem aparecerá dentro do ValidationSummary. Mais explicações técincas e créditos no post do autor da proeza:

http://blogs.msdn.com/b/simonince/archive/2008/02/28/adding-messages-to-a-validation-summary.aspx

Bom proveito!

ASP.NET – Correspondência entre WebControls e elementos HTML

Sejamos sinceros. Configura o layout de uma aplicação Web feita em ASP.NET com WebForms e consequentemente seus WebControls é um desafio e tanto para os Designers. Isso acontece porque ainda é um mistério completo o que vai sair do “outro lado da linha”, ou seja, quais elementos HTML serão gerados na saída do navegador.

A engine de renderização do ASP.NET é inteligente o suficiente para promover mudanças no código gerado dependendo das capacidades do navegador. Mas como essas alterações são mais na questão do comportamento e geração de scripts, é possível estabelecer um padrão de geração de componentes HTML e WebControls para controlar melhor a configuração de estilos.

O pessoal do blog Nima Dilmaghani publicou uma tabela com a correspondência padrão entre WebControls e componentes HTML correspondentes tentar facilitar o mapeamento de estilos, que pode ser vista abaixo.

ASP.NET Control HTML Element
Label span
TextBox input type=”text”
TextBox TextMode=”MultiLine” textarea
TextBox TextMode=”Password” input type=”password”
Button input type=”submit”
LinkButton a href=”javascript:__doPostBack(’LinkButton1′,”)”
ImageButton input type=”image”
HyperLink a
DropDownList select
ListBox select size=”4″ gives you 4 rows
ListItem option
CheckBox input type=”checkbox”
RadioButton input type=”radio” seguido de um label para apresentar o texto
RadioButtonList um table com tr e td, sendo um td para cada item da lista. Em cada td, há um conjunto de controles equivalente ao RadioButton
Image img
ImageMap img and a map tag holding one or more of the following 3:
CircleHotSpot area shape=”circle”
PolygonHotSpot area shape=”poly”
RectangleHotSpot area shape=”rect”
Table table
TableHeaderRow tr
TableRow tr
TableFooterRow tr
TableHeaderCell th
TableCell td
BulletedList ul with each list item:
ListItem li
HiddenField input type=”hidden”
Literal Sem html correspondente.
Calendar table complexa
AdRotator a
FileUpload input type=”file”
Wizard uma table complexa. Isso se o estilo padrão for mantido. É possível definir templates customizados para os passos do Wizard, deixa no layout mais amigável a padronizado, facilitando a aplicação de estilos.
Xml <?xml version=”1.0″ encoding=”utf-8″?>
MultiView MultiView não gera elementos html diretamente. Apenas seu conteúdo e controles são gerados.
Panel div
PlaceHolder Placeholder não possui elemento html correspondente. O que será renderizado é referente aos controles que nele forem adicionados através do método PlaceHolder.Controls.Add() não sequência em que forem adicionados.
Substitution Sem html correspondente
Localize Sem html correspondente. O conteúdo é exibido diretamente
Validation controls span

É bom lembrar que a partir da versão 2.0, o ASP.NET dispõem do recurso de Themes. Este permite um mapeamento entre WebControls e classes CSS, o que em teoria despreocupa os Designers, já que não é mais necessário saber o que será gerado no HTML final. O desenvolvedor mapeia através de um arquivo .skin os controles e as respectivas classes CSS que serão aplicadas e estes. Como sugestão, pela experiência que tive, vale a pena gastar um tempo explicando para os Designers como funciona o arquivo .skin para que a partir daí, ele tenha controle total da aplicação de estilos em páginas aspx baseadas em WebForms.

De resto, é só orientar os desenvolvedores a não poluir demasiadamente o HTML gerado para não atrapalhar a aplicação dos estilos.

Adicionalmente, os colegas do blog ainda listaram 10 regras para a boa utilização e aplicação de css em páginas ASP.NET:

http://nimad.wordpress.com/2007/10/02/10-rules-for-effective-use-of-css-in-aspnet/

Bom divertimento!

Tomás