quarta-feira, 15 de junho de 2011

Capítulo 4: Using Server Controls Lição 1: Exploring Common Server Controls

Depois da correria, deu um tempo de voltar a estudar.

Esta lição fala sobre os controles básico que usamos na web. Como postei no twitter, não deixa de ser interessante, muitas coisas que na prática não observamos, acabamos descobrindo quando pegamos um pouco de teoria.

Esta lição fala sobre alguns dos controles do asp.net, que a cada versão lança mais controles para poder disponibilizar ao usuário final do sistema ou site uma experiência cada vez mais rica.

Os controles do asp.net herdam a classe WebControl, diferente dos controles HTML. Os controles asp.net facilitam a manipulação dos mesmos do lado do servidor, porém o resultado final para o cliente sera sempre html, os controles do asp.net quando renderizados no browser são renderizados como controles html comuns.

Um controle asp.net proporciona mais funcionalidades do que controles html, outra vantagem interessante é que eles tem a capacidade de detectar a capacidade do navegador e renderizar o código ideal para aproveitar o potencial do navegador. Além disso existem controles asp.net que não tem controles correspondente no html, são controles que surgiram para facilitar em algumas tarefas como o Calendar, Wizard, e a GridView.

A lição lista e explica as propriedades que são comuns nos controles asp.net. Não irei explicar cada uma, apenas colocarei aqui as que foram destacadas:
  • AccessKey
  • BackColor
  • BorderColor
  • BorderWidth
  • BorderStyle
  • CssClass
  • Style
  • Enabled
  • EnableTheming
  • EnableViewState
  • Font
  • ForeColor
  • Height
  • SkinID
  • TabIndex
  • ToolTip
  • Width
Apesar de existirem essas propriedades, onde a maioria é sobre o estilo do controle é recomenado o uso de uma folha de estilo, CSS, como já mostrado em lições anteriores.

A lição fala sobre a atualização de versões anteriores. O engine de renderização do asp.net 3, diferente do asp.net 3.5 e do 4. Claro que o objetivo é sempre melhorar, e fazer com que os códigos htmls renderizados para o usuário final sejam mais rápidos e eficientes. Porém quando migramos uma aplicação/site do asp.net 3.5 por exemplo para o 4, devido essa diferença do engine alguns itens em nossas páginas podem mudar. O que fazer?

Existem duas soluções, a ideal, revisar seu código asp.net e ver o que mudou para ser melhor aproveitado. Porém como sabemos que nem sempre isso é possível, temos a opção de definir que nossa aplicação continuará usando o engine do framework 3.5. Pode fazer isso definindo no arquivo web.config:

<system.web>
<pages controlRenderingCompatibilityVersion="3.5"/>
</system.web>


Outro aspecto que é interessante ressaltar é que os controles do asp.net renderizam códigos html utilizando tabelas, como sabemos que é algo ultrapassado você tem a opção de alterar a propriedade RenderOuterTable para false, onde desta forma tudo sera renderizado conforme você trabalhou na sua folha de estilo.

Vamos aos controles desta lição:

O controle Label

O controle Label é utilizado quando você precisa exibir um texto em um determinado local de sua página, porém só utilize o controle Label do asp.net se precisa que seu valor seja dinâmico, quando é necessário altera-lo em tempo de execução, caso contrário utilize um texto estático do html que irá consumir menos recurso.

O controle Label é muito utilizado em formulários de preenchimento de dados, onde costumamos colocar o label a esquerda e os controles de textbox a direita por exemplo. Como os labels são muito comuns nesses casos, você pode definir teclas de atalhos do teclado para os labels. Por exemplo quando ele pressionar (Alt + U) ir para o textbox "Usuário'. Isto é muito útil com usuário que já tem uma experiências com teclado e não costumam utilizar o mouse, mas principalmente por questão de acessibilidade, pois nem todos os usuário hoje tem capacidade de controlar um mouse.

Para fazer esta associação da label e dos textbox a teclas de atalhos siga os passos:

  1. Adicione um controle Label e um Textbox;
  2. Defina a propriedade AccessKey da label para a letra que ativará o atalho, neste exemplo use a letra U;
  3.  Na propriedade Text da label coloque: <u>U</u>suário, desta forma irá renderizar: Usuário;
  4. Na propriedade AssociatedControlID coloquei o ID do seu Textbox;
O que acontecerá? Quando o usuário estiver nessa página e pressionar (Alt + U) automaticamente o textbox de usuário irá receber o foco.

O controle Literal

O Literal deve ser utilizado quando deseja adicionar HTML puro em sua página, apesar da idéia parecer semelhante ao Label, o Literal não herda de WebControl e não acrescenta qualquer elemento html a página, onde já o label acrescenta um <span> em sua página.

O Literal contém a propriedade Mode que é especificada a forma com que o conteúdo do Literal será tratado na página web. Existem 3 opções:
  • PassThrough: O texto será processado como ele foi passado ao Literal executando códigos htmls e até mesmo scripts que serã processados pelo navegador.
  • Encode: O conteúdo do texto é tratado como texto puro e não é processado como html ou scripts.
  • Transform: O conteúdo do texto é convertido para a linguagem do navegador podendo ser HTML, XHTML, WML ou cHTML. Onde nesses casos tags inválidas são removidas automaticamente.
 Abaixo exemplo de código e uma imagem de como o navegador processa ambos os casos:


protected void Page_Load(object sender, EventArgs e)
{
Literal1.Text =@"This is an <font size=7>example</font>"+
"<script>alert(""Hi from Literal1"");</script>";
Literal2.Text =@"This is an <font size=7>example</font>"+
"<script>alert(""Hi from Literal2"");</script>";
Literal3.Text =@"This is an <font size=7>example</font>"+
"<script>alert(""Hi from Literal3"");</script>";
Literal1.Mode = LiteralMode.Encode;
Literal2.Mode = LiteralMode.PassThrough;
Literal3.Mode = LiteralMode.Transform;
}


Resultado:














O controle TextBox

Este é o que tem menos segredos dos citados pela lição. A lição explica as três propriedades de TextMode, onde a primeira e a padrão é SingleLine, MultiLine (onde conforme for digitando informação o textbox vai aumentado suas linhas e criando uma barra de rolagem) e Password (onde as informações digitadas recebem uma mascara para não exibir o que esta sendo digitado).

O TextBox possui o evento padrão TextChanged que é acionado quando o valor o texto é alterado, porém vale ressaltar que ele so irá executar o evento no servidor se a propriedade AutoPostBack estiver como true ou quando outro controle efetuar o Postback.

O controle CheckBox

 O controle CheckBox é utilizado quando queremos disponibilizar ao usuário a escolha ou não de algo. Simplesmente a opção de Sim ou Não. Utilize a propriedade TextAlign para definir em qual lado da caixa de seleção ficará o texto. A propriedade Checked é utilizada para definir e obter o status do checkbox.


Assim como o textBox o CheckBox possui o evento CheckedChanged que é ativado quando seu valor é alterado, vale lembrar a mesma observação da propriedade AutoPostBack.


O controle RadioButton

Pensando que o CheckBox é um controle que da a opção de Sim e Não ao usuário, o controle RadioButton oferece várias opções para o usuário escolher uma sobre determinado grupo de itens. Para agrupar vários RadioButtons e garantir que somente um seja escolhido especifique o nome do grupo para todos eles, usando a propriedade GroupName. Para que exista um padrão, defina a propriedade Checked para true do RadioButton desejado.


Outra opção ao invés de criar vários RadioButton é criar um RadioButtonList e adicionar seus itens. 


As duas técnicas mencionadas acima são chamadas de Payment Type quando são usados vários controles RadioButton e Shipping Type quando é implementado um RadioButtonList.


O controle DropDownList

A intenção do DropDownList é a mesma do RadioButtonList, oferecer diversas opções para o usuário, a grande diferente é que o RadioButtonList exibe todas na tela, ja o DropDownList as opções ficam ocultas até que o usuário clique no controle e exiba todas as opções. O DropDownList deve ser escolhido quando existir um grande número de opções.

Caso não defina qual dos itens será o padrão o asp.net automaticamente deixará o primeiro item como padrão e já vira selecionado.

Você pode popular um DropDownList utilizando o método DropDownList.Items.Add passando como parâmetro uma string ou uma instância do objeto ListItem. Veja o exemplo no código abaixo:

for (int i = 1900; i < DateTime.Now.Year; i++)
{
BirthYearDropDownList.Items.Add(i.ToString());
}
if (!IsPostBack)
{
BirthYearDropDownList.SelectedIndex = 85;
}


Manipule o evento SelectedIndexChanged para executar algo quando o usuário selecionar algum item. Para verificar qual item esta selecinado utilize a propriedade SelectedValue.

 O controle ListBox

 O ListBox é como um CheckBoxList que permite ao usuário selecionar nenhum ou vários itens, assim como o DropDownList sua vantagem é que os dados ficam reduzidos não sendo exibidas todas as opções, ele cria uma barra de rolagem para navegar entre as opções.


Por padrão o ListBox permite ao usuário selecionar apenas uma opção, mas você pode alterar a propriedade SelectionMode para Multiple, permitindo assim selecionar várias opções. A dificuldade é que o usuário entenda como selecionar mais de um item, para isso ele deve manter a tecla Ctrl pressinada e escolher os itens desejados.


 O controle Button

