Problemas com FindControl em Controlos com Caching activo

 

Para quem já visitou o site www.trokas.pt, pode ver que utilizei jquery para criar o efeito de paineis arrastáveis.

Penso que hoje em dia o jquery está tão maduro que não haja necessidade de estar a programar todo este efeito manualmente.

Mas para conseguir gravar as posições dos paineis e conseguir que eles voltem a aparecer no mesmo sitio quando a página abrir de novo, tive que escolher uma solução.

A solução que pensei foi colocar todos os controlos na página e um placeholder vazio. Depois em runtime era só mover esses controlos para dentro do placeholder pela ordem correcta, Até aqui tudo bem.
O problema foi quando tentei colocar um webcontrol dentro desses controlos com outputcaching. Por alguma razão ele teimava em dizer que o findcontrol não podia funcionar porque haviam controlos com o mesmo nome (o que era impossível). Após alguma pesquisa na net sem resultados reparei que existia um erro similar no ASP .NET 1.1 que tinha sido corrigido no ASP .NET 2.0.
Mas a verdade é que continuava a obter o erro.

Solução? 

Linq to the rescue.

Só por curiosidade lembrei-me de tentar ir buscar o controlo iterando por todos os controlos da página. Mas como não queria estar a escrever muito código optei por um simples query em LINQ.

O resultado foi este:

PlaceHolder ph = (PlaceHolder)(from Control p in pnlHomeWrapper.Controls

                             where p.ID == "phDrop_" + item

                             select p).FirstOrDefault();

if (ph != null) 
     phDropAreas.Controls.Add(ph);

Weirdddd :)

Ahh e caso estejam a testar eu testei os nomes dos controlos (logo após a excepção) a ver se realmente havia IDS duplicados e não havia.

 

 

Filed under: , , ,

Comments

# Nuno Gomes said:

Estás a dizer que pnlHomeWrapper.FindControl("phDrop_" + item) dá erro mas a query LINQ não?

É mesmo muito estranho ... tens que me enviar essa página para eu ver.

quarta-feira, 29 de Julho de 2009 3:49
# Helder Magalhães said:

Sim é exactamente isso que estou a dizer :)

Eu sei que é estranho, mas penso que tem a ver com um bug antigo que talvez não tenha sido de todo resolvido.

A página é esta:

