Lorsque l’on créée des templates de sites personalisés, on est rapidement tenté d’y attacher par défaut une master page également personalisée. Cela s’avère assez simple à réaliser mais là où cela se complique c’est lorsqu’on souhaite attacher, par défaut, notre master page aux templates existants. On pourrait aisément modifier le nom de la master page active mais dans un contexte où les utilisateurs crèent eux mêmes leurs sites sur base des templates, il est probable que ceux-ci ne configurent pas cette master page.
Ainsi, puisque dans la majorité des cas nous nous retrouverons avec la master page par défaut, nous pourrions être tenté de remplacer cette master page par la nôtre. Cela n’est malheureusement pas supporté par Microsoft. On travaillera donc autrement et on modifiera, à la volée le nom de la master page à utiliser. Pour cela, il suffit d’intercepter les requêtes à l’aide d’un HttpModule. Pour faire faire simple, un HttpModule permet d’exposer des évènements qui participeront à chacune de vos demandes de page web.
Dans notre cas, nous attacherons un handler à l’évènement PreInit de la page qui est demandée.
Un HttpModule est simplement à mettre en oeuvre et doit implémenter deux méthodes de base: Dispose et Init. Ainsi, voici un exemple de code implémentant les éléments cités précédemment.
public class MasterPageManagerHttpModule : IHttpModule
{
#region IHttpModule Members
public void Dispose() { }
public void Init(HttpApplication context)
{
context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
}
void context_PreRequestHandlerExecute(object sender, EventArgs e)
{
Page page = HttpContext.Current.CurrentHandler as Page;
if (page != null)
page.PreInit += new EventHandler(page_PreInit);
}
void page_PreInit(object sender, EventArgs e)
{
Page page = sender as Page;
if (page == null || page.MasterPageFile == null) return;
if (page.MasterPageFile.ToLower().Contains("default.master"))
{
page.MasterPageFile = "~sitecollection/_catalogs/masterpage/custom.master"; // Master page can be uploaded to layouts folder also
return;
}
if (page.MasterPageFile.ToLower().Contains("application.master"))
{
page.MasterPageFile = "~sitecollection/_catalogs/masterpage/customapplication.master";
return;
}
}
#endregion
}
Il nous reste à indiquer, dans le web.config qu’il est nécessaire d’utiliser ce HttpModule.
<add name="MasterPageManager" type="Company.Portal.Features.MasterPageManagerHttpModule.MasterPageManagerHttpModule, Company.Portal.Features.MasterPageManagerHttpModule, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9f4da00116c38ec5" />
Vu le type d’évènement, on déploiera ce code à l’aide d’une feature ayant comme scope la WebApplication et qui se chargera, à l’activation, de modifier le web.config comme indiqué dans ce post: SharePoint: How to use SPWebConfigModification class
Simple mais efficace.