O Button renderiza um botão comum na página que serve para executar um postback ao servidor. Existe duas formas de fazer isso, a padrão que é executando um submit, através do evento click do botão, como já foi explicado em lições anteriores. E um botão de comando.


Caso você tenha vários botões na sua página com funções semelhantes ao invés de criar o evento clique para cada botão, pode criar um único evento de comando que será executado por todos os botões. Defina o mesmo evento OnCommand para todos e defina a propriedade CommandName distinta para cada botão, que será a forma de identificar qual foi o botão clicado.


Exemplo:


<asp:Button ID="back" runat="server" oncommand="Button_Command" Text="Back" CommandName="Back" />
<asp:Button ID="up" runat="server" oncommand="Button_Command" Text="Up" CommandName="Up" />

protected void Button_Command(object sender, CommandEventArgs e)
{
switch (e.CommandName)
{
case "Back":
FeedbackLabel.Text = "Back";
break;
case "Up":
FeedbackLabel.Text = "Up";
break;
}
}

  
Simples e útil!!


Saindo um pouco dos principais controles do asp.net a lição mostra também como tornar controles html controles de servidor. Em resumo a grande verdade é, basta definir a propriedade ID e adicionar a propriedade runat="server". Mesmo que seja uma simples div html, executando este processo você conseguirá acessar esta div pelo seu código c# e manipula-la pelo servidor.


A lição até mostra uma página asp, migrando para asp.net sem trocar os controles:

Asp:

<html>
<head><title>Customer Page</title></head>
<body>
<form name="Form1" method="post" action="update.asp" id="Form1" >
<input type="text" name="CustomerName"
id="CustomerName" >
<input type="submit" name="SubmitButton"
value="Submit" id="SubmitButton" >
</form>
</body>
</html>


Asp.NET: 

<html>
<head><title>Customer Page</title></head>
<body>
<form name="Form1" method="post" id="Form1" runat=”server”>
<input type="text" name="CustomerName"
id="CustomerName" runat=”server” >
<input type="submit" name="SubmitButton"
value="Submit" id="SubmitButton" runat=”server”>
</form>
</body>
</html>


Repare que existe uma mudança na tag form também. Claro que isso limita um pouco sua página, pois o uso de controles asp.net deixará sua aplicação mais rica. Porém como vimos é possível.

Assim fechamos este primeira lição do Capítulo 4.


quinta-feira, 19 de maio de 2011

Capítulo 3: Handling Events and Managing State Lição 3: Using Server-Side State Management

Do contrário da lição 2, a lição 3 mostra as técnicas de gerenciamento de sessão no servidor. Você deve gerenciar os estados no servidor quando existe uma quantidade grande de dados e se torna oneroso a ida e vinda desses dados entre o cliente e o servidor. Outro grande motivo é a segurança, podemos trabalhar com dados sigilosos que não podem correr o risco de ficar disponível na máquina do cliente.

O asp.net disponibiliza duas formas de gerenciar pelo servidor, essas formas já foram citadas em lições anteriores. Os métodos são Application State e Session State.

O primeiro é global, ou seja, os dados são acessados por todos os usuário em qualquer página. Os dados armazenados no Application State são os mesmos para todos os usuários. Já o segundo método Session State é único por cada usuário, cada usuário tem a sua sessão, da mesma forma que o Application State os dados armazenados em Session State são acessados em qualquer página.

Application State

Os dados armazenados no Application State são globais e podem ser acessados em qualquer requisição de qualquer página. A classe HttpApplicationState é um dicionário de chave e valor e pode ser acessado pelo nome do chave. Os dados armazenados no Application State não são permanentes, no momento em que a aplicação é reiniciada, por exemplo quando o IIS ou o servidor é iniciado os dados armazenados neste sessão são perdidos.

Session State

 Os dados armazenados com Session State também podem ser acessados de qualquer página, a grande diferença é que é único por usuário (browser). Por padrão esses dados são armazenados na memória do servidor, mas é possível  é configurar para utilizar cookies, em State Serve ou em um banco de dados.


De forma similar ao Application State, o Session State é um dicionário de chave e valor, como demonstra o código:


// Caso a sessão não exista
if (Session["lastVisit"] != null)
{
    Label1.Text = ((DateTime)Session["lastVisit"]).ToString();
}
else
{
    Label1.Text = "Session does not have last visit information.";
}
// Definindo um valor para a sessão
Session["lastVisit"] = DateTime.Now;


Caso queira desabilitar o uso de sessões pode fazer no web.config:
<configuration>
<system.web>
<sessionState mode="off"/>
</system.web>
</configuration>


