Olá! Friday, 13 de September de 2024.



Dicas CódigoFonte.net
Wednesday, 02 de January de 2008

Code Blocks dentro de MasterPages causam problemas

Olá a todos!

Vejamos a seguinte situação:

Você possui umas MasterPage no ASP.NET e quer utilizar alguma variável do lado servidor para, por exemplo, preencher a URL completa do arquivo CSS ou executar alguma função específica no cabeçalho.

Mas, você também configurou seu cabeçalho para ser runat=server, pois precisa também manipular o Title da página.

Basicamente o código da MasterPage ficaria assim:

Principal.master

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="Principal.master.cs" Inherits="_MasterPage_Principal" %> Minha página


Veja que a minha tag head está definida como runat=server e dentro dela estou usando um code blocks, que é o <%= URL_SITE %>

E o nosso code-behind:

Principal.master.cs

using System; using System.Data; using System.Configuration; using System.Collections; using System.Collections.Generic; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class _MasterPage_Principal : System.Web.UI.MasterPage { protected string URL_SITE = "http://www.codigofonte.net/"; protected void Page_Load(object sender, EventArgs e) { this.Page.Title = "Meu título da página modificado"; } }

Porém, se executarmos esta página, o .net irá exibir o seguinte erro:

The Controls collection cannot be modified because the control contains code blocks (i.e. <% … %>).

O que ocorre?

Pesquisando na internet descobri que o HtmlHead não permite o uso de code blocks, que são os trechos de código usado na página ASP.NET, mas em alguns momentos precisamos usar, para, por exemplo, definir folhas de estilo, javascripts ou o título da página.

Resolvendo o problema

Para resolvermos este problema devemos alterar nosso code blocks para que ao invés de usar o trecho <%= URL_SITE %>, devemos usar <%# URL_SITE %>

Veja a diferença que a partir de agora usamos o #

Feito isto, devemos implementar um método de sobrescrita do evento OnLoad para que os comandos que foram implementados no head sejam executados.

protected override void OnLoad(EventArgs e) { base.OnLoad(e); Page.Header.DataBind(); }

Note que o trecho Page.Header.DataBind(); é de grande importância pois é ele que será responsável por processar os nossos code blocks.

Agora teste sua página.

Pronto. :D

Espero que tenham gostado da dica. :P

Até a próxima.

Comentários do artigo [Novo comentário]

Nenhum comentário, seja o primeiro a comentar.
Para adicionar um comentário você deve efetuar o login


Gostou do CódigoFonte.net? Quer indicar a um amigo?
Preencha os campos a seguir.
Seu Nome:
Seu E-mail:
E-mail de seu Amigo:


CodigoFonte.net » Meu Mural » Competiva - Criação de Sites » Todos os Direitos Reservados © 2002/2010