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.