Sharepoint:如何更改新创建子网站的默认页面布局?

Sharepoint:如何更改新创建子网站的默认页面布局?,sharepoint,sharepoint-2010,Sharepoint,Sharepoint 2010,我正在sharepoint 2010发布网站上工作,该网站有许多子网站。我已经设置了一个自定义母版页和几个自定义页面布局 我发现了如何在位于/_Layouts/AreaTemplateSettings.aspx的子网站中设置用于新创建页面的默认页面布局,但我似乎不知道如何在创建新子网站时指定用于创建~/pages/default.aspx的默认页面布局 现在它选择WelcomeLinks.aspx,这不是我想要的 这是否只有在通过代码部署自定义母版页/布局时才可用?如果是,是否有人有好的示例 谢

我正在sharepoint 2010发布网站上工作,该网站有许多子网站。我已经设置了一个自定义母版页和几个自定义页面布局

我发现了如何在位于/_Layouts/AreaTemplateSettings.aspx的子网站中设置用于新创建页面的默认页面布局,但我似乎不知道如何在创建新子网站时指定用于创建~/pages/default.aspx的默认页面布局

现在它选择WelcomeLinks.aspx,这不是我想要的

这是否只有在通过代码部署自定义母版页/布局时才可用?如果是,是否有人有好的示例


谢谢。

您不需要部署自定义页面布局,但需要使用代码。我们解决这个问题的方法是为WebProvisioning事件创建一个事件接收器,该事件将在创建新的SPWeb后触发

您可以做的是用您想要的页面布局更新新网站中的PublishingPage。这允许用户创建新网站,但您可以设置每个新网站的默认页面布局

这是事件接收器代码:

public override void WebProvisioned(SPWebEventProperties properties)
{
    try
    {
        if (PublishingWeb.IsPublishingWeb(properties.Web))
        {
            PublishingWeb curPubWeb = PublishingWeb.GetPublishingWeb(properties.Web);

            foreach (PageLayout curLayout in curPubWeb.GetAvailablePageLayouts())
            {
                if (curLayout.Name == "DefaultPageLayout.aspx")
                {
                    foreach (PublishingPage curPage in curPubWeb.GetPublishingPages())
                    {
                        curPage.CheckOut();
                        curPage.Layout = curLayout;
                        curPage.Update();
                        curPage.CheckIn("");
                    }
                    break;
                }
            }
        }
    }
    catch (Exception ex)
    {
        /* Handle exception here */
    }
}
这是注册事件接收器的代码,可以在激活功能时运行,也可以从PowerShell脚本或控制台应用程序运行一次:

using (SPSite topSite = new SPSite("[Site Collection URL]"))
{
    SPEventReceiverDefinition webEventDef = topSite.EventReceivers.Add();
    webEventDef.Name = "Web Adding Receiver";
    webEventDef.Synchronization = SPEventReceiverSynchronization.Synchronous;
    webEventDef.Type = SPEventReceiverType.WebProvisioned;
    webEventDef.SequenceNumber = 4001;
    webEventDef.Assembly = "MyCustomAssembly, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=123456789";
    webEventDef.Class = "MyCustomAssembly.CustomEvents";
    webEventDef.Data = "Adding publishingwebfeatures";
    webEventDef.Update();
}

您不需要部署自定义页面布局,但需要使用代码。我们解决这个问题的方法是为WebProvisioning事件创建一个事件接收器,该事件将在创建新的SPWeb后触发

您可以做的是用您想要的页面布局更新新网站中的PublishingPage。这允许用户创建新网站,但您可以设置每个新网站的默认页面布局

这是事件接收器代码:

public override void WebProvisioned(SPWebEventProperties properties)
{
    try
    {
        if (PublishingWeb.IsPublishingWeb(properties.Web))
        {
            PublishingWeb curPubWeb = PublishingWeb.GetPublishingWeb(properties.Web);

            foreach (PageLayout curLayout in curPubWeb.GetAvailablePageLayouts())
            {
                if (curLayout.Name == "DefaultPageLayout.aspx")
                {
                    foreach (PublishingPage curPage in curPubWeb.GetPublishingPages())
                    {
                        curPage.CheckOut();
                        curPage.Layout = curLayout;
                        curPage.Update();
                        curPage.CheckIn("");
                    }
                    break;
                }
            }
        }
    }
    catch (Exception ex)
    {
        /* Handle exception here */
    }
}
这是注册事件接收器的代码,可以在激活功能时运行,也可以从PowerShell脚本或控制台应用程序运行一次:

using (SPSite topSite = new SPSite("[Site Collection URL]"))
{
    SPEventReceiverDefinition webEventDef = topSite.EventReceivers.Add();
    webEventDef.Name = "Web Adding Receiver";
    webEventDef.Synchronization = SPEventReceiverSynchronization.Synchronous;
    webEventDef.Type = SPEventReceiverType.WebProvisioned;
    webEventDef.SequenceNumber = 4001;
    webEventDef.Assembly = "MyCustomAssembly, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=123456789";
    webEventDef.Class = "MyCustomAssembly.CustomEvents";
    webEventDef.Data = "Adding publishingwebfeatures";
    webEventDef.Update();
}

