Search This Blog

Monday, March 26, 2012

Working in URL 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 NavigationProvider. For this you could use:

SPUtility.GetFullUrl(SPSite Site, string WebUrl)

For example:

string webUrl = "/sub/default.aspx";
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 SPUrlUtility.

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 = "/sub/default.aspx";

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 it’s 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 the is no Uri.Combine().

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

SPUrlUtility.CombineUrl(string baseUrlPath, string additionalNodes)

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

string root = "/";
string path = "/sub"
string doc = "/sub/default.aspx";

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

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

1 comment: