Olá! Quarta Feira, 08 de Fevereiro de 2012.



Dicas CódigoFonte.net
Quarta Feira, 02 de Janeiro 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" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="pt-br" xml:lang="pt-br">
<head runat="server">
<title>Minha página</title>

<style type="text/css" media="screen">
@import "<%= URL_SITE %>/Css/principal.css";
</style>
</head>
<body>

<form id="form1" runat="server">

<asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
</asp:contentplaceholder>

</form>

</body>
</html>


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 » CodigoFonte.eti.br » Compre De Tudo » Meu Mural » Competiva - Criação de Sites » Todos os Direitos Reservados © 2002/2010

Procurando Notebooks, Câmeras Digitais, iPhones?

CompreDeTudo.com