Ou  definir na diretiva da página no caso de desabilitar em páginas especificas, utilizando a propriedade EnableSessionState:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs"
Inherits="_Default" EnableSessionState = "False"%>


É possível configurar a forma com que irá utilizar sua sessão:
  • InProc: é o modo padrão. É o que oferece melhor desempenho em relação as outras opções. No entanto ele fica limitado em cenários de balanceamento de carga entre servidores. Pois não terá como garantir que um usuário comece e termine seu processo no mesmo servidor.
  • StateServer: Nesta configuração os dados armazenados na sessão não são perdidos quando a aplicação é reiniciada, e neste cenário é possível fazer o compartilhamento entre servidores. O StateServer é um serviço do asp.net que esta em qualquer máquina que possua o FrameWork instalado. Este serviço não é configurado para iniciar automaticamente e sim manualmente, por isso deve ser feito essa mudança para que inicie automaticamente caso deseja usar.
  • SQLServer: Tem os mesmos benefícios do StateServer, armazena os dados quando a aplicação é iniciada e  pode ser utilizado em vários servidores. Em hardware idêntico o StateServer supera o SQLServer, porém o SQLServer oferece integridade dos dados mais robustos e capacidade de relatórios.
  • Custom: Permite que você especifique uma sessão personalizada, necessitando do código para implementar seu armazenamento personalizado.
  • Off: Desativa as Sessões, deve utilizar esta opção caso queira desabilitar sessões.
Assim se encerra o capítulo III.

Abraços...

segunda-feira, 16 de maio de 2011

Capítulo 3: Handling Events and Managing State Lição 2: Using Client-Side State Management

Esta lição mostra as principais maneiras de gerenciamento de estado do lado do cliente, desta forma economizando recursos do servidor.

As principais técnicas são:
  • View state: O asp.net utiliza para controlar os valores dos controles entre as requisições da página.
  • Control state: É possível persistir informações específicas do controle sem utilizar a View State, é muito utilizado em casos de controles personalizados.
  • Hidden fields: Como a View State este campo fica no html mas não é renderizado para o usuário
  • Cookies: Um cookie fica armazenado no navegador do usuário, para cada requisição que é enviada para o servidor o valor do cookie é enviado também, é a maneira mais recomendada quando é necessário acessar este valor em diferentes páginas do mesmo domínio.
  • Query strings: É um valor informado pela url da página, fica visível ao usuário na barra de endereço do browser.
Antes de explicar sobre cada uma dessas formas de persistir os dados do lado do cliente, a lição explica vantagens e desvantagens de persistir os dados do lado do servidor e do lado do cliente.

Persistindo os dados no cliente, as vantagens são:
  • Melhor Escalabilidade: Caso utiliza-se do lado do servidor, a cada acesso de um cliente/usuário aumenta o uso de memória do servidor. Jogando esta carga para o cliente para um irá absorver o seu acesso e irá ter um grande consumo de recurso do servidor.
  • Suporte por Múltiplos Servidores: Caso você necessite de uma grande arquitetura de servidores, obter as informações do cliente que estão no browser será possível por qualquer servidor sem fazer um balanceamento de carga inteligente. Ou seja caso o usuário mude de servidor no meio de uma sessão, basta o servidor acessar os dados que estão no browser.
Vantagens de persistir os dados no servidor:
  • Melhor Segurança: A menos que você assine digitalmente as informações que estão no cliente, qualquer um pode alterar os dados armazenados. Ou seja nunca armazene no cliente dados confidenciais como senhas e níveis de acesso.
  • Redução de Banda: Os dados estando no servidor não é necessário o envio e recebimento dessas informações, os dados estando no cliente a cada requisição os dados são enviados ao servidor, utilizando banda do cliente e do seu servidor. O conselho é armazenar pequenas informações no cliente.
Qual usar? Agora é você que decide com bases nessas informações. Se você tiver uma aplicação com poucos usuário e informações sigilosas utiliza recursos do servidor. Se quer ganhar performance em sua aplicação utilize as duas formas, sabendo quando usar uma ou outra.

View State

View State é um mecanismo do asp.net para armazenar dados de um usuário entre as requisições da mesma página. A view state não é armazenada no servidor, fica no código html da página, ela armazena estados de exibição dos controles que são acessados entre cada requisição, não consumindo assim recursos do servidor.

Caso não desabilite a View State é padrão de todas as páginas. Um exemplo, quando faz uma consulta o servidor retorna os dados e o formulário é preenchido, quando o usuário alterar algum campo e clicar no botão gravar por exemplo, caso haja um erro no envio desses dados ao servidor, as informações já digitadas não será perdidas, pois os valores armazenados na View State permaneceram.

