quinta-feira, 31 de março de 2011

Capítulo 2: Using Master Pages, Themes, and Caching!!! 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.

Abraços!!

    5 comentários:

    1. Que legal você estar postando sobre o caminho que você está seguindo para a certicação! Como está indo até o momento, pretende fazer quando a prova?
      []'s

      ResponderExcluir
    2. E ae Willian, ainda não tenho data marcada da prova, estou lendo aos poucos conforme vai sobrendo um tempo!!

      ResponderExcluir
    3. muito interessante...
      eu tenho um problema em relação a isso, alem de criar as duas master´s eu preciso criar uns webform's que herda a segunda master... agradecia muito se me pudesse ajudar

      ResponderExcluir
    4. Elson tranquilo?

      Não existe problema no que deseja fazer. Uma Master Page pode herdar outra sem problemas como se fosse um formulário comum.

      Se estiver usando o Visual Studio 2010 ele até da essa opção de quando criar uma Master Page informar qual a Master Page "mãe" dela.

      Abraços...

      ResponderExcluir
    5. Muito obrigado pelas informações, foram muito úteis para eu entender bem o conceito e utilização do Master Page no ASPX.

      ResponderExcluir