Assigning the proper Template to a page created in code

2025/10/13 9:47 PM

I'm trying to create a page in code from within a Form Handler Module - and the page does get created. It even gets created where I want it in the tree. However, the template (that is properly defined in the system for the content type) is not being associated properly to the new page - it's not getting saved as I would expect in the [ContentItemCommonDataVisualBuilderTemplateConfiguration] column of the [CMS_ContentItemCommonData] table (the first row is a page that was manually create, the other 2 are my attempts to create via code):

image

I am using WebPageManager.Create() to create the page, and I see no way to assign the template to it.

How can I create a page in code and have the template that is defined for the content type associated properly so that the page will actually render once created?

Below is the method that again DOES create the page. Unfortunately, the Template for the page's content type doesn't get associated properly so the page errors out when trying to render with this error:InvalidOperationException: The page doesn't use page templates.

private async Task<int> CreateEventDetailFromFormData(BizFormItem formDataItem, IServiceProvider serviceProvider)
{
    var userInfoProvider = serviceProvider.GetRequiredService<CMS.Membership.IUserInfoProvider>();
    var webPageManagerFactory = serviceProvider.GetRequiredService<IWebPageManagerFactory>();
    var websiteChannelContext = serviceProvider.GetRequiredService<IWebsiteChannelContext>();
    var languageRetriever = serviceProvider.GetRequiredService<IPreferredLanguageRetriever>();
    var websiteChannelName = websiteChannelContext.WebsiteChannelName;
    var websiteChannelId = websiteChannelContext.WebsiteChannelID;
    var admin = await userInfoProvider.GetAsync("administrator") ?? throw new InvalidOperationException("Could not find the 'administrator' user.");
    var webPageManager = webPageManagerFactory.Create(websiteChannelId, admin.UserID);
    var languageName = languageRetriever.Get();

    var parentPageId = await GetEventsParentPageId(websiteChannelName, serviceProvider);
    if (parentPageId == 0)
    {
        throw new InvalidOperationException("Could not find the parent page for event submissions.");
    }

    var pageDisplayName = GenerateEventDetailDisplayName(formDataItem);
    var itemData = new ContentItemData();
  
    MapFormDataToEventDetail(formDataItem, itemData, pageDisplayName, parentPageId);

    var contentItemParameters = new ContentItemParameters(EventDetail.CONTENT_TYPE_NAME, itemData);
    var createPageParameters = new CreateWebPageParameters(pageDisplayName, languageName, contentItemParameters)
    {
        ParentWebPageItemID = parentPageId,
        UrlSlug = GenerateUrlSlug(formDataItem)                
    };

    return await webPageManager.Create(createPageParameters);
}

Environment

Tags:
v30.9.0

Answers

2025/10/13 10:02 PM
Accepted answer

Of course, I figure something out right after posting - below is the updated code. I added line 29 in the code below and it seems to be working now. That SetPageBuilderConfiguration() method was hard to find. Kentico docs AI didn't suggest it, nor did any Google search/other AI I engage find it. Ultimately found it on my own. Go figure :-)

private async Task<int> CreateEventDetailFromFormData(BizFormItem formDataItem, IServiceProvider serviceProvider)
{
    var userInfoProvider = serviceProvider.GetRequiredService<CMS.Membership.IUserInfoProvider>();
    var webPageManagerFactory = serviceProvider.GetRequiredService<IWebPageManagerFactory>();
    var websiteChannelContext = serviceProvider.GetRequiredService<IWebsiteChannelContext>();
    var languageRetriever = serviceProvider.GetRequiredService<IPreferredLanguageRetriever>();
    var websiteChannelName = websiteChannelContext.WebsiteChannelName;
    var websiteChannelId = websiteChannelContext.WebsiteChannelID;
    var admin = await userInfoProvider.GetAsync("administrator") ?? throw new InvalidOperationException("Could not find the 'administrator' user.");
    var webPageManager = webPageManagerFactory.Create(websiteChannelId, admin.UserID);
    var languageName = languageRetriever.Get();

    var parentPageId = await GetEventsParentPageId(websiteChannelName, serviceProvider);
    if (parentPageId == 0)
    {
        throw new InvalidOperationException("Could not find the parent page for event submissions.");
    }

    var pageDisplayName = GenerateEventDetailDisplayName(formDataItem);
    var itemData = new ContentItemData();
    MapFormDataToEventDetail(formDataItem, itemData, pageDisplayName, parentPageId);

    var contentItemParameters = new ContentItemParameters(EventDetail.CONTENT_TYPE_NAME, itemData);
    var createPageParameters = new CreateWebPageParameters(pageDisplayName, languageName, contentItemParameters)
    {
        ParentWebPageItemID = parentPageId,
        UrlSlug = GenerateUrlSlug(formDataItem)
    };
    createPageParameters.SetPageBuilderConfiguration(null, "{\"identifier\":\"ContentBase.EventLandingTemplate\",\"properties\":null,\"fieldIdentifiers\":{}}");
    
    return await webPageManager.Create(createPageParameters);
}

To response this discussion, you have to login first.