Skip Navigation Links
Novas Tecnologias
Ferramentas Adicionais
Ferramentas Adicionais
Referências Entre Páginas com Nested Master Pages e Controles
Data:2/2/2009

Translate this page now :





Categories: ASP.NET

Gostou do texto ? Vote e dê sua opinião! Pontuação atual :
Adicione aos Favoritos!
BlogBlogs Rec6 Linkk Ueba Technorati Delicious DiggIt! StumbleUpon

Veja Também


Fazer com que uma página acesse sua master page é algo relativamente simples :

   1:  
   2: me.master

C# :

   1: this.master

Só que a partir do me.master acabamos precisando realizar um findcontrol para encontrar algum objeto na master page, o que quebra o conceito de encapsulamento da orientação a objetos : O ideal seria acessar uma propriedade existente na master page :

   1:  
   2: Partial Class modelo
   3:     Inherits System.Web.UI.MasterPage
   4:  
   5:     Dim vTexto As String
   6:  
   7:     Public Property Texto() As String
   8:         Get
   9:             Return (vTexto)
  10:         End Get
  11:         Set(ByVal value As String)
  12:             vTexto = value
  13:         End Set
  14:     End Property
  15:  
  16:  
  17: End Class

Em C# :

   1: public partial class modelo : System.Web.UI.MasterPage
   2: {
   3:     public string Texto { get; set; }
   4: }

 

Para acessar essa propriedade somos obrigados a fazer um cast da propriedade "master" para o tipo "modelo", veja :

   1: Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
   2:     DirectCast(Me.Master, modelo).texto = "testando"
   3: End Sub

C# :

   1: protected void Page_Load(object sender, EventArgs e)
   2: {
   3:     ((modelo)this.Master).Texto = "testando";
   4: }

 

Para evitarmos a necessidade do Cast, podemos utilizar a tag @MasterType no arquivo .aspx. Com isso a propriedade "master" já será do tipo que desejamos, veja :

   1: <%@ Page Title="" Language="C#" MasterPageFile="~/modelo.master" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %>
   2: <%@ MasterType VirtualPath="~/modelo.master" %>

SNAG-0408 Porém, se estivermos utilizando nested master pages a coisa complica um pouco mais. Digamos que a propriedade que desejamos acessar esteja 2 níveis acima, sendo necessário o seguinte código :

   1:  
   2: me.master.master.testando="asl;fdldasfsfadld"

Em C# :

   1:  
   2: this.master.master.testando="aslfslkdafsd";

 

Para que a propriedade "testando" seja reconhecida, a propriedade master de nossa master page deverá também estar tipada, o que nos leva a colocar o @mastertype não só em nossa página, mas também na master page, se tornando uma prática colocar o @mastertype em todos os níveis das nested master pages (até que ponto é recomendável, isso é discutível).

Porém, mesmo depois de usar o @mastertype continuaremos tendo problemas. Isso porque a compilação de um site no asp.net é toda dividida em diferentes assemblies e não há uma ligação direta entre nossa página e a master page principal, 2 níveis acima da página.

SNAG-0406 Resultado : Quando tentamos acessar o 2o master (me.master.master/this.master.master) teremos um erro informando que falta em nosso projeto uma referência para um assembly de nome esquisito - um assembly gerado pela compilação automatica do asp.net e ao qual não temos como fazer referência.

Como Resolver ?

Utilizando a pouco conhecida tag @Reference podemos criar uma referência entre a página e a master page de 1o nível, tornando possível utilizarmos a propriedade "testando" de forma tipada, como nos exemplos acima :

   1: <%@ Page Title="" Language="VB" MasterPageFile="~/Modelo2.master" AutoEventWireup="false" CodeFile="Default4.aspx.vb" Inherits="Default4" %>
   2: <%@ MasterType VirtualPath="~/Modelo2.master" %>
   3: <%@ Reference VirtualPath="~/modelo.master"  %>

Observe como a master page da página é a Modelo2 mas o @Reference aponta para a modelo, permitindo que tanto a modelo2 seja utilizada de forma tipada (temos o @mastertype) como a modelo seja utilizada de forma tipada

Indo além

SNAG-0407 No exemplo acima a propriedade é do tipo string. Se a propriedade devolvesse um user control, teriamos problemas também para reconhecer o tipo do user control, de fato o mesmo problema e a mesma solução : A tag @Reference também pode ser utilizada para fazer referência a um user control

   1: <%@ Page Title="" Language="VB" MasterPageFile="~/Modelo2.master" AutoEventWireup="false" CodeFile="Default4.aspx.vb" Inherits="Default4" %>
   2: <%@ MasterType VirtualPath="~/Modelo2.master" %>
   3: <%@ Reference VirtualPath="~/modelo.master"  %>
   4: <%@ Reference Control="~/teste.ascx" %>

 

Com a combinação de @Reference e @MasterType podemos navegar livremente, de forma tipada, através das nested master pages

 



Categories: ASP.NET


Nome :
E-mail:
Comentarios :
 
 
Os Últimos Comentários
data: 5/31/2011 11:12:00 PM
nome: Fernando Bueno
email: fernandobueno.net@gmail.com
comentário:
Parabéns pelo artigo, pessoal. Foi muito útil!!
[]s


 1  
Dicas
Dica do Dia
Receba Dicas Por Email
E-mail :  
 


 (help)
Aceito receber informativos do devASPNet, informações de eventos e treinamentos

Veja Quais Informativos Você Receberá

Pesquisar Dicas
Pesquisar Artigos, Dicas e Noticias

Banco de Dados
Algumas Entrevistas
Links Importantes

Búfalo Informática, Treinamento e Consultoria
R. Alvaro Alvim, 37/920 Centro - Cinelândia - Rio de Janeiro Cep: 20031-010
Tel : (21) 2262-1368 (21) 9240-5134 E-mail : Contato@bufaloinfo.com.br