I found the following steps have worked well for me, thanks to sssreddy for the feature stapling links.
- Create a feature scoped at "Web - Activates a Feature for a specific web site".
- Add an event receiver to the feature, and implement the
FeatureDeactivating methods, setting the
SPWeb.MasterUrl (and if you want to enable publishing features later, the
SPWeb.CustomMasterUrl) properties of the feature's parent SPWeb1.
- Create another feature scoped at Site, Web Application or Farm, as preferred for your management requirements.
- Add an element to this feature that defines which features you want to enable on which site templates2.
1 The code in my
FeatureActivated method looks something like this:
public override void FeatureActivated(SPFeatureReceiverProperties properties)
// Get the SPWeb we're being activated in.
var web = (SPWeb)properties.Feature.Parent;
if (null != web)
// Get the Site Collection root path to get the master page gallery.
string siteCollectionRoot = web.Site.RootWeb.Url;
// Set the Site Master to Custom.master
var siteMaster = new Uri(siteCollectionRoot +
web.CustomMasterUrl = siteMaster.AbsolutePath;
// Set the System Master to Custom.master
var systemMaster = new Uri(siteCollectionRoot +
web.MasterUrl = systemMaster.AbsolutePath;
// Clear the Alternate CSS
web.AlternateCssUrl = string.Empty;
// Save the changes back to the web
FeatureDeactivating method was similar but obviously set the master pages back to V4.master.
2 My Elements.xml file was fairly simple:
<?xml version="1.0" encoding="utf-8"?>
As you can see, I set this to hook into every Site Template, and had some code in my feature receiver to filter out certain templates (i.e. Blogs) where I needed to use a slightly different set of master pages.
More indepth steps can be found on my blog post.