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.