A View State é armazenada da seguinte forma no código html:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"
value="/wEPDwULLTEzNjkxMzkwNjRkZAVvqsMGC6PVDmbCxBlPkLVKNahk" />


Caso o valor seja muito grande a View State é quebrada em 2 ou quantas for necessária para armazenar  o valor. Repare que o valor é um hash e é compactado para oferecer maior segurança e maior performance que um campo hidden comum.

Como a View State ficar no código html, o usuário consegue modificar estes valores, porém o asp.net possui um código de autenticação que consegue validar se a View State foi alterada ou não.

Caso queira maior segurança para sua aplicação é possível criptografar suas View State através de uma configuração do Web.config:

<configuration>
<system.web>
<pages viewStateEncryptionMode="Always"/>
</system.web>
</configuration>


Só que desta forma irá perder um pouco de performance pois toda vez terá que ser feito a criptografia e a descriptografia. Uma alternativa seria criptografar somente as View State que forem realmente necessárias, colocando a diretiva diretamente na página:

<%@ Page Language="C#" AutoEventWireup="true" ViewStateEncryptionMode="Always"%>

Como disse por padrão a View State esta habilitada em todas as páginas e para todos os controles. Devido ao trafego de envio e recebimento de informações da View State você pode optar por desabilita-la.

Caso a página seja acessada por usuário de conexões lentas e sejam páginas com um grande número de controles, a lição especifica mais de 10 controles, vale a pena pensar na hipóteses de desabilita-la. Você deve controlar os dados que são armazenados na View State, para controlar a nível de página utilize as propriedades Page.EnableViewState e Page.ViewStateMode, para controles utilize Control.EnableViewState e Control.ViewStateMode.

A propriedades ViewStateMode é nova no FrameWork 4 e só terá efeito caso a propriedades EnableViewState esteja como true. Por padrão a ViewStateMode da Página tem o valor de Enabled e a propriedades ViewStateMode dos controles herdam o valor atribuido a propriedade da página.


Caso você defina o EnableViewState como falso a View State estara desabilitada independentemente do valor atribuido a propriedade ViewStateMode. Porém se manter a propriedades EnableViewState como verdadeira pode alterar a propriedade ViewStateMode para desabilitada. Em resumo trabalhe com a propriedade ViewStateMode. 

A lição tem uma tabela que ilustra como usar essas propriedades de forma mais simples:

Desabilitar a View State de uma página, porém habilitar de um controle especifico:
Page.Enable ViewState: True, Page.ViewState Mode: Disabled, Controle.Enable ViewState: True, Control.ViewState Mode: Enabled

Desabilitar a View State de uma página, e desabilitar de um controle especifico:
Page.Enable ViewState: True, Page.ViewState Mode: Disabled, Controle.Enable ViewState: False, Control.ViewState Mode: Disabled

Habilitar a View State de uma página, porém desabilitar de um controle especifico:
Page.Enable ViewState: True, Page.ViewState Mode: Enabled, Controle.Enable ViewState: False, Control.ViewState Mode: Disabled

Habilitar a View State de uma página, e de um controle especifico:
Page.Enable ViewState: True, Page.ViewState Mode: Enabled, Controle.Enable ViewState: True, Control.ViewState Mode: Enabled

Você pode desabilitar a View State de todo o projeto diretamente no web.config:
<configuration>
<system.web>
<pages enableViewState="false">
</system.web>
</configuration>


Para ler e escrever dados em uma View State é simples:


this.ViewState.Add("MyData", "some data value"); //Escrevendo
string myData = (string)ViewState["MyData"]; //Lendo


Hidden Fields


Não tenho muito o que explicar sobre Hidden Fields, são parecidos com a View State, são campos que armazenam valores, ficam no código html da página porém não são exibidos ao usuário. Só é possível ve-los acessando o código fonte da página.


Cookies


Outra prática comum pra quem já é desenvolvedor web. Cookies armazenam valores no browser do cliente e a cada requisição ao servidor os valores são enviados. A vantagem do uso de cookies sobre o uso de View State e Hidden Fields é que os cookies podem ser acessados de qualquer página desde que esteja no mesmo dominio em que foi criado.


É possível ainda configurar seu tempo de vida e seu dominio. Escrever e ler dados de um cookie é simples:
Response.Cookies.Add(New HttpCookie("userId", userId))

E para ler o valor:
Request.Cookies("userId").Value

Exemplo de código:
// Verifica se o cookie ja existe
if (Request.Cookies["lastVisit"] != null)
    // Encode the cookie in case the cookie contains client-side script
    Label1.Text = Server.HtmlEncode(Request.Cookies["lastVisit"].Value);
