SharePoint 2010 – Setting DefaultPageLayout Programmatically

July 1 2010 16 comments

PublishingWeb has a DefaultPageLayout-property which contains information of the page layout to use when you select New Page from Site Actions. The property is readonly as you can see from msdn.

However – PublishingWeb has a method SetDefaultPageLayout which gives you the way to change the default page layout programmatically. Definition is found from msdn. A sample of how to use the programmatic approach is found from PublishingWeb’s SetAvailablePageLayouts definition. First you need to add the wanted page layout to your available page layouts collection before setting the default page layout with SetDefaultPageLayout.

My scenario was to staple a custom page layout with custom contenttype bound to it to one of the site template’s default page layout setting and the links provided above gave me the way to go although I was kind of lost when I first realized the DefaultPageLayout-property is readonly.

Might I just be doing it wrong but by doing it like this popped the question of the whole concept of default page layout being a little obscure. What was wrong with the dialog of selecting page layout from the available page layouts familiar from SharePoint 2007?

Update 2010-08-22
New page –dialog expects only the page name to be filled in. The page name then forms the file name (URL) of the page. What if you try to add a duplicate to the pages-library? Well, validation attached to the new page -control catches the event and doesn’t allow you to use the same page name again. So, if I’m not mistaken you would have to fill in a different page name to form a unique file name (URL) and change the title of the page which also is formed from the page name after the page is created if and when there are cases you need to have more than one page in your pages-library with the same title. My colleague Aapo Talvensaari has already designed a workaround to solve the problem described above. There would be no problem if /_layouts/createpage.aspx would be the URL of the new page –action. To me this finding seems like an indication that the new page –dialog as it is in SharePoint 2010 isn’t thought over thoroughly. One might even consider the dialog as being a design fault so take your time to read up on Aapo’s approach to the problem.

Popularity: 100% [?]

16 comments to “SharePoint 2010 – Setting DefaultPageLayout Programmatically”

  1. Anders Rask says:

    Nice find!

    Did you know that you also can set this property declaratively in your publishing feature?

    onet.xml
    ..

    ..

    ..

  2. Juha Pitkänen says:

    Thank you for your comment. Yes I did know that you could declare default page layout in custom site definition. My case was different. I needed to change the default page layout programmatically in a special case. I reached my goal by defining a stapler feature, which staples the feature that changes the default page layout to the site when ever the stapler feature is activated, not always.

  3. Juha Pitkänen says:

    So in a way the stapling mechanism overrides the default page layout declared in onet.xml.

  4. [...] create a new filename if one with the same title already exists. Juha talked about this problem earlier, and he asked me to define my approach to create a better “create publishing page [...]

  5. Stephan says:

    Hello

    I have using SetDefaultPageLayout with success. When adding a new page, the layout is correctly chosen. However, when I crate a new site, the default page in the page-list does not have the default layout.

    Is there a clean way of defining the default page in new sites to have the same layout or do I have to make an event receiver and set the layout on site creation?

    Thankyou in advance.

  6. Juha Pitkänen says:

    I’m assuming you change the default page layout via feature receiver in a web scoped feature. If that’s the case, you could staple the feature to the desired site template with a stapler feature:

    Your stapler feature would be site scoped or even web application scoped and contain the following element manifest:

        <ElementManifests>
            <ElementManifest Location="Stapling.xml" />
        </ElementManifests>

    And you would have the following directive in your Stapling.xml:

    <FeatureSiteTemplateAssociation Id="2288D253-B88B-4A67-BA11-4EA1F036E20D" TemplateName="YOURTEMPLATENAME#1" />

    where Id is your web scoped feature’s id (the one that changes the default page layout) YOURTEMPLATENAME is the name of the template and 1 is the configuration id of your template configuration.

    This is exactly how I’m doing it. Let me know if this helped?

  7. Stephan says:

    Thankyou for your reply.

    You say “The name of your template”. Do you mean the name of my layout? I am talking about about the layout set on the default page created when creating a site :)

  8. Juha Pitkänen says:

    Seems like I misunderstood you. You mean the default.aspx of a publishing site. If you have a custom site template Onet.xml, you could read this: http://msdn.microsoft.com/en-us/library/ms474369(office.12).aspx and add the default.aspx as a module to your Onet.xml. If you want to change the layout of default.aspx (not the default page layout), you could start here: http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.publishing.publishingpage.layout.aspx and try to figure out how to change layout of a page programmatically.

  9. Stephan says:

    I do not use a custom page template. I use “Publishing site”.

    I guess the best way of achieving this would be to create an event listener and set the layout for default.aspx excplicitly after the site is created?

  10. Stephan says:

    I ended up making an event listener always setting the layout for default.aspx to the defined default layout for the site. The code looks like this:

    public override void WebProvisioned(SPWebEventProperties properties)
    {
    if (PublishingWeb.IsPublishingWeb(properties.Web))
    {
    var publishingWeb = PublishingWeb.GetPublishingWeb(properties.Web);
    var page = publishingWeb.GetPublishingPage(properties.Web.Url + “/pages/default.aspx”);
    page.CheckOut();
    page.Layout = publishingWeb.DefaultPageLayout;
    page.Update();
    page.CheckIn(“Layout automatically set”);
    publishingWeb.Update();
    }
    }

    Thankyou for your help :)

  11. Juha Pitkänen says:

    I wasn’t much of a help here. You might want to consider:

    var page = publishingWeb.GetPublishingPage(properties.Web.Url + “/” + publishingWeb.GetPagesListName(properties.Web) + “/default.aspx”);

    If you were ever to localize your site to danish or some other language.

  12. Stephan says:

    Thankyou!

  13. Praveen says:

    Somehow, for my site the default page layout is empty and always getting “Data at root level is invalid, line 1 position 1″. Here is what I have set through code/
    http://praveenbattula.blogspot.com/2011/08/set-default-page-layout-for-sharepoint.html

  14. thank you for this article Juha Pitkänen

Leave a Reply