Olá! Friday, 26 de May de 2017.



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

  1. <%@ Master Language="C#" AutoEventWireup="true" CodeFile="Principal.master.cs" Inherits="_MasterPage_Principal" %>
  2.  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  4. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  5. <html xmlns="http://www.w3.org/1999/xhtml" lang="pt-br" xml:lang="pt-br">
  6. <head runat="server">
  7. <title>Minha página</title>
  8.  
  9. <style type="text/css" media="screen">
  10. @import "<%= URL_SITE %>/Css/principal.css";
  11. </style>
  12. </head>
  13. <body>
  14.  
  15. <form id="form1" runat="server">
  16.  
  17. <asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
  18. </asp:contentplaceholder>
  19.  
  20. </form>
  21.  
  22. </body>
  23. </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

  1. using System;
  2. using System.Data;
  3. using System.Configuration;
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. using System.Web;
  7. using System.Web.Security;
  8. using System.Web.UI;
  9. using System.Web.UI.WebControls;
  10. using System.Web.UI.WebControls.WebParts;
  11. using System.Web.UI.HtmlControls;
  12.  
  13. public partial class _MasterPage_Principal : System.Web.UI.MasterPage
  14. {
  15.     protected string URL_SITE = "http://www.codigofonte.net/";
  16.     protected void Page_Load(object sender, EventArgs e)
  17.     {
  18.         this.Page.Title = "Meu título da página modificado";
  19.     }
  20. }


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

  1. 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.

  1. protected override void OnLoad(EventArgs e)
  2.     {
  3.         base.OnLoad(e);
  4.  
  5.         Page.Header.DataBind();
  6.     }


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