else
    Label1.Text = "No value defined";
// Define o valor do cookie
Response.Cookies["lastVisit"].Value = DateTime.Now.ToString();
Response.Cookies["lastVisit"].Expires = DateTime.Now.AddDays(1);


Query Strings

Outra prática comum em qualquer linguagem web. Query String é uso de parâmetros via URL. É formado de um parâmetro e seu valor correspondente. O primeiro parâmetro deve ser informado após o ponto de interrogação ?  os parâmetros seguintes com o &.


Exemplo: http://www.quintelab.com.br/bruno.aspx?id=1&nome=bruno


No exemplo acima o primeiro parâmetro é o ID e o segundo é o NOME. Para ler esses parâmetros informados via QueryString basta:


string id = Request.QueryString["id"].ToString();
string nome = Request.QueryString["nome"].ToString();

Alguns cuidados devem ser tomados, os navedores suportam 2083 caracteres. E fica fácil para qualquer usuário alterar os valores contidos na url. Este caso é muito usado por exemplo para o envio de url via e-mail que quando acessadas irã ser direcionadas já para um produto especifico.

domingo, 1 de maio de 2011

Capítulo 3: Handling Events and Managing State Lição 1: Understanding the ASP.NET Life Cycle and Handling Events

A primeira lição do capítulo 3 explica sobre o ciclo de vida da página e dos controles.

De início a lição começa explicando sobre os eventos mais comuns que são manipulados no arquivo Global.asax:
  • Application_Start: É executado quando a aplicação é iniciado no servidor, muito comum quando é feito o acesso do primeiro usuário.
  • Application_End: Quando a aplicação é finalizada. Pode ocorrer quando você para a aplicação pelo IIS ou quando é feito o servidor é reiniciado ou desligado.
  • Application_Error: Como o nome já explica é executado quando ocorre um erro na aplicação.
  • Application_LogRequest: É executado quando é feita uma requisição a aplicação, é usado para gravar informações especificas da requisição.
  • Application_PostLogRequest: É executado quando é concluida uma requisição feita ao sistema.
Como uma sessão que é criado por usuário é possível criar uma sessão que é utilizada por toda aplicação. Basta substituir o Session por Application, é como uma sessão, mas ao invés de ser enxergada por um único usuário é enxergada por todos os usuários da aplicação.

Em seguida na lição inicia a explicação do ciclo de vida da página, com certeza a maior dificuldade para programadores de aplicações windows que migram para o ambiente web, pois não estão acostumados com essa situação.

Os eventos mais comuns e em ordem de execução de uma página são os seguintes:
  • PreInit: É o primeiro evento que o desenvolvedor pode manipular de uma página, é muito utilizado para definir valores de Master Page ou Temas em tempo de execução. Caso não utilize Master Page é neste evento que você pode criar controles dinamicamente.
  • Init: Este evento é executado depois que todos controles foram instanciados, aqui você pode alterar os valores de iniciação dos controles. Caso utilize Master Page é neste evento que deve adicionar os controles dinamicamente.
  • InitComplete: Executado quando todas as inicializações estiverem completas.
  • PreLoad: Executado antes da viewstate ser carregada e antes de ocorrer o processo de Postback. Necessário quando você precisa que os controles estejam iniciados e antes da viewstate ser restabelecida.
  • Load: A página está estável e iniciada. O Evento Load da página é chamada primeiramente, em seguida todos os eventos Load dos controles são executados hierarquicamente.
  • LoadComplete: Neste evento todos os controles são carregados.
  • PreRender: Este evento ainda permite que alterações finais aos controles. Ocorre depois dos eventos de postback ter ocorridos, e ainda a viewstate não foi salva, ainda permitindo alterações.
  • SaveStateComplete: Neste evento a viewstate esta pronta. Qualquer alteração feita neste momento ou depois serão ignoradas. Este evento é util quando você precisa justamente que a viewstate esteja pronta.
  • Render: O Render é um método e não um evento, o asp.net chama este método para cada controle. Este método gera os códigos html e todos os outros necessários para exibição da página ao cliente.
  • Unload: Este evento é utilizado para liberação de recursos, até pode ser executado manualmente mas é um processo pouco comum.
Após explicar os principais eventos do ciclo de vida da página. A lição explica como criar um controle em tempo de execução. Código simples, única resalva é utilizar o evento Page_PreInit (quando não usar Master Page) ou Page_Init (quando usar Master Page):

