Lavorando con la feature di publishing in MOSS si può incorrere in una limitazione: un page layout utilizza sempre la master page definita a livello di root site e non è possibile modificare questo comportamento specificando l'attributo MasterPageFile nella direttiva di pagina perché questo viene semplicemente ignorato. Questa può essere una grossa limitazione in caso di numerosi siti figli che condividono lo stesso root site come ad esempio siti multilingua su cui agisce variation.
Per aggirare questo menefreghismo della piattaforma è necessario ridefinire la pagina padre del nostro page layout, da PublishingLayoutPage a una pagina custom che eredita da questa, contenente il seguente codice nel metodo OnPreInit
public class CustomMasterLayoutPage : PublishingLayoutPage
{
protected override void OnPreInit(EventArgs e)
{
string userDefinedMasterPage = this.MasterPageFile;
base.OnPreInit(e);
if (!string.IsNullOrEmpty(userDefinedMasterPage))
this.MasterPageFile = userDefinedMasterPage;
}
}
A questo punto bisogna dopo le solite operazioni da MOSS (compilare in una DLL, inserirla in GAC, autorizzarla come SafeControl nel web.config) possiamo sostituire all'interno del nostro page layout la classe base da Microsoft.SharePoint.Publishing.PublishingLayoutPage con la full identity della custom page creata e la valorizzazione di MasterPageFile da direttiva di pagina finalmente funzionerà correttamente.
Una soluzione semplice tanto da far perdere una mezz'ora e un paio di capelli.