HomeDev GuideAPI Reference
Dev GuideAPI ReferenceUser GuideGitHubNuGetDev CommunitySubmit a ticketLog In
GitHubNuGetDev CommunitySubmit a ticket

Change template programmatically

Describes how to programmatically change the template that is used to render a page.

Given that there is a page model registered like:

[ContentType]
    public class TypedPage : PageData
    {
      public virtual string Heading { get; set; }
      public virtual XhtmlString Content { get; set; }
    }

You can have several templates defined for the same typed page. The following example registers two templates for the same typed page.

  • One is StandardTemplate without tags which will be the default template to use when rendering page instances of type TypedPage.
  • The other template is another generic template for all pages that is more suitable for rendering for mobile devices.
[TemplateDescriptor(Path = "~/templates/StandardPage.aspx", Default = true)]
public partial class StandardTemplate : TemplatePage<TypedPage>
{ }

[TemplateDescriptor(Path = "~/templates/MobilePage.aspx", Name = "MobileTemplate")]
public partial class MobileTemplate : TemplatePage<TypedPage>
{ }

To change the template that is used for a request, you can attach an event handler to an event that is raised when a template is chosen for a specific request. The following code sample attaches to the event and changes the template for request for TypedPage instances when the request comes from a mobile device.

[InitializableModule]
public class MobileRedirectSample : IInitializableModule
{
    public void Initialize(InitializationEngine context)
    {
        context.Locate.TemplateResolver().TemplateResolved 
            += new EventHandler<TemplateResolverEventArgs>(MobileRedirectSample_TemplateResolved);
    }

    public void Uninitialize(global::EPiServer.Framework.Initialization.InitializationEngine context)
    {
        context.Locate.TemplateResolver().TemplateResolved
            -= new EventHandler<TemplateResolverEventArgs>(MobileRedirectSample_TemplateResolved);
    }

    void MobileRedirectSample_TemplateResolved(object sender, TemplateResolverEventArgs eventArgs)
    {
        if (eventArgs.ItemToRender != null && eventArgs.ItemToRender is TypedPage &&
            HttpContext.Current.Request.Browser.IsMobileDevice)
        {
            var mobileRender = eventArgs.SupportedTemplates
                .SingleOrDefault(r => r.Name.Contains("Mobile") &&
                r.TemplateTypeCategory == eventArgs.SelectedTemplate.TemplateTypeCategory);

            if (mobileRender != null)
            {
                eventArgs.SelectedTemplate = mobileRender;
            }
        }
    }

    public void Preload(string[] parameters)
    {
    }
}