protected void Page_PreInit(object sender, EventArgs e)
{

    // Create instances of the controls
    Label FeedbackLabel = new Label();
    TextBox InputTextBox = new TextBox();
    Button SubmitButton = new Button();
    // Assign the control properties
    FeedbackLabel.ID = "FeedbackLabel";
    FeedbackLabel.Text = "Please type your name: ";
    SubmitButton.ID = "SubmitButton";
    SubmitButton.Text = "Submit";
    InputTextBox.ID = "InputTextBox";
    // Create event handlers
    SubmitButton.Click += new System.EventHandler(SubmitButton_Click);
    // Add the controls to a Panel
    Panel1.Controls.Add(FeedbackLabel);
    Panel1.Controls.Add(InputTextBox);
    Panel1.Controls.Add(SubmitButton);
}


protected void SubmitButton_Click(object sender, EventArgs e)
{
    // Create an instance of Button for the existing control
    Button SubmitButton = (Button)sender;
    // Update the text on the Button
    SubmitButton.Text = "Submit again!";
    // Create the Label and TextBox controls
    Label FeedbackLabel = (Label)FindControl("FeedbackLabel");
    TextBox InputTextBox = (TextBox)FindControl("InputTextBox");
    // Update the controls
    FeedbackLabel.Text = string.Format("Hi, {0}", InputTextBox.Text);
}


A lição explica como criar os eventos da página, no caso do vb você deve utilizar os dois ComboBox que estão na parte superior no arquivo de código. E no caso do c#, basta escrever o código, pois a propriedade AutoEventWireup por padrão é true, não necessitando mais nenhuma associação.

Outro processo comum utilizado pelos desenvolvedores e explicados é o PostBack automático. Alguns controles como o botão executam o postback automaticamente quando seu evento é acionado. Mas no caso do evento TextChanged do TextBox por exemplo ele não executa o PostBack automaticamente, é necessário alterar a propriedade AutoPostBack para true, caso não faça isso, o evento TextChanged só será executado quando outro controle executar o PostBack no formulário como por exemplo um clique do botão.

Neste caso como ocorre: O usuário alterou o texto do textBox, nada acontece pois a propriedade esta como false, em seguida o usuário clica no botão. O primeiro evento a ser executado é o TextChanged que estava aguardando um postback ocorrer, em seguida é executado o evento clique do botão.

Se quiser que o TextChanged seja executado assim que o texto seja alterado altere a propriedade AutoPostBack para true.

Assim finaliza esta lição.

Abraços...

terça-feira, 12 de abril de 2011

Capítulo 2: Using Master Pages, Themes, and Caching!!! Lição 3: Caching

Enfim a última lição do 2º Capítulo, Caching!!

Eu ja tive a oportunidade de trabalhar em projetos que usaram ambos tipos de cache explicados nesta lição. Confesso que achei mais fácil a prática do que a teoria, por isso devo escrever pouco sobre este assunto.

O asp.net facilita o uso de Cache, sendo necessário poucas linhas de código para implentar. Existem dois tipos de cache no asp.net:
  • Application caching: representa uma coleção de dados armazenados em memória e que são removidos conforme configurados por tempo ou alguma dependência, ou em ultimo caso quando atingir o limite da memória.
  • Page output caching: acredito ser o mais simples e por isso o mais usado, o asp.net permite salvar uma página, ou até mesmo uma parte de uma página como um controle, para reduzir o tempo de resposta quando esta página for solicitada.
Quando se usa o Application caching o cache é dividido por todos na aplicação, pode ser armazenado qualquer coisa, desde uma string, ou até mesmo uma classe populada, datatable e etc, cabe aqui um parênteses, tome cuidado com o tamanho do objeto que colocam em cache devido a memória.

A codificação para trabalhar com o objeto cache é igual a trabalhar com uma sessão, a forma mais simples basta informar a chave e o valor. Ex:

Cache["Greeting"] = "Hello, cache!";
if (Cache["Greeting"] != null)
  Label1.Text = (string)Cache["Greeting"];
else
  Label1.Text = "Hello, world!";


Existe também o método insert que possui mais parâmetros para você configurar seu objeto cache. O método Insert possui os seguintes parâmetros:
  • dependencies: é possível configurar uma dependência para manter seu objeto cache. Funciona como uma trigger.
  • absoluteExpiration: É um DateTime que define o momento exato que o cache é expirado. Caso não queria definir esta data basta informar: System.Web.Caching.Cache.NoAbsoluteExpiration
  • slidingExpiration: é um objeto TimeSpan, onde você informa depois do último acesso quanto tempo irá demorar para seu cache expirar. O contador é zerado toda vez que o cache é acessado. Se não quiser informar, basta: System.Web.Caching.Cache.NoSlidingExpiration
  • priority: é o nível de prioridade do cache quando houver a necessidade de remoção de conteúdo, como em um possível estouro de memória, o priority é um enumeration e possui as seguintes opções: Low, BelowNormal, Normal (valor padrão), AboveNormal, High e NotRemovable.
