Precisei esses dias encontrar o caminho relativo de um recurso em uma página web. Pensei “o .Net framework já faz isso”. Me lembrei do controle Image, que permite utilizar o til (~) para indicar a raiz e portanto o caminho relativo. Com ele, uma imagem na pasta “img” chamada imagem.gif ficaria com a string de caminho “~/img/imagem.gif”, seria resolvida para “img/imagem.gif” no caso de uma página chamando da raiz e “../img/imagem.gif” caso a página de chamada morasse em um diretório descendente.

Fui ao Reflector. Descobri que o atributo/propriedade ImageUrl que indica o caminho relativo da imagem é realmente “traduzido” para caminho relativo. O método responsável pela tradução é o ResolveClientUrl, da classe System.Web.UI.Control.

Para utilizar o método, basta colocar o caminho a ser descoberto. Em uma página ASPX, por exemplo, onde você quer descobrir o caminho relativo de um arquivo flash, a tag param ficaria assim:

        <param name=”movie” value=”<% =Me.ResolveClientUrl(“~/flash/banner.swf”) %> />

Isso é útil especialmente para o flash, porque não há um controle nativo no flash, e se você usar uma master page vai ter problemas caso ela seja utilizada por alguma página aspx em um sub diretório. Imagens são mais fáceis, traduzem sozinhas.

Simples e prático, mas não achei muita documentação por aí… Analisei também a implementação interna e percebi que a Microsoft utiliza por debaixo dos panos a classe System.Web.Util.UrlPath, mas ela é marcada como “Friend”-VB/”internal”-C#. Essa classe tem muitos métodos interessantes, mas estão todos escondidos de nós, que não estamos codificando o .Net Framework. Porque será?

Enfim, problema resolvido e em pouco tempo. Nada como um framework bem desenvolvido.

Giovanni Bassi

Arquiteto e desenvolvedor, agilista, escalador, provocador. É fundador e CSA da Lambda3. Programa porque gosta. Acredita que pessoas autogerenciadas funcionam melhor e por acreditar que heterarquia é mais eficiente que hierarquia. Foi reconhecido Microsoft MVP há mais de dez anos, dos mais de vinte que atua no mercado. Já palestrou sobre .NET, Rust, microsserviços, JavaScript, TypeScript, Ruby, Node.js, Frontend e Backend, Agile, etc, no Brasil, e no exterior. Liderou grupos de usuários em assuntos como arquitetura de software, Docker, e .NET.