Control.ResolveUrl versus Control.ResolveClientUrl versus VirtualPathUtility.ToAbsolute

¿Hay algún beneficio en utilizar uno de estos métodos sobre el otro cuando se resuelven trayectos que comienzan con la tilde (~)?

En general, ¿cuál es una mejor práctica si debe enviar rutas relativas o rutas absolutas hacia abajo en su html?

La diferencia entre ResolveUrl y ResolveClientUrl es que ResolveClientUrl devuelve una ruta relativa a la página actual, ResolveUrl devuelve una ruta relativa a la raíz del sitio:

http://www.andornot.com/blog/post/ResolveUrl-vs-ResolveClientUrl.aspx

Yo recomendaría usar rutas absolutas.

Editar : Rick Strahl publicó un buen artículo sobre esto

Edit2 : Se eliminó el bit sobre el almacenamiento en caché. No se agrega a la respuesta y puede no ser necesariamente precisa.

http://west-wind.com/weblog/posts/132081.aspx

Aquí hay otro artículo que explica la diferencia entre las diversas formas de resolver rutas en ASP.NET:

Diferentes enfoques para resolver URL en ASP.NET

Tenga en cuenta que VirtualPathUtility.ToAbsolute (virtualPath) lanzará una excepción si se incluye una cadena de consulta en la ruta.

El mensaje HttpException estará en la línea de “‘~ / YourVirtualPath / YourPage.aspx? YourQueryStringArg = FooBar’ no es una ruta virtual válida.”

Consulte el registro web de Rick Strahl: ResolveUrl () sin página y MSDN: método VirtualPathUtility.ToAbsolute (cadena)

Otra diferencia que noté:

Código:

string value = "~/Docs/Hello & World.aspx"; Response.Write(HyperLink1.ResolveClientUrl(value) + "
");
Response.Write(HyperLink1.ResolveUrl(value) + "
");

Resultado:

Docs / Hello% 20 y% 20World.aspx

/ Docs / Hello y World.aspx