<asp:UpdatePanel ID="upPanels" UpdateMode="Conditional" runat="server"><ContentTemplate>

   <asp:Panel ID="pnlHomeWrapper" runat="server">

   <div id="dropContainer">

       <asp:PlaceHolder ID="phDropAreas" EnableViewState="false" runat="server"></asp:PlaceHolder>

       <asp:PlaceHolder ID="phDrop_0" EnableViewState="false" runat="server">

       <div id="drop_0" class="dropArea"><div id="HelpPanelWrapper">

           <div id="howitworksLeft" class="ui-handle"><div id="howitworksRight"><div id="howitworks">

               <div class="helpPanelClose"><asp:LinkButton ID="btnCloseNumbering" EnableViewState="false" OnClick="CloseHelpPanel" CssClass="btnClosePanel" runat="server"></asp:LinkButton></div>

               <div id="howitworksNumbering"></div>

               <div id="howitworks1" class="orangeText">Cria a tua galeria de jogos</div>

               <div id="howitworks2" class="orangeText">Envia e recebe propostas</div>

               <div id="howitworks3" class="orangeText">Troka os teus jogos</div>

           </div></div></div>

           <div id="forumPanel">

               <asp:HyperLink ID="lnkRegister" CssClass="lnkRegister" NavigateUrl="~/registo.aspx/passo1/" runat="server"></asp:HyperLink>

               <asp:HyperLink ID="lnkLearnMore" CssClass="lnkLearnMore" NavigateUrl="~/conteudos.aspx/ajuda/" runat="server"></asp:HyperLink>

               <div id="latestPostArea">

                   <asp:HyperLink ID="lnkToLatestPost" runat="server">

                       <asp:Label ID="lblLatestPost" CssClass="lblLatestPost" runat="server"></asp:Label>  

                       <asp:Label ID="lblLatestPostInfo" CssClass="orangeText" runat="server"></asp:Label>

                   </asp:HyperLink>

               </div>

           </div>

       </div></div>

       </asp:PlaceHolder>

       <asp:PlaceHolder ID="phDrop_1" EnableViewState="false" runat="server">

       <div id="drop_1" class="dropArea">

           <div class="featurePanel">

               <div class="helpPanelClose"><asp:LinkButton ID="btnClosePanel1" EnableViewState="false" OnClick="ClosePanel" CommandArgument="1" CssClass="btnClosePanel" runat="server"></asp:LinkButton></div>

               <asp:Panel ID="pnlSugestions" runat="server">

               <span class="title ui-handle">Mais visitados</span>

               <asp:Repeater ID="rptSugestions" runat="server">

                   <ItemTemplate>

                       <asp:HyperLink ID="lk1" runat="server" CssClass="featuredItem" NavigateUrl='<%# Eval("url") %>'>

                           <span class="itemImageArea"><asp:Image ImageUrl='<%# "~/image/items/thumb/" + Eval("image") %>' AlternateText='<%# Server.HtmlEncode((string)Eval("itemName")) %>' runat="server" /></span>

                           <span class="itemTitleArea">

                               <asp:Label ID="lblItemName" runat="server" CssClass="featureItemName" Text='<%# Server.HtmlEncode((string)Eval("itemName")) %>'></asp:Label><br />

                               <trocas:rating ID="gameRating" runat="server" Rating='<%# Eval("rating") %>' TotalVotes='<%# Eval("totalVotes") %>' />

                           </span>

                           <span class="itemPlatformArea">

                               <asp:Image ID="img1" runat="server"

                                   AlternateText='<%# Eval("platformName") %>'

                                   ImageUrl='<%# "~/image/category/" + Eval("platformImage") %>' />

                           </span>

                           <span class="clear"></span>

                       </asp:HyperLink>

                   </ItemTemplate>

               </asp:Repeater>

               </asp:Panel>

           </div>

       </div>

       </asp:PlaceHolder>

       <asp:PlaceHolder ID="phDrop_2" EnableViewState="false" runat="server">

       <div id="drop_2" class="dropArea">

           <div class="featurePanel">

               <div class="helpPanelClose"><asp:LinkButton ID="LinkButton2" EnableViewState="false" OnClick="ClosePanel" CommandArgument="2" CssClass="btnClosePanel" runat="server"></asp:LinkButton></div>

               <span class="title ui-handle">Artigo em destaque</span>

               <asp:HyperLink ID="lnkToFeaturedArticle" CssClass="featureArticleLink" runat="server">

                   <span class="featureArticleImage"><asp:Image ID="imgFeaturedArticle" runat="server" /></span>

                   <asp:Label ID="lblFeaturedArticle" CssClass="featureArticleText" runat="server"></asp:Label>

               </asp:HyperLink>

           </div>

       </div>

       </asp:PlaceHolder>

       <asp:PlaceHolder ID="phDrop_3" EnableViewState="false" runat="server">

       <div id="drop_3" class="dropArea">

           <div class="featurePanel">

               <div class="helpPanelClose"><asp:LinkButton ID="LinkButton3" EnableViewState="false" OnClick="ClosePanel" CommandArgument="3" CssClass="btnClosePanel" runat="server"></asp:LinkButton></div>

               <span class="title ui-handle">Sabias que</span>

               <div class="tipArea">

                   <div class="tipText">Podes adicionar o trokas aos teus provedores e

                       pesquisar os jogos do trokas a qualquer altura.</div>

                   <div class="tipImage"><img alt="provedor de pesquisa" src="image/home/tips/tip1.gif" /></div>

               </div>

               <div class="tipArea">

                   <div class="tipText">Podes comprar jogos com toda a segurança através do trokas.

                       O trokas utiliza um sistema de pontos que são bloqueados durante o decorrer de uma transação.</div>

                   <div class="tipImage"><img alt="transacções seguras" src="image/home/tips/tip2.png" /></div>

               </div>

               <div class="tipArea">

                   <div class="tipText">Podes personalizar a tua página inicial como preferires.

                       Escolhe a informação que realmente te interessa ver.</div>

                   <div class="tipImage"><img alt="homepage personalizável" src="image/home/tips/tip3.jpg" /></div>

               </div>

               <div class="tipArea">

                   <div class="tipText">A confirmação de morada é gratuita.

                       Basta acederes ao teu perfil e clicar onde diz confirmar morada.</div><br /><br />

                   <div class="tipImage"><img alt="homepage personalizável" src="image/home/tips/tip4.png" /></div>

               </div>

           </div>

       </div>

       </asp:PlaceHolder>

       <asp:PlaceHolder ID="phDrop_4" EnableViewState="false" runat="server">

       <div id="drop_4" class="dropArea">

           <div id="rotatingGamesPanel" class="ui-handle">

               <div class="helpPanelClose"><asp:LinkButton ID="LinkButton1"

                   EnableViewState="false"

                   OnClick="CloseLatestPanel"

                   CssClass="btnClosePanel"

                   runat="server"></asp:LinkButton></div>

               <a class="lnkLatestAddition" onmouseover='window.ci = 0; adjustImageFadePosition();' onmouseout='restoreFadePosition()'><img id="lnkLatestAddition1" runat="server" class="rpgImage" alt="" /><span class="rpgName"></span></a>

               <a class="lnkLatestAddition" onmouseover='window.ci = 1; adjustImageFadePosition();' onmouseout='restoreFadePosition()'><img id="lnkLatestAddition2" runat="server" class="rpgImage" alt="" /><span class="rpgName"></span></a>

               <a class="lnkLatestAddition" onmouseover='window.ci = 2; adjustImageFadePosition();' onmouseout='restoreFadePosition()'><img id="lnkLatestAddition3" runat="server" class="rpgImage" alt="" /><span class="rpgName"></span></a>

               <a class="lnkLatestAddition" onmouseover='window.ci = 3; adjustImageFadePosition();' onmouseout='restoreFadePosition()'><img id="lnkLatestAddition4" runat="server" class="rpgImage" alt="" /><span class="rpgName"></span></a>

               <a class="lnkLatestAddition" onmouseover='window.ci = 4; adjustImageFadePosition();' onmouseout='restoreFadePosition()'><img id="lnkLatestAddition5" runat="server" class="rpgImage" alt="" /><span class="rpgName"></span></a>

               <a class="lnkLatestAddition" onmouseover='window.ci = 5; adjustImageFadePosition();' onmouseout='restoreFadePosition()'><img id="lnkLatestAddition6" runat="server" class="rpgImage" alt="" /><span class="rpgName"></span></a>

               <a class="lnkLatestAddition" onmouseover='window.ci = 6; adjustImageFadePosition();' onmouseout='restoreFadePosition()'><img id="lnkLatestAddition7" runat="server" class="rpgImage" alt="" /><span class="rpgName"></span></a>

               <a class="lnkLatestAddition" onmouseover='window.ci = 7; adjustImageFadePosition();' onmouseout='restoreFadePosition()'><img id="lnkLatestAddition8" runat="server" class="rpgImage" alt="" /><span class="rpgName"></span></a>

           </div>

       </div>

       </asp:PlaceHolder>

       <asp:PlaceHolder ID="phDrop_5" EnableViewState="false" runat="server">

       <div id="drop_5" class="dropArea">

           <div class="featurePanel">

               <div class="helpPanelClose"><asp:LinkButton ID="LinkButton4" EnableViewState="false" OnClick="ClosePanel" CommandArgument="5" CssClass="btnClosePanel" runat="server"></asp:LinkButton></div>

               <span class="title ui-handle">Últimos artigos</span>

               <asp:Repeater ID="rptFeaturedArticles" runat="server">

                   <ItemTemplate>

                       <asp:HyperLink ID="HyperLink2" runat="server" CssClass="featuredItem" NavigateUrl='<%# Eval("url") %>'>

                           <asp:Label ID="Label1" CssClass="featuredArticlesTitle orangeText" runat="server" Text='<%# Eval("articleTitle") %>'></asp:Label>

                           <asp:Label ID="Label2" CssClass="featuredArticlesDate" runat="server" Text='<%# "em " + ((DateTime)Eval("articleDate")).ToString("dd \\de MMMMM") %>'></asp:Label>

                       </asp:HyperLink>

                   </ItemTemplate>

               </asp:Repeater>

           </div>

       </div>

       </asp:PlaceHolder>

       <asp:PlaceHolder ID="phDrop_6" EnableViewState="false" runat="server">

       <div id="drop_6" class="dropArea">

           <div class="featurePanel">

               <div class="helpPanelClose"><asp:LinkButton ID="LinkButton5" EnableViewState="false" OnClick="ClosePanel" CommandArgument="6" CssClass="btnClosePanel" runat="server"></asp:LinkButton></div>

               <span class="title ui-handle">últimos posts</span>

               <asp:Repeater ID="rptLatestPosts" runat="server">

                   <ItemTemplate>

                       <asp:HyperLink ID="HyperLink2" runat="server" CssClass="featuredItem" NavigateUrl='<%# Eval("url") %>'>

                           <asp:Label ID="Label1" CssClass="featuredArticlesTitle orangeText" runat="server" Text='<%# Eval("message") %>'></asp:Label>

                           <asp:Label ID="Label2" CssClass="featuredArticlesDate" runat="server" Text='<%# Eval("messageDetails") %>'></asp:Label>

                       </asp:HyperLink>

                   </ItemTemplate>

               </asp:Repeater>

           </div>

       </div>

       </asp:PlaceHolder>

       <asp:PlaceHolder ID="phDrop_7" EnableViewState="false" runat="server">

       <div id="drop_7" class="dropArea">

           <div class="featurePanel">

               <div class="helpPanelClose"><asp:LinkButton ID="LinkButton6" EnableViewState="false" OnClick="ClosePanel" CommandArgument="7" CssClass="btnClosePanel" runat="server"></asp:LinkButton></div>

               <span class="title ui-handle">troka em destaque</span>

               <div id="featuredTradeArea" class="alignCenter">

                   <asp:HyperLink ID="lnkFeaturedTrade" CssClass="featuredTradeLink" runat="server">

                       <span class="itemDetailFrame"><asp:Image ID="imgFeaturedTrade" runat="server" /></span><br />

                       <asp:Label ID="lblFeaturedTradeName" runat="server" CssClass="strong"></asp:Label>

                   </asp:HyperLink><br />

                   <asp:Label ID="lblFeaturedTradeUserName" runat="server"></asp:Label>

                   <asp:Label ID="lblFeaturedTradeUserRank" runat="server"></asp:Label><br />

                   <asp:Literal ID="lblFeaturedTradeOption1" runat="server"></asp:Literal>

                   <asp:Literal ID="lblFeaturedTradeOption2" Visible="false" runat="server"></asp:Literal>

               </div>

           </div>

       </div>

       </asp:PlaceHolder>

       <asp:PlaceHolder ID="phDrop_8" EnableViewState="false" runat="server">

       <div id="drop_8" class="dropArea">

           <div class="featurePanel mediumFeature">

               <div class="helpPanelClose"><asp:LinkButton ID="LinkButton7" EnableViewState="false" OnClick="ClosePanel" CommandArgument="8" CssClass="btnClosePanel" runat="server"></asp:LinkButton></div>

               <span class="title ui-handle">últimos glogs</span>

               <trocas:home_latest_glogs ID="latestGlogss" runat="server" />

           </div>

       </div>

       </asp:PlaceHolder>

       <asp:PlaceHolder ID="phDrop_9" EnableViewState="false" runat="server">

       <div id="drop_9" class="dropArea">

           <div class="featurePanel">

               <div class="helpPanelClose"><asp:LinkButton ID="LinkButton8" EnableViewState="false" OnClick="ClosePanel" CommandArgument="9" CssClass="btnClosePanel" runat="server"></asp:LinkButton></div>

               <span class="title ui-handle">jogos mais pedidos</span>

               <trocas:home_most_wanted ID="mostWanted" runat="server" />

           </div>

       </div>

       </asp:PlaceHolder>

       <div id="endFeatures">

           <asp:LinkButton ID="btnResetLayout" CssClass="btnResetLayout" OnClick="ResetLayout" runat="server"></asp:LinkButton>

       </div>

   </div>

   </asp:Panel>

   </ContentTemplate></asp:UpdatePanel>

quinta-feira, 30 de Julho de 2009 21:29

Leave a Comment

(requerido) 
(requerido) 
(opcional)
(requerido) 
If you can't read this number refresh your screen
Enter the numbers above: