Pergunta

Eu projetei um módulo que altera a página mestra dinamicamente com base nos privilégios de login do usuário.

Eu segui este tutorial:

http://ranaictiu-technicalblog.blogspot.it/2009/10/sharepoint-dynamically-change-master.html?showComment=1354630820782#c5132604142640789136

Tudo funciona bem.Mas só funciona na página inicial do SharePoint.Se tentar ir para outra página como

_layouts/user.aspx

ou

/_layouts/closeConnection.aspx

então a página iria travar!

public class DynamicMasterPageModule : IHttpModule
{
    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;
        string pageNo = ConfigurationManager.AppSettings["MasterPageNo"];




        if (page != null)
        {
            if (pageNo.Equals("1"))
            {
                page.MasterPageFile = "~masterurl/custom.master";
                if (SPContext.Current != null)
                {
                    SPContext.Current.Web.CustomMasterUrl = "/_catalogs/masterpage/custom1.master";
                }
            }
            else if (pageNo.Equals("2"))
            {
                page.MasterPageFile = "~masterurl/custom.master";
                if (SPContext.Current != null)
                {
                    SPContext.Current.Web.CustomMasterUrl = "/_catalogs/masterpage/custom2.master";
                }


            }
            else
            {
                page.MasterPageFile = "~masterurl/default.master";
                if (SPContext.Current != null)
                {
                    SPContext.Current.Web.MasterUrl = "/_catalogs/masterpage/default.master";
                }
            }


        }

ERRO:

The file '/_layouts/masterurl/custom.master' does not exist. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Web.HttpException: The file '/_layouts/masterurl/custom.master' does not exist.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  

Stack Trace: 


[HttpException (0x80004005): The file '/_layouts/masterurl/custom.master' does not exist.]
   System.Web.UI.Util.CheckVirtualFileExists(VirtualPath virtualPath) +11108402
   System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile) +163
   System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile) +116
   System.Web.UI.MasterPage.CreateMaster(TemplateControl owner, HttpContext context, VirtualPath masterPageFile, IDictionary contentTemplateCollection) +175
   System.Web.UI.Page.get_Master() +69
   System.Web.UI.Page.ApplyMasterPage() +18
   System.Web.UI.Page.PerformPreInit() +58
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1256
Foi útil?

Solução

Seguindo meu comentário, o código é de fato uma pesquisa, como se possivelmente não estivesse referenciando a página mestra corretamente.

O código deve ficar mais parecido com isto:

string masterUrl = site.ServerRelativeUrl;

if (!masterUrl.EndsWith(@"/"))
{
    masterUrl = masterUrl + @"/";
}

SPFile file = web.GetFile(masterUrl + "_catalogs/masterpage/custom.master");

Isso fornecerá o URL relativo baseado na permissão correta para a página mestra.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top