SPSite.AllWebs Property
Assembly: Microsoft.SharePoint (in microsoft.sharepoint.dll)
The following code example displays in a console application the number of Web sites in a site collection and their URLs.
using(SPSite oSiteCollection = new SPSite("http://" + System.Environment.MachineName)) { SPWebCollection collWebsites = oSiteCollection.AllWebs; Console.WriteLine("Count: {0}", collWebsites.Count); foreach (SPWeb oWebsite in collWebsites) { Console.WriteLine("Web site: {0}", oWebsite.Url); oWebsite.Dispose(); } }
Note: |
|---|
Certain objects implement the IDisposable interface, and you must avoid retaining these objects in memory after they are no longer needed. For information about good coding practices, see Best Practices: Using Disposable Windows SharePoint Services Objects. |
Since method AllWebs also returns object for root SPWeb for Site. It will be more correct to look so.
StringBuilder sb = new StringBuilder();
SPWeb rootWeb = SPContext.Current.Site.RootWeb;
sb.AppendFormat("Title : {0}<br>", rootWeb .Title);
foreach(SPWeb web in rootWeb.GetSubwebsForCurrentUser() )
{
sb.AppendFormat("Title : {0}<br>",web.Title);
web.Dispose();
}
- 5/10/2007
- Evgeny Zyuzin
- 6/5/2010
- Thomas Lee
Be carefull when you decide to use AllWebs property of SPSite. Some user that doesn't have access to all site might receive Access Denied error. So , I suggest to use GetSubwebsForCurrentUser() method of SPWeb.
For example look at this following code
StringBuilder sb = new StringBuilder();
foreach(SPWeb web in SPContext.Current.Site.AllWebs)
{
sb.AppendFormat("Title : {0}<br>",web.Title);
}
For user who has access to all subsite, the code will be fine. Unfortunatelly, for some users who only has access to some subsite, they will receive Access Denied error.
Therefore change to code into
StringBuilder sb = new StringBuilder();
foreach(SPWeb web in SPContext.Current.Web.GetSubwebsForCurrentUser())
{
sb.AppendFormat("Title : {0}<br>",web.Title);
}
And no more access denied problem.
-Riwut Libinuko-
Note: