Skip to content

Working with URL’s in SharePoint

While working on a project with some existing code I noticed the developer did write large portions of code to get from an URL to a SPList. He probably didn't know some of the hidden gems in SharePoint.

Get the full URL

Sometimes you need the full URL and only have the relative one. For example, when opening a new SPSite or when writing code in a SPNavigationProvider. For this you could use the SPUtility Class:

SPUtility.GetFullUrl(SPSite Site, string WebUrl)

For example:

string webUrl = "";
SPUtility.GetFullUrl(SPContext.Current.Site, webUrl); // "http://localhost/sub/default.aspx"

There is one catch:

string webUrl = "http://localhost/sub/default.aspx";
SPUtility.GetFullUrl(SPContext.Current.Site, webUrl); // "http://localhosthttp://localhost/sub/default.aspx"

Check the type of URL

The former example is nice, but you would still need to write code to check if the input already contains the full URL. Nope!

For this, two gems are found in the SPUrlUtility Class.

SPUrlUtility.IsUrlRelative(string url);
SPUrlUtility.IsUrFull(string url);

These methods do exactly what their names imply: check if the URL is relative or full. So, for example:

string fullUrl = "http://localhost/sub/default.aspx";
string relUrl = "";
SPUrlUtility.IsUrlRelative(fullUrl); // false
SPUrlUtility.IsUrlRelative(relUrl);  // true
SPUrlUtility.IsUrlFull(fullUrl);     // true
SPUrlUtility.IsUrlFull(relUrl);      // false

Great! Now we can combine the two:

if (string.IsNullOrEmpty(webUrl) || SPUrlUtility.IsUrlRelative(webUrl))
    webUrl = SPUtility.GetFullUrl(SPContext.Current.Site, webUrl);

Now webUrl will always be the full URL.

URL concatenation

Ever did web.ServerRelativeUrl + "/something" and found out it did work nicely except it start doing something really weird on your root web? On the rootweb the relative URL is /, and this results in the URL //something which on its own turn gets translated to http://something, and that URL doesn't exist (most of the time).

When working with file system locations, you should always use Path.Combine() instead of concatenating path's yourself. But there is no Uri.Combine().

You could write an extension method. But the SharePoint team made it easier.

SPUrlUtility.CombineUrl(string baseUrlPath, string additionalNodes)

This method does the same thing like Path.Combine(). For example:

string root = "/";
string path = "/sub"
string doc = "";
SPUrlUtility.CombineUrl(root, path); // "/sub"
SPUrlUtility.CombineUrl(root, doc);  // ""
SPUrlUtility.CombineUrl(path, doc);  // ""

That's the final (hidden) gem for today.