Além dessas opções o objeto cache possui também o evento onRemoveCallback que é disparado quando o objeto é removido do cache.

Page output caching 

Para adicionar uma página ao cache para diminuir a carga ao servidor  melhorar o desempenho do site perando o usuário, é possível colocar suas páginas no cache. Para isso basta adicionar a diretiva @OutputCache em sua página. Caso tenha interesse em armazenar somente uma parte da página, você deve separar esta parte em um Web User Controle e desta forma armazenar este controle no cache.

A diretiva OutputCache possui os seguintes parâmetros:
  • Duration: É o número de segundos do cache. É o único parâmetro obrigatório;
  • Location
  • CacheProfile
  • NoStore
  • Shared
  • VaryByParam
  • VaryByControl
  • SqlDependency
  • VaryByCustom
  • VaryByHeader
Por enquanto é isso!!

Abraços...

terça-feira, 5 de abril de 2011

Capítulo 2: Using Master Pages, Themes, and Caching!!! Lição 2: Using Themes

 Esta lição do capítulo fala especificamente como aplicar temas em suas aplicações web. Fala da possibilidade do uso de CSS também, mas não aprofunda no assunto.

Como já vistos em lições anterires o uso de Temas são para facilitar a manutenção do visual da aplicação, podendo alterar em um único local, e principalmente tornar dinâmico o visual de sua aplicação.

Para começar a criar seu Tema, é bem simples, clique com o botão direito no Solution Explorer, clique em Add Asp.Net Folder, em seguinda clique em Theme. Dentro desta pasta Theme você irá criar seus temas personalizados, cada um dentro da respectiva pasta. Exemplo, dentro da pasta Theme crie a pasta Azul e outra chamada Vermelho.

A seguir basta adicionar dentro de cada pasta, arquivos skins, css e imagens. O ideal é criar um tema por completo e depois sair copiando e colando nos demais temas, só editando o que for especifico de cada tema.

Para aplicar o tema a sua página web ou para toda aplicação, existem dois atributos que podem ser usados, Theme e StyleSheetTheme. Você pode definir essas propriedades diretamente no web.config ou nas páginas que achar necessário:

<pages Theme=”themeName”> ou <pages StyleSheetTheme=”themeName”>

Qual a diferença entre ambos?

Quando se o StyleSheetTheme, essas configurações são aplicadas aos controles antes de aplicar possíveis configurações definidas dirementa no controle, ou seja, por ordem de hierarquia irá prevalecer configurações que estiverem diretamente no controle, caso não tenha nenhuma é aplicado as configuraçoes do Tema.
Como é de se imaginar o uso do atributo Theme é o contrário ele sempre irá prevalecer, substituindo qualquer propriedade definida diremante no controle.

Para criar um Arquivo Skin você deve na pasta do seu tema clicar com o botão direito, então, Add New Item. Em seguinda, selecione Skin File e basta definir o nome do seu skin. Existem dois tipos de skin. Default skins são aplicados a todos os controles daquele tipo, ou seja, se você criar um skin para botões, em todos os botões serão aplicadas as configurações. E Named skins que na verdade é o skin mas com um ID, e para um botão receber essas configurações deve obrigatoriamente informar esta ID, caso contrário não receberá as configurações.

Exemplo de Default skins:

<asp:Button runat="server" BackColor="Red" ForeColor="White" Font-Name="Arial" Font-Size="9px" />

Exemplo de Named skins:


<asp:Label runat="server" SkinId="Title" Font-Size="18px" />


Além de arquivos skin, no seu Tema é possível ainda adicionar imagens e arquivos de folhas de estilos, o famoso CSS. Tudo bem simples e sem segredo.

Como ja explicado para adicionar um Tema basta adicionar os atributos Theme ou StyleSheetTheme no web.config ou em sua página.

É possível também definir uma página ou controle que você não quer que seja aplicado o Tema, basta alterar a propriedade EnableTheming para false: EnableTheming="false".

Essa propriedade pode ser aplicada para toda a página ou para controles especificos.

Para aplicar um tema dinamicamente, ou seja, em tempo de execução, você deve fazer isso no evento Page_PreInit e definir a propriedade Page.Theme.

Protected void Page_PreInit(object sender, EventArgs e)
{
  switch (Session["theme"])
  {
    case "Blue":
      Page.Theme = "BlueTheme";
      break;
    case "Pink":
      Page.Theme = "PinkTheme";
      break;
    default:
      Page.Theme = "GreenTheme";
      break;
  }
}

E assim finaliza mais uma lição.

Abraços...