新创建的子网站的页面布局由网站定义决定。例如,如果使用带有工作流模板的发布网站创建子网站,则将使用14\template\SiteTemplates\BLANKINTERNET\XML\onet.XML中的配置ID=2创建该网站。在该配置中有一个模块部分,指向SubWebWelcome:

<Module Name="SubWebWelcome" Url="$Resources:osrvcore,List_Pages_UrlName;" Path="">
    <File Url="default.aspx" Type="GhostableInLibrary" Level="Draft" >
        <Property Name="Title" Value="$Resources:cmscore,IPPT_HomeWelcomePage_Title;" />
        <Property Name="PublishingPageLayout" Value="~SiteCollection/_catalogs/masterpage/WelcomeLinks.aspx, $Resources:cmscore,PageLayout_WelcomeLinks_Title;" />
        <Property Name="ContentType" Value="$Resources:cmscore,contenttype_welcomepage_name;" />
    </File>
</Module>
如您所见,SubWebWelcome使用WelcomeLinks页面布局设置default.aspx

如果要为默认页面使用不同的页面布局,则有两个选项:

基于使用所需页面布局的Internet创建自定义网站定义。 继续使用开箱即用的站点定义和由功能装订或事件接收器启动的自定义代码,以更改WelcomeLinks中的页面布局。
新创建的子网站的页面布局由网站定义决定。例如,如果使用带有工作流模板的发布网站创建子网站,则将使用14\template\SiteTemplates\BLANKINTERNET\XML\onet.XML中的配置ID=2创建该网站。在该配置中有一个模块部分,指向SubWebWelcome:

<Module Name="SubWebWelcome" Url="$Resources:osrvcore,List_Pages_UrlName;" Path="">
    <File Url="default.aspx" Type="GhostableInLibrary" Level="Draft" >
        <Property Name="Title" Value="$Resources:cmscore,IPPT_HomeWelcomePage_Title;" />
        <Property Name="PublishingPageLayout" Value="~SiteCollection/_catalogs/masterpage/WelcomeLinks.aspx, $Resources:cmscore,PageLayout_WelcomeLinks_Title;" />
        <Property Name="ContentType" Value="$Resources:cmscore,contenttype_welcomepage_name;" />
    </File>
</Module>
如您所见,SubWebWelcome使用WelcomeLinks页面布局设置default.aspx

如果要为默认页面使用不同的页面布局,则有两个选项:

基于使用所需页面布局的Internet创建自定义网站定义。 继续使用开箱即用的站点定义和由功能装订或事件接收器启动的自定义代码,以更改WelcomeLinks中的页面布局。
如果在站点上启用了发布功能,它应该非常简单,如下所示:


站点设置、外观、欢迎页面和选择页面

如果在站点上启用了发布功能,则应简单到:


站点设置、外观、欢迎页面和选择页面

将发布子网站添加到SharePoint时,似乎不会继承父网站的默认页面布局。更重要的是,即使调用SetDefaultPageLayout passing true重置所有子站点,此设置仍然不起作用

在搭建了整个站点结构子站点之后,我必须实现以下递归函数,以确保继承最顶层的默认页面布局,希望这对其他人有所帮助

// Recursively update sub-webs to inherit the default page layout.
Action<PublishingWeb> updateWebRecursive = null;
updateWebRecursive = new Action<PublishingWeb>((parentWeb) =>
{
    PublishingWebCollection childWebs = parentWeb.GetPublishingWebs();
    if (!parentWeb.Web.IsRootWeb)
    {
        parentWeb.InheritDefaultPageLayout();
        parentWeb.Update();
    }
    foreach (PublishingWeb childWeb in childWebs)
    {
        updateWebRecursive(childWeb);
    }
});
updateWebRecursive(pubWeb);

将发布子网站添加到SharePoint时,似乎不会继承父网站的默认页面布局。更重要的是,即使调用SetDefaultPageLayout passing true重置所有子站点,此设置仍然不起作用

在搭建了整个站点结构子站点之后,我必须实现以下递归函数,以确保继承最顶层的默认页面布局,希望这对其他人有所帮助

// Recursively update sub-webs to inherit the default page layout.
Action<PublishingWeb> updateWebRecursive = null;
updateWebRecursive = new Action<PublishingWeb>((parentWeb) =>
{
    PublishingWebCollection childWebs = parentWeb.GetPublishingWebs();
    if (!parentWeb.Web.IsRootWeb)
    {
        parentWeb.InheritDefaultPageLayout();
        parentWeb.Update();
    }
    foreach (PublishingWeb childWeb in childWebs)
    {
        updateWebRecursive(childWeb);
    }
});
updateWebRecursive(pubWeb);