Lição 1: Using Master Pages

O capítulo 2 começa a falar dos recursos interessantes do .net.

A primeira lição explica sobre o uso de Master Pages, que a primeiro momento é bem simples, mas a parte explicando sobre as propriedades é interessante e com certeza usuários com pouca experiência não devem saber como usar este recurso. Vamos la!!

De inicio para que serve a Master Page? Pra quem ja programo em plataforma windows ou pelo menos ouviu algo, sabe que é possível ter um formulário base, e que todos outros criados herdam este formulário. Normalmente este formulário base possui o menu, uma toolbar e etc. A Master Page segue a mesma idéia para projetos web. Cria-se um layout padrão, onde o mais comum é ter o menu, a logo da empresa e um rodapé, e todas as páginas que usarem esta Master Page, terão este mesmo layout.

A principal idéia é:
  • centralizar funcionalidades comuns;
  • quando necessário alterar algo, será necessário alterar em um único local;
  • desenvolver controles que serão aplicados facilmente em todas as páginas, como um menu;
  • e ainda sim, permitir que as páginas que "herdam" esta Master Page possam customizar conforme necessário.
Os arquivos de Master Page são arquivos parecidos com WebForm, mas possuem a extensão .master e uma diretiva na primeira linha do documento <%@ Master no local da diretiva <%@ Page!!

Como fica o resultado para o usuário? O usuário irá acessar a url do formulário normalmente, e quando esta página for renderizada para o usuário será lida a diretiva MasterPageFile que especifica qual a Master Page que a página esta usando, então o conteúdo que estiver na página dentro do controle Content será renderizado junto com a Master Page como uma única página simples para o usuário.

Toda Master Page deve ter o controle ContentPlaceHolder é no "espaço" deste controle no código html que o código das página serão "injetados". Exemplo: irei colocar um ContentPlaceHolder dentro do head e do Body da minha Master Page:

<head runat="server">
<title>Site do quintelab</title>
<asp:ContentPlaceHolder ID="HeadContent" runat="server">
</asp:ContentPlaceHolder>
</head>

<body>
<form runat="server">
<div class="title">
<h1>
Quintelab
</h1>
</div>

<div class="principal">
<asp:ContentPlaceHolder ID="MainContent" runat="server"/>
</div>
<div class="footer">
</div>
</form>
</body>

Repare os dois objetos ContentPlaceHolderé no local deles que o código das demais páginas serão renderizados. Exemplo de uma página que fez referência a esta Master Page:

<%@ Page Language="c#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Teste.aspx.cs" Inherits="Teste" %>
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
Aqui meu conteúdo especifico
</asp:Content>

Tudo que estiver dentro dos Content serão renderizados no local dos ContentPlaceHolder.

Vamos aos recursos!! É possível definir no web.config da aplicação ou de uma pasta qual é a Master Page principal, basta:

<pages masterPageFile="MinhaMasterPage.Master" />

Claro será necessário criar nas paginas os controles Contents correspondentes a Master.Page, caso contrário nada irá acontecer.

A parte mais interessante desta lição é como utilizar e customizar Propriedades, Métodos e Controles da Master Page pelas páginas. Um exemplo, um título, você pode colocar uma label em sua Master Page e acessar seu conteúdo através das páginas.

Para isso é necessário ter uma propriedade pública na Master Page, adicionar a declaração @ MasterType nas páginas aspx, e para acessar o valor da propriedade a sintaxe é Master.<NomePropriedade>.

Não tem muito segredo, exemplo:

1º Criando a propriedade pública na Master Page:

public String SharedInfo
{
    get { return (String)Session["SharedInfo"]; }
    set { Session["SharedInfo"] = value; }
}

2º Na página aspx:

<%@ Page Language="c#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="Login" %>
<%@ MasterType VirtualPath="~/Site.master" %>

3º Acessar o valor da propriedade:

infoLabel.Text = Master.SharedInfo;


Outro recurso interessante, e com certeza irá usar, é o que a lição chama de Nested Master Pages. Que são Master Pages herdadas de outra Master Page. Por exemplo, você pode criar a Master Page Principal.Master onde nela possui a logo da empresa e um rodape. E criar mais duas Master Pages, uma chamada Consulta.Master que herda a Principal e tem particularidades de uma tela de consulta e a Cadastro.Master que também herda da Principal mas possui particularidades de uma tela de cadastro.

Por último e não menos importante, como trocar a Master Page dinamicamente. Mesmo que esta opção exista, você deve na sua página aspx definir na declaração qual é a Master Page que a página utiliza, e claro ambas as Master Page devem ter os mesmos ContentPlaceHolder e as mesmas propriedades. 


Para fazer a troca dinamicamente, é necessário utilizar o evento Page_PreInit e definir a propriedade MasterPageFile. Exemplo:

void Page_PreInit(Object sender, EventArgs e)
{
    MasterPageFile = "~/MinhaMasterDinamica.master";
}

E desta forma se encerra a 1º Lição do Capítulo 2. Muito útil com certeza.

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;
  }
}

Lição 3: 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

Assim finaliza o segundo capítulo do livro da certificação.

Abraços...