Při bezstarostném používání Image.ImageUrl jsem narazil na zajímavý problém – pokud se Vám v názvu souboru nebo v cestě k němu vyskytne % (procenta) nebo # (hash), pak máte problém – metoda HttpUtility.UrlPathEncode(), kterou Image.ImageUrl a mnohé další controly pro encodování URL odkazů používají, Vám tyto znaky neencoduje:
<asp:Image ImageUrl="~/Folder #3/File.jpg" runat="server" /> udělá <img src="/Folder%20#3/File.jpg" /> protože HttpUtility.UrlPathEncode("/Folder #3/File.jpg") == "/Folder%20#3/File.jpg"
Metoda UrlPathEncode() totiž encoduje jen mezerník a non-ASCII znaky.
Správné samozřejmě je, abyste se na webových serverech pokusili těmto znakům vyhnout. Nicméně uživatelé jsou tvořiví a tak se můžete dočkat překvapení stejně jako já.
Osobně si myslím, že se jedná o bug v metodě UrlPathEncode(), resp. o nenaplnění očekávaného contractu, nicméně Microsoft to samozřejmě interpretuje jako by-design a radí, ať si uděláte Replace() těchto znaků sami.
Nezbývá tedy než:
myImage.ImageUrl = path.Replace("%", "%25").Replace("#", "%23");
Mimochodem obdobných vychytávek se můžete dočkat i se znakem + (plus).