Introduction
This one is a bit of an old issue but some of my posts are just to remind me of a time that I got stuck in the past. Also if it helps someone else then great.
It is possible to create a feature which creates an instance of a SharePoint List when its activated. However, sometimes you only want a list to be created on the Root Web of a site collection.
Issue
Well the XML for specifying a ListInstance as a feature has an attribute called RootWebOnly which I thought I could use to only allow the ListInstance to be created on the RootWeb.
Unfortunately when you do that you get a message like the following in your SharePoint ULS Logs when the feature is activated:-
Feature Activation: Threw an exception, attempting to roll back. Feature ‘FeatureName’(ID: ‘xxxxxxxx-xxxx-xxxx-xxxxxxxx). Exception: System.NullReferenceException: Object reference not set to an instance of an object.
at Microsoft.SharePoint.SPListInstanceElement.ElementActivated(SPFeaturePropertyCollection props, SPSqlCommand sqlcmdAppendOnly, SPWebApplication webApp, SPSite site, SPWeb web, Boolean fForce)
at Microsoft.SharePoint.Administration.SPElementDefinitionCollection.ProvisionListInstances(SPFeaturePropertyCollection props, SPSite site, SPWeb web, Boolean fForce)
at Microsoft.SharePoint.Administration.SPElementDefinitionCollection.ProvisionElements(SPFeaturePropertyCollection props, SPWebApplication webapp, SPSite site, SPWeb web, Boolean fForce)
at Microsoft.SharePoint.SPFeature.ProvisionElements(SPFeaturePropertyCollection props, SPWebApplication webapp, SPSite site, SPWeb web, Boolean fForce)
at Microsoft.SharePoint.SPFeature.Activate(SPSite siteParent, SPWeb webParent, SPFeaturePropertyCollection props, Boolean fForce)
The offending Feature ListInstance element is below:-
1: <?xmlversion="1.0" encoding="utf-8"?>
2: <Elements
3: xmlns="http://schemas.microsoft.com/sharepoint/">
4: <ListInstance
5: Id="AListId"
6: Title="A List"
7: Description="A List
8: Description”
9: Url="Lists/ListUrlHere"
10: OnQuickLaunch="FALSE"
11: RootWebOnly=”TRUE”
12: FeatureId="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx"
13: TemplateType="45100"></ListInstance>
14: </Elements>
Solution
To fix the feature activation remove the RootWebOnly=”TRUE” from your ListInstance element manifest file and instead move the RootWebOnly=”TRUE” into your List’s schema.xml.
To ensure that the list is only provisioned at the root web of the site collection change the Feature.xml to use Scope=”Site”
Update:
Thanks to Dennis who picked up my mistake in this post which stated that the RootWebOnly attribute should be moved to the feature.xml.