Cry about...
C# Development How To Notes
Tilde (~) and Virtual Paths with ASP.NET
Contents:
- Introducing the Tilde (~)
- Why use a tilde (~) instead of a relative path?
- Outside the framework - Getting the relative path
Introducing the Tilde (~)
In an ASP.NET application the framework controls recognise a tilde ('~') as a shortcut to the root of the application's virtual directory. So the framework will expand a tilde to the value of HttpRuntime.AppDomainAppVirtualPath.
So for example in the code behind
Response.Redirect(@"~/Login.aspx");
will redirect to the page "Login.aspx" in the root of the application and
Response.Redirect(@"~/Admin/Users.aspx");
will redirect to the page "Users.aspx" in the folder "Admin" off the root.
These will resolve to the correct location, regardless of which folder it is called from.
Likewise placing:
<asp:Image ID="image1" runat="server" ImageUrl="~/images/logo.gif"/>
on a page the framework will substitute the correct path to "images/log.gif" where the folder "images" is off the root.
Why use a tilde (~) instead of a relative path?
So why use a tilde instead or a relative path? In many cases you can use a relative path instead of a tilde. Using a tilde is often clearer because it makes it clearer what (where!) is being referenced.
There are also situations where a tilde is the only viable thing to use. This is particularly true when using your own components, controls and class libraries, where with the tilde you can rely on the framework to resolve to the correct relative path.
Outside the framework - Getting the absolute path
There are times when you might need an absolute URL, such as when passing a URL to a non-framework component.
There are a few options:
Option 1. Page.ResolveUrl
Page.ResolveUrl will return a URL relative to the root of the website. So for example:
Page.ResolveUrl(@"~/Admin/Users.aspx")
will return:
/wwwroot/Admin/Users.aspx
where "/wwwroot" happens to be the root of the project I am working in, so that will be different for you.
This can be used for any URLs which need to work within the website.
Option 2. Page.ResolveClientUrl
Page.ResolveClientUrl will return a URL relative to the current page. So for example:
Page.ResolveClientUrl(@"~/Admin/Users.aspx")
will return "Admin/Users.aspx" if called from a page in the root folder, but if it were called from say "Admin/Clients.aspx" - which note is in the same "Admin" folder - then it will return simply "Users.aspx".
This can be used for any URLs which need to work within within the website.
Option 3. Generate an absolute URL
If you are passing a URL to a different website then you may need the full URL. This requires a little bit of code:
public string GetAbsoluteUrl(string page)
{
if (HttpContext.current
== null)
{
return page;
}
else if (VirtualPathUtility.IsAbsolute(page))
{
return
HttpContext.Current.Request.Url.Scheme + "://"
+ HttpContext.Current.Request.Url.Authority
+
HttpContext.Current.Request.ApplicationPath
+ page;
}
else
{
return
HttpContext.Current.Request.Url.Scheme
+ "://"
+
HttpContext.Current.Request.Url.Authority
+
VirtualPathUtility.ToAbsolute(page);
}
}
This will return the full URL of the page (or resource) passed to it, making the assumption that the page (or resource) is part of the website and that if the current page is secure then the URL to the page should be secure.
About the author: Brian Cryer is a dedicated software developer and webmaster. For his day job he develops websites and desktop applications as well as providing IT services. He moonlights as a technical author and consultant.