SPList Url
At first I thought I didn’t look good when I was looking for the Url property on the SPList class because it’s child and parent classes has them (SPWeb, SPListItem, SPFile) and thus, so I thought, the class itself should have it as well. But.. it doesnt! Aaargh.. Which properties are there to use then to you might wonder? Well first let me explain why I want to have the Url property. I’m trying to replace the default ListFormWebPart on the editform.aspx pages on certain lists and/or document libraries. To do this I use the SPLimitedWebPartManager and this thing requires a server-relative or absolute url to the page are you trying to access.
So at my first go I tried the following bit :
SPLimitedWebPartManager webPartManager = web.GetLimitedWebPartManager(web.Url + "/lists/" + list.Title + "/editform.aspx", System.Web.UI.WebControls.WebParts.PersonalizationScope.Shared);
But since the title of a list could be very different from the actual Url this was not really an option so I had to look for other properties and found the following:
- RootFolder (thanks Ton :)
- Simply replacing the list.Title with list.RootFolder
SPLimitedWebPartManager webPartManager = web.GetLimitedWebPartManager(web.Url + "/lists/" + list.RootFolder + "/editform.aspx", System.Web.UI.WebControls.WebParts.PersonalizationScope.Shared);
- Simply replacing the list.Title with list.RootFolder
- DefaultViewUrl
- Some string manipulation at first and then you have this beautifully crafted server-relative url ;)
string listUrl = list.DefaultViewUrl; int index = listUrl.IndexOf("Forms") + 6; listUrl = listUrl.Remove(index); if (listUrl.EndsWith("/")) { listUrl = listUrl.Remove(listUrl.LastIndexOf("/")); } SPLimitedWebPartManager webPartManager = web.GetLimitedWebPartManager(listUrl + "/editform.aspx", System.Web.UI.WebControls.WebParts.PersonalizationScope.Shared);
- Some string manipulation at first and then you have this beautifully crafted server-relative url ;)
Taking this a step for further and using the technique that Adam Buenz blogged about at Writing Extension Methods for SharePoint it’s incorporated in the SPList class like so:
public static class Extensions { /// <summary> /// Returns a server relative url of the list /// </summary> /// <param name="typeToTarget"></param> /// <returns>string</returns> public static string Url(this SPList typeToTarget) { string listUrl = typeToTarget.DefaultViewUrl; if (typeToTarget is SPDocumentLibrary) { int index = listUrl.IndexOf("Forms") + 6; listUrl = listUrl.Remove(index); if (listUrl.EndsWith("/")) { listUrl = listUrl.Remove(listUrl.LastIndexOf("/")); } } else { int indexSlash = listUrl.LastIndexOf("/"); listUrl = listUrl.Remove(indexSlash); } return listUrl; } }
And the end result being :
SPList list = SPContext.Current.Web.Lists[new Guid(id)]; SPLimitedWebPartManager webPartManager = web.GetLimitedWebPartManager(list.Url + "/editform.aspx", System.Web.UI.WebControls.WebParts.PersonalizationScope.Shared);