Program a template change
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
StandardTemplatewithout tags, which is the default template to use when rendering page instances of typeTypedPage. - The other template is another generic template for pages more suitable for rendering mobile devices.
[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.
[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;
}
}
}
}
}Updated 9 days ago
