<rss version="2.0" xmlns:a10="http://www.w3.org/2005/Atom"><channel><title>Dicas Técnicas BufaloInfo</title><link>http://www.bufaloinfo.com.br/</link><description>Dicas Técnicas Produzidas pela Búfalo Informática</description><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=1033</link><title>ASP.NET : Desabilitar seleção de fins de semana no calendário</title><description>&lt;br&gt;O webControl Calender, h&amp;#225; algumas vers&amp;#245;es do .NET, ganhou o evento DayRender que pode ser utilizado para controlar a renderiza&amp;#231;&amp;#227;o de cada dia do calendario, criando efeitos muito interessantes.&lt;br&gt;&lt;br&gt;Algo simples de se fazer com o dayRender &amp;#233; impedir que o usu&amp;#225;rio selecione fins de semana no calend&amp;#225;rio. Veja como fica o c&amp;#243;digo :&lt;br&gt;&lt;br&gt;    Protected Sub Calendar1_DayRender(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DayRenderEventArgs) Handles Calendar1.DayRender&lt;br&gt;        If e.Day.IsWeekend Then&lt;br&gt;            e.Day.IsSelectable = False&lt;br&gt;        End If&lt;br&gt;    End Sub&lt;br&gt;&lt;br&gt;Veja o mesmo c&amp;#243;digo em C# :&lt;br&gt;&lt;br&gt;    protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)&lt;br&gt;    {&lt;br&gt;        if (e.Day.IsWeekend)&lt;br&gt;        {&lt;br&gt;            e.Day.IsSelectable = false;&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;&lt;br&gt;No evento DayRender voc&amp;#234; tamb&amp;#233;m tem acesso a c&amp;#233;lula da tabela que representa o dia, podendo fazer v&amp;#225;rios outros truques, como incluir anota&amp;#231;&amp;#245;es nos dias do calend&amp;#225;rio.&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=1032</link><title>ASP.NET : Compartilhando a chave de criptografia de arquivos .CONFIG</title><description>&lt;br&gt;No artigo em http://www.bufaloinfo.com.br/artigos/coluna31.asp expliquei como criptografar chaves de uma arquivo .config. O problema &amp;#233; se as chaves criptografadas do .Config precisarem ser utilizadas em m&amp;#250;ltiplas m&amp;#225;quinas, vamos resolver isso : &lt;br&gt;&lt;br&gt;Primeiramente, precisamos criar um container com um par de chaves : &lt;br&gt;&lt;br&gt;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pc &amp;quot;YourCustomKey&amp;quot; -exp &lt;br&gt;&lt;br&gt;Observe o -exp, que torna as chaves privadas export&amp;#225;veis&lt;br&gt;&lt;br&gt;Em seguida precisamos indicar o container que ser&amp;#225; utilizado em nosso artigo .config : &lt;br&gt;&lt;br&gt;  &amp;lt;configProtectedData&amp;gt;&lt;br&gt;&lt;br&gt;    &amp;lt;providers&amp;gt;&lt;br&gt;&lt;br&gt;      &amp;lt;add keyContainerName=&amp;quot;YourCustomKey&amp;quot; useMachineContainer=&amp;quot;true&amp;quot; description=&amp;quot;Uses RsaCryptoServiceProvider to encrypt and decrypt&amp;quot; name=&amp;quot;YourCustomKey&amp;quot; type=&amp;quot;System.Configuration.RsaProtectedConfigurationProvider,System._&lt;br&gt;&lt;br&gt;_Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&amp;quot; /&amp;gt;&lt;br&gt;&lt;br&gt;    &amp;lt;/providers&amp;gt;&lt;br&gt;&lt;br&gt;  &amp;lt;/configProtectedData&amp;gt;&lt;br&gt;&lt;br&gt;Criptografar o arquivo. Observe a chave -prov :&lt;br&gt;&lt;br&gt;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pef connectionStrings c:\inetpub\wwwroot -prov YourCustomKey&lt;br&gt;&lt;br&gt;Exportar a chave - incluindo a privada - para poder ser utilizada em outras m&amp;#225;quinas :&lt;br&gt;&lt;br&gt;aspnet_regiis -px &amp;quot;YourCustomKey&amp;quot; &amp;quot;C:\temp\CustomKeys.xml&amp;quot; -pri &lt;br&gt;&lt;br&gt;Importar as chaves em outra m&amp;#225;quina : &lt;br&gt;&lt;br&gt;C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0&amp;gt;aspnet_regiis.exe -pi &lt;br&gt;&amp;quot;YourCustomKey&amp;quot; &amp;quot;c:\temp\CustomKeys.xml&amp;quot; -exp &lt;br&gt;&lt;br&gt;O restante segue conforme o artigo que apresentei no inicio&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=1031</link><title>ASP.NET : Dynamic Data e campos auto-numeração com Entity Framework</title><description>&lt;br&gt;O Dynamic Data &amp;#233; um poderoso recurso do ASP.NET que se tornou vers&amp;#227;o final junto com o SP 1 do framework .NET.&lt;br&gt;&lt;br&gt;Podemos utilizar o Dynamic Data com LinqToSQL ou com Entity Framework. O Dynamic Data identifica diversas caracter&amp;#237;sticas do modelo de entidades para poder gerar automaticamente as p&amp;#225;ginas de cadastro. &lt;br&gt;&lt;br&gt;Uma caracter&amp;#237;stica, por&amp;#233;m, &amp;#233; mais complexa : campos auto-numera&amp;#231;&amp;#227;o. Os campos auto-numera&amp;#231;&amp;#227;o n&amp;#227;o podem ser abertos para edi&amp;#231;&amp;#227;o/inser&amp;#231;&amp;#227;o.&lt;br&gt;&lt;br&gt;Com o LinqToSQL tudo funciona bem, pois os metadados do linqToSQL identificam o campo auto-numera&amp;#231;&amp;#227;o. Por&amp;#233;m com o Entity Framework n&amp;#227;o &amp;#233; t&amp;#227;o simples.&lt;br&gt;&lt;br&gt;Uma solu&amp;#231;&amp;#227;o &amp;#233; utilizar o atributo scaffoldcolumn para marcar um atributo que n&amp;#227;o desejamos que seja gerado pelo dynamic data. Aplicar um atributo em elementos do Entity Framework n&amp;#227;o &amp;#233; t&amp;#227;o simples, mas poss&amp;#237;vel. Para isso utiliza-se o atributo metadatatype que explicamos anteriormente em http://www.bufaloinfo.com.br/dicas.aspx?cod=1027&lt;br&gt;&lt;br&gt;Veja como fica :&lt;br&gt;&lt;br&gt;1: Namespace BancoVideosModel   &lt;br&gt;2:     &lt;br&gt;3:     &amp;lt;MetadataType(GetType(Formato_MD))&amp;gt; _   &lt;br&gt;4:     Class Formato   &lt;br&gt;5:     &lt;br&gt;6:     End Class   &lt;br&gt;7:     &lt;br&gt;8:     Class Formato_MD   &lt;br&gt;9:         &amp;lt;ScaffoldColumn(False)&amp;gt; _  &lt;br&gt;10:         Public Property idFormato() As Integer  &lt;br&gt;11:             Get  &lt;br&gt;12:    &lt;br&gt;13:             End Get  &lt;br&gt;14:             Set(ByVal value As Integer)  &lt;br&gt;15:    &lt;br&gt;16:             End Set  &lt;br&gt;17:         End Property  &lt;br&gt;18:     End Class  &lt;br&gt;19: End Namespace&lt;br&gt;&lt;br&gt;O atributo ScaffoldColumn, no exemplo acima, faz com que o atributo idFormato n&amp;#227;o seja lido pelo Dynamic Data.&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=1029</link><title>ASP.NET : Validação com Entity Framework e Dynamic Data</title><description>&lt;br&gt;Mais uma quest&amp;#227;o importante quando trabalhamos com uma gera&amp;#231;&amp;#227;o din&amp;#226;mica da interface s&amp;#227;o as valida&amp;#231;&amp;#245;es.&lt;br&gt;&lt;br&gt;Se a interface e os campos ser&amp;#227;o gerados automaticamente, como gerar a valida&amp;#231;&amp;#227;o ?&lt;br&gt;&lt;br&gt; Um erro seria levar estas valida&amp;#231;&amp;#245;es para camadas de neg&amp;#243;cio ou camadas de dados. Valida&amp;#231;&amp;#245;es simples devem ser implementadas na interface, para evitar a comunica&amp;#231;&amp;#227;o entre camadas at&amp;#233; que uma simples valida&amp;#231;&amp;#227;o ocorra.&lt;br&gt;&lt;br&gt;O Entity Framework nos permite atribuir metadados para as classes para chegarmos aos objetivos que desejamos e isso inclui metadados de valida&amp;#231;&amp;#227;o. Os atributos para isso encontram-se no namespace System.ComponentModel.DataAnnotations : &lt;br&gt;&lt;br&gt;StringLengthAttribute : Define o tamanho de m&amp;#225;ximo de string aceito em um campo&lt;br&gt;&lt;br&gt;RequiredAttribute : Define se um campo &amp;#233; ou n&amp;#227;o requerido&lt;br&gt;&lt;br&gt;RangeAttribute : Define a regi&amp;#227;o de valores aceitos por um campo&lt;br&gt;&lt;br&gt;RegularExpressionAttribute : Define uma valida&amp;#231;&amp;#227;o baseada em express&amp;#245;es regulares para um campo&lt;br&gt;&lt;br&gt;Para aplicar estes atributos nos campos do Entity Framework precisaremos mais uma fez utilizar a t&amp;#233;cnica do MetaDataType que mostramos na dica em http://www.bufaloinfo.com.br/dicas.aspx?cod=1027&lt;br&gt;&lt;br&gt;  &lt;br&gt;&lt;br&gt; Namespace BancoVideosModel   &lt;br&gt;     &lt;br&gt;     &amp;lt;MetadataType(GetType(Videos_MD))&amp;gt; _   &lt;br&gt;     &amp;lt;DisplayName(&amp;quot;Filmes&amp;quot;)&amp;gt; _   &lt;br&gt;     Class Videos   &lt;br&gt;     &lt;br&gt;     End Class   &lt;br&gt;    &lt;br&gt;     Public Class Videos_MD  &lt;br&gt;    &lt;br&gt;    &lt;br&gt;         &amp;lt;DisplayName(&amp;quot;Ano de Produ&amp;#231;&amp;#227;o&amp;quot;)&amp;gt; _  &lt;br&gt;         &amp;lt;Range(1920, 2200, errormessage:=&amp;quot;Por favor,informe um ano v&amp;#225;lido&amp;quot;)&amp;gt;  &lt;br&gt;         Public Property Ano() As Integer  &lt;br&gt;             Get  &lt;br&gt;    &lt;br&gt;             End Get  &lt;br&gt;             Set(ByVal value As Integer)  &lt;br&gt;    &lt;br&gt;             End Set  &lt;br&gt;         End Property  &lt;br&gt;    &lt;br&gt;         &amp;lt;DisplayName(&amp;quot;Dura&amp;#231;&amp;#227;o do filme&amp;quot;)&amp;gt; _  &lt;br&gt;         &amp;lt;Range(50, 500, errormessage:=&amp;quot;Informe uma duran&amp;#231;&amp;#227;o v&amp;#225;lida&amp;quot;)&amp;gt; _  &lt;br&gt;         Public Property Duracao() As Integer  &lt;br&gt;             Get  &lt;br&gt;    &lt;br&gt;             End Get  &lt;br&gt;             Set(ByVal value As Integer)  &lt;br&gt;    &lt;br&gt;             End Set  &lt;br&gt;         End Property  &lt;br&gt;     End Class  &lt;br&gt; End Namespace&lt;br&gt;&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=1028</link><title>ASP.NET : Personalizando Nomes de Campo com Dynamic Data e Entity Framework</title><description>&lt;br&gt;Mesmo com o uso de um modelo de objetos, o nome interno que damos aos campos n&amp;#227;o &amp;#233; exatamente o nome que desejaremos que apare&amp;#231;a em uma tela de cadastro.&lt;br&gt;&lt;br&gt;Quando fazemos a montagem manualmente, alteramos tamb&amp;#233;m manualmente, sem problemas. Mas hoje temos recursos para fazer a montagem das p&amp;#225;ginas de forma automatizada - tal como o Dynamic Data - ent&amp;#227;o o dilema permanece : Como informar com que nome desejamos que os campos sejam realmente exibidos ?&lt;br&gt;&lt;br&gt;A solu&amp;#231;&amp;#227;o &amp;#233; utilizarmos o atributo displayName do namespace System.ComponentModel para indicarmos com que nome desejamos que o campo seja exibido.&lt;br&gt;&lt;br&gt;Da mesma forma que em outros casos, a t&amp;#233;cnica do MetaDataType, que explicamos na dica em http://www.bufaloinfo.com.br/dicas.aspx?cod=1027, precisa ser utilizada para aplicar este atributo.&lt;br&gt;&lt;br&gt;Veja como fica :&lt;br&gt;&lt;br&gt; Imports Microsoft.VisualBasic   &lt;br&gt; Imports System.ComponentModel.DataAnnotations   &lt;br&gt; Imports System.ComponentModel   &lt;br&gt;     &lt;br&gt; Namespace BancoVideosModel   &lt;br&gt;     &lt;br&gt;     &amp;lt;MetadataType(GetType(Formato_MD))&amp;gt; _   &lt;br&gt;     Class Formato   &lt;br&gt;    &lt;br&gt;     End Class  &lt;br&gt;    &lt;br&gt;     Class Formato_MD  &lt;br&gt;         &amp;lt;DisplayName(&amp;quot;Formato do Filme&amp;quot;)&amp;gt; _  &lt;br&gt;         Public Property Formato1() As String  &lt;br&gt;             Get  &lt;br&gt;    &lt;br&gt;             End Get  &lt;br&gt;             Set(ByVal value As String)  &lt;br&gt;    &lt;br&gt;             End Set  &lt;br&gt;         End Property  &lt;br&gt;     End Class  &lt;br&gt; End Namespace&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=1024</link><title>ASP.NET : Resolvendo o Problema do www e Aumentando o PageRank</title><description>&lt;br&gt;Para conseguir sucesso na web nossos sites precisam ser localizaveis atrav&amp;#233;s das ferramentas de busca. &lt;br&gt;&lt;br&gt;Para conseguirmos isso nosso site depende do c&amp;#225;lculo de pagerank que &amp;#233; realizado pelas ferramentas de busca. O pagerank &amp;#233; atribuido para nosso site e cada uma de suas p&amp;#225;ginas de acordo com os links que recebermos de outros sites.&lt;br&gt;&lt;br&gt;Por&amp;#233;m pequenos problemas de nomenclatura do site, chamados de problemas de canonicaliza&amp;#231;&amp;#227;o, podem fazer com que o pagerank do site seja dividido, reduzindo o ranking do seu site.&lt;br&gt;&lt;br&gt;O caso cl&amp;#225;ssico &amp;#233; do uso &amp;quot;www&amp;quot;. Nosso site frequentemente pode ser acessado com ou sem &amp;quot;www&amp;quot; : http://www.nossosite.com.br ou http://nossosite.com.br&lt;br&gt;&lt;br&gt;Pegando o caso do &amp;quot;www&amp;quot; como exemplo, podemos corrigir isso em aplica&amp;#231;&amp;#245;es ASP.NET utilizando o Global.Asax&lt;br&gt;&lt;br&gt;Para isso podemos programar o evento Application_BeginRequest e, se a URL contiver o &amp;quot;www&amp;quot;, podemos redirecionar para a URL sem &amp;quot;www&amp;quot;, por&amp;#233;m fazendo isso com o cuidado de avisar ao client (que pode ser uma ferramenta de busca) que ocorreu uma mudan&amp;#231;a permanente de endere&amp;#231;o.&lt;br&gt;&lt;br&gt;Feito isso, a ferramenta de busca saber&amp;#225; que refer&amp;#234;ncias ao nosso site com e sem o &amp;quot;www&amp;quot; significam a mesma coisa.&lt;br&gt;&lt;br&gt;Veja como fica o c&amp;#243;digo no global.asax :&lt;br&gt;&lt;br&gt;  protected void Application_BeginRequest(Object sender, EventArgs e)&lt;br&gt;&lt;br&gt;    {&lt;br&gt;     &lt;br&gt;        if (HttpContext.Current.Request.Url.ToString.ToLower().Contains(&amp;quot;http://www.mysite.com&amp;quot;))&lt;br&gt;&lt;br&gt;        {&lt;br&gt;            HttpContext.Current.Response.Status=&amp;quot;301 Moved Permanently&amp;quot;;&lt;br&gt;&lt;br&gt;            HttpContext.Current.Response.AddHeader(&amp;quot;Location&amp;quot;,Request.Url.ToString.ToLower().Replace(&amp;quot;http://www.mysite.com&amp;quot;,&amp;quot;http://mysite.com&amp;quot;));&lt;br&gt;&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;&lt;br&gt;Observe o uso do status 301 e do Header &amp;quot;Location&amp;quot; para indicar o endere&amp;#231;o correto do site&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=1017</link><title>ASP.NET : Configurando o page_error centralizado com Nested Master pages</title><description>&lt;br&gt;Em uma dica anterior (http://www.bufaloinfo.com.br/dicas.asp?cod=1009 ) mostrei como fazer um tratamento geral de erros para o site utilizando master pages. Por&amp;#233;m nada &amp;#233; t&amp;#227;o simples.&lt;br&gt;&lt;br&gt;Quando utilizamos nested master pages o problema se complica, pois a solu&amp;#231;&amp;#227;o que apresentei na dica anterior apenas far&amp;#225; com que a 2a master page tenha tamb&amp;#233;m o tratamento de erro da primeira, mas o page_Error da p&amp;#225;gina n&amp;#227;o estar&amp;#225; executando o tratamento de erro.&lt;br&gt;&lt;br&gt;A op&amp;#231;&amp;#227;o perfeita seria se na nested master page fosse poss&amp;#237;vel pegarmos o endere&amp;#231;o da rotina ligada ao seu page_Error e atribuirmos esse endere&amp;#231;o ao page_error da p&amp;#225;gina que usar&amp;#225; a nested master page. Por&amp;#233;m isso exigiria um volume de uso de reflection muito grande e como os provedores normalmente trabalham com medium trust, n&amp;#227;o funcionaria.&lt;br&gt;&lt;br&gt;A solu&amp;#231;&amp;#227;o para o problema &amp;#233; que a rotina que faz o tratamento do page_Error na master page seja definida como public e desta forma a nested master page poder&amp;#225; vincular esta rotina com o evento page_Error da p&amp;#225;gina que vir&amp;#225; a usar a nested master page -&amp;gt; a content page&lt;br&gt;&lt;br&gt;Realmente esta solu&amp;#231;&amp;#227;o cria um certo acoplamento entre as master pages, mas evita o reflection em excesso que exigiria full trust para o site. &lt;br&gt;&lt;br&gt;Na nested master page, o c&amp;#243;digo fica assim : &lt;br&gt;&lt;br&gt;    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load&lt;br&gt;        AddHandler Page.Error, AddressOf DirectCast(Me.Master, Bufalo).Page_Error&lt;br&gt;    End Sub&lt;br&gt;&lt;br&gt;Observe a necessidade do directCast em Me.Master para que a rotina Page_Error fique acess&amp;#237;vel.&lt;br&gt;&lt;br&gt;Ent&amp;#227;o temos :&lt;br&gt;&lt;br&gt;A master page principal define o page_error como p&amp;#250;blico&lt;br&gt;&lt;br&gt;No load da master page principal o page_Error &amp;#233; atribuido ao page_error de quem usar esta master page&lt;br&gt;&lt;br&gt;A nested master page utiliza a master page principal (e consequentemente ganha o page_error)&lt;br&gt;&lt;br&gt;A nested master page, em seu load, liga o page_error da master page principal com o page_error da content page&lt;br&gt;&lt;br&gt;A content page se aproveita de toda a sequencia&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=1014</link><title>ASP.NET : Referência a WebControls no Código JavaScript</title><description>&lt;br&gt;Frequentemente precisamos utilizar no javascript o nome dos nossos webControls, por&amp;#233;m nem sempre isso &amp;#233; uma tarefa f&amp;#225;cil : Quando nossos webControls encontram-se dentro de containers, tal como quando usamos master pages, login view ou outros casos semelhantes, o id do webControl se altera no client. &lt;br&gt;&lt;br&gt;Talvez voc&amp;#234;s j&amp;#225; tenham ouvido falar que os webControls possuem uma propriedade chamada clientid, que cont&amp;#233;m o nome que o controle ir&amp;#225; realmente ter quando estiver no client, mas como inserir este clientID no meio de um trecho de javascript como esse : &lt;br&gt;&lt;br&gt;&amp;lt;script language=&amp;quot;javascript&amp;quot;&amp;gt; &lt;br&gt;alert($get(&amp;quot;aqui entra o nome do objeto&amp;quot;).value); &lt;br&gt;&amp;lt;/script&amp;gt; &lt;br&gt;&lt;br&gt;A solu&amp;#231;&amp;#227;o inicial pode parecer simples, veja : &lt;br&gt;&lt;br&gt;&amp;lt;script language=&amp;quot;javascript&amp;quot;&amp;gt; &lt;br&gt;alert($get(&amp;quot;&amp;lt;%# obternome() %&amp;gt;&amp;quot;).value); &lt;br&gt;&amp;lt;/script&amp;gt; &lt;br&gt;&lt;br&gt;no code-behind criamos a fun&amp;#231;&amp;#227;o obternome : &lt;br&gt;&lt;br&gt;Protected Function obternome() As String &lt;br&gt;Return (Button1.ClientID) &lt;br&gt;End Function &lt;br&gt;&lt;br&gt;Mas ocorre um problema : Express&amp;#245;es utilizando o &amp;quot;#&amp;quot; apenas s&amp;#227;o processadas quando &amp;#233; solicitado um databind() no objeto dentro do qual elas encontram-se. Neste exemplo a express&amp;#227;o acima nunca seria processada. &lt;br&gt;&lt;br&gt;Mas poderiamos resolver da seguinte forma : &lt;br&gt;&lt;br&gt;&amp;lt;div id=&amp;quot;divteste&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt; &lt;br&gt;&amp;lt;script language=&amp;quot;javascript&amp;quot;&amp;gt; &lt;br&gt;alert($get(&amp;quot;&amp;lt;%# obternome() %&amp;gt;&amp;quot;).value); &lt;br&gt;&amp;lt;/script&amp;gt; &lt;br&gt;&amp;lt;/div&amp;gt; &lt;br&gt;&lt;br&gt;E no codeBehind : &lt;br&gt;&lt;br&gt;Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load &lt;br&gt;&lt;br&gt;divteste.DataBind() &lt;br&gt;&lt;br&gt;End Sub &lt;br&gt;&lt;br&gt;Desta forma for&amp;#231;amos o databind em uma &amp;quot;div&amp;quot; que na verdade n&amp;#227;o cont&amp;#233;m absolutamente nada al&amp;#233;m do javascript e geramos o nome client do nosso objeto naquela posi&amp;#231;&amp;#227;o. &lt;br&gt;&lt;br&gt;Uma d&amp;#250;vida comum : Por que n&amp;#227;o usar diretamente o page.databind() ? Simples : Porque al&amp;#233;m de ser muito mais pesado o page.databind() pode executar o vinculo de dados de algum objeto que n&amp;#227;o desejamos executar naquele momento, por isso o uso de page.databind n&amp;#227;o &amp;#233; aconselhavel. &lt;br&gt;&lt;br&gt;Outra observa&amp;#231;&amp;#227;o importante : como isso &amp;#233; para resolver problemas justamente causados por containers, esta dica http://www.bufaloinfo.com.br/dicas.asp?cod=810 sobre o findcontrol pode ser importante. &lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=1009</link><title>ASP.NET : Tratando o page_error com master pages</title><description>&lt;br&gt;O evento Page_error &amp;#233; sem d&amp;#250;vida uma boa forma de tratar erros inesperados. Enquanto desejaremos dar um tratamento comum a todo erro inesperado, utilizar o application_error do global.asax &amp;#233; por demais custoso.&lt;br&gt;&lt;br&gt;No Visual Studio 2003 cri&amp;#225;vamos uma classe base e faziamos todas as p&amp;#225;ginas do site herdarem desta classe base. No Visual Studio 2005, por&amp;#233;m, surgiram as master pages. Parecia a solu&amp;#231;&amp;#227;o definitiva para algumas centraliza&amp;#231;&amp;#245;es - tal como o tratamento de erro centralizado.&lt;br&gt;&lt;br&gt;Mas infelizmente n&amp;#227;o foi bem assim. O page_error quando programado na master page simplesmente n&amp;#227;o &amp;#233; executado e o programador fica chupando dedo sem saber o que est&amp;#225; acontecendo.&lt;br&gt;&lt;br&gt;Qual o segredo ?&lt;br&gt;&lt;br&gt;Simples : O page_error trata o erro da p&amp;#225;gina em que ele est&amp;#225;, no caso a master page. Se algum erro ocorrer dentro da execu&amp;#231;&amp;#227;o da master page o page_error tratar&amp;#225; isso sem problema algum.&lt;br&gt;&lt;br&gt;Por&amp;#233;m se algum erro ocorrer na content page o page_Error da master page n&amp;#227;o &amp;#233; considerado - n&amp;#227;o est&amp;#227;o na mesma p&amp;#225;gina.&lt;br&gt;&lt;br&gt;A consequencia disso seria terr&amp;#237;vel, nos obrigaria a repetir o tratamento de erros em todas as p&amp;#225;gins. Ent&amp;#227;o, como resolver ?&lt;br&gt;&lt;br&gt;A solu&amp;#231;&amp;#227;o para isso &amp;#233; simples : No load da master page podemos vincular o tratador qe j&amp;#225; existe nas master page com o evento page_error da content page&lt;br&gt;&lt;br&gt;Veja como fica :&lt;br&gt;&lt;br&gt;    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load&lt;br&gt;        AddHandler Page.Error, AddressOf Page_Error&lt;br&gt;    End Sub&lt;br&gt;&lt;br&gt;Com isso o tratamento de erro ser&amp;#225; o mesmo para todas as p&amp;#225;ginas e n&amp;#227;o teremos o peso t&amp;#237;pico que o application error do global.asax nos causaria.&lt;br&gt;&lt;br&gt;</description></item><item><link>http://www.bufaloinfo.com.br/dicas.asp?cod=1008</link><title>ASP.NET : Utilizando multiplos mapas de site na aplicação</title><description>&lt;br&gt;Comentamos sobre t&amp;#233;cnicas para manipular o mapa de site nas dicas em ... e ... mas eventualmente mesmo estas duas t&amp;#233;cnicas podem n&amp;#227;o ser suficientes. &lt;br&gt;&lt;br&gt;Quando precisarmos realmente criar &amp;#225;reas de navega&amp;#231;&amp;#227;o separadas em nosso site podemos manipular os providers de sitemap. Isso mesmo : Os mapas de site tamb&amp;#233;m s&amp;#227;o baseados em providers.&lt;br&gt;&lt;br&gt;Normalmente quando adicionamos um arquivo de mapa de site este j&amp;#225; &amp;#233; adicionado com o nome default de web.sitemap. Por&amp;#233;m isso n&amp;#227;o &amp;#233; obrigat&amp;#243;rio, podemos adicionar arquivos de mapas de site adicionais, definindo nomes personalizados para cada arquivo de mapa de site.&lt;br&gt;&lt;br&gt;Ent&amp;#227;o vem a quest&amp;#227;o principal : Como fazer com que o sitemapDataSource reconhe&amp;#231;a os diferentes arquivos de mapa de site que adicionarmos ?&lt;br&gt;&lt;br&gt;Para isso devemos incluir no nosso web.config configura&amp;#231;&amp;#245;es do provider de sitemap para cada arquivo de mapa de site inserido.&lt;br&gt;&lt;br&gt;Veja como fica :&lt;br&gt;&lt;br&gt;&lt;br&gt;        &amp;lt;siteMap&amp;gt;&lt;br&gt;            &amp;lt;providers&amp;gt;&lt;br&gt;                &amp;lt;add siteMapFile=&amp;quot;web.sitemap&amp;quot; name=&amp;quot;MeuProvider1&amp;quot; type=&amp;quot;System.Web.XmlSiteMapProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&amp;quot;/&amp;gt;&lt;br&gt;&lt;br&gt;                &amp;lt;add siteMapFile=&amp;quot;Mapa2.sitemap&amp;quot; name=&amp;quot;MeuProvider2&amp;quot; type=&amp;quot;System.Web.XmlSiteMapProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&amp;quot;/&amp;gt;&lt;br&gt;            &amp;lt;/providers&amp;gt;&lt;br&gt;        &amp;lt;/siteMap&amp;gt;&lt;br&gt;&lt;br&gt;Criamos 2 providers de mapa de site no web.config, cada provider com um nome diferenciado. &lt;br&gt;&lt;br&gt;Ao utilizar o siteMapDataSource podemos inserir 2 siteMapDataSources na nossa aplica&amp;#231;&amp;#227;o e configurar a propriedade siteMapProvider com o nome do provider que desejamos que seja utilizado.&lt;br&gt;&lt;br&gt;Desta forma, podemos ter 2 mapas de site diferenciados em uma mesma aplica&amp;#231;&amp;#227;o.&lt;br&gt;&lt;br&gt;</description></item></channel></rss>