The Controls Collection Cannot be Modified Because the Control Contains Code Blocks

Texto extraído do pélessê.

Usando MasterPages no AspNet voce pode cair nesse problema ao usar CodeBlocks no Header. Vejamos o seguinte cenário:

<head runat=”server” >
<title>webCash</title>
<link rel=”stylesheet” type=”text/css” href=”/App_Themes/Default/Master.css” />
<link rel=”shortcut icon” href=”/favicon.ico”/>
</head>

Ficamos limitados quanto ao local onde se encontrará o favicon dependendo de como a aplicação fora hospedada. O que queremos é que o ícone seja lido da raiz da aplicação indiferente de como foi feita a hospedagem. Normalmente resolveríamos isso com Code Blocks, como abaixo:

<head runat=”server” >
<title>webCash</title>
<link rel=”stylesheet” type=”text/css” href=”/App_Themes/Default/Master.css” />
<link rel=”shortcut icon” href=”<%= ResolveUrl(“~/favicon.ico”)%> “/>
</head>

Porém essa sintaxe causa o erro citado no título desse post. O que podemos fazer ? Utilizar DataBind no lugar dos Code Blocks. No Head, a sintaxe é quase igual, mudando apenas o sinal = para #, como abaixo:

<head runat=”server” >
<title>webCash</title>
<link rel=”stylesheet” type=”text/css” href=”/App_Themes/Default/Master.css” />
<link rel=”shortcut icon” href=”<%# ResolveUrl(“~/favicon.ico”)%> “/>
</head>

E, no Page_Load do MasterPage, dispararemos o devido bind:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
If Not Me.IsPostBack Then
Page.Header.DataBind()
End If
End Sub

Em linhas gerais, é isso.
Agarceço ao seguinte post por essa ideia:

Deixe um comentário