---
title: Program a template change
slug: cms-13/docs/program-a-template-change
docTags: 
createdAt: 2026-07-30T20:22:04.871Z
---

Given that there is a page model registered like:

```csharp
[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 is the default template to use when rendering page instances of type `TypedPage`.
- The other template is another generic template for pages more suitable for rendering mobile devices.

```csharp
[TemplateDescriptor]
public partial class StandardTemplate : PageController<TypedPage> { }
    
[TemplateDescriptor(Name = "MobileTemplate")]
public partial class MobileTemplate : PageController<PageData> { }
```

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

```csharp
[InitializableModule]
public class MobileRedirectSample: IInitializableModule
{
    private IHttpContextAccessor _httpContextAccessor;

    public void Initialize(InitializationEngine context)
    {
        _httpContextAccessor = context.Services.GetRequiredService<IHttpContextAccessor>();
        context.Services.GetRequiredService<ITemplateResolverEvents>().TemplateResolved += MobileRedirectSample_TemplateResolved;
    }

    public void Uninitialize(InitializationEngine context)
    {
        context.Services.GetRequiredService<ITemplateResolverEvents>().TemplateResolved -= MobileRedirectSample_TemplateResolved;
    }

    private void MobileRedirectSample_TemplateResolved(object sender, TemplateResolverEventArgs eventArgs)
    {
        if (eventArgs.ItemToRender != null && eventArgs.ItemToRender is TypedPage)
        {
            //The sample code uses package 'Wangkanai.Detection' for device detection
            var detection = _httpContextAccessor.HttpContext.RequestServices.GetRequiredService<IDetectionService>();
            if (detection.Device.Type == Device.Mobile)
            {
                var mobileRender = eventArgs.SupportedTemplates
                    .SingleOrDefault(r => r.Name.Contains("Mobile") &&
                                          r.TemplateTypeCategory == eventArgs.SelectedTemplate.TemplateTypeCategory);

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