HAVIT Knowledge Base

Vývoj webových aplikací, .NET, SQL, návrh
Welcome to HAVIT Knowledge Base Sign in | Join | Help
-
Home Články Forums Obrázky Soubory

ASP.NET

Vývoj webových aplikací ASP.NET

Pozor na ImageUrl, resp. UrlPathEncode() a znaky % (procenta) nebo # (hash)

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).

Published 10. července 2009 14:01 by Robert Haken
Filed under:

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

 

nopl said:

No nema preco enkodovat #... je to znak ktory reprezentuje anchor v stranke, na zaklade ktoreho sa prehliadac presunie priamo na tuto znacku vtexte

července 10, 2009 16:36
 

Robert Haken said:

to nopl: No, jasně že # je separátor pro fragment (anchor), nicméně v daném kontextu (ImageUrl, Path) je to nesmysl, protože

1) Ukažte mi ImageUrl, kde bude mít # smysl pro fragment (anchor), když některé browsery část URL za # ani neposílají na server v GET requestu.

2) Při názvu metody UrlPathEncode() lze oprávněně očekávat, že encoduje "path". Zároveň si dovolím tvrdit, že fragment (anchor) není součástí path a dokládám například třídou Uri nebo UriBuilder, které Fragment jasně rozlišují a pojem path používají jinak (např. property AbsolutePath, PathAndQuery).

července 10, 2009 18:19

What do you think?

(required) 
(optional)
(required) 
Enter the code you see below

Submit