Here's a simple example so you can see how the various sub-template pieces fit together. This example generates an HTML file from two templates. First, there's a sub-template that generates an HTML header:
...
language | xml/html |
---|
...
<%@
...
CodeTemplate
...
Language="C#"
...
TargetLanguage="HTML"
...
%>
...
<%@
...
Property
...
Name="Title"
...
Type="System.String"
...
Optional="False"
...
Category="Options"
...
Description="Page
...
title."
...
%>
...
<%@
...
Property
...
Name="CharSet"
...
Type="System.String"
...
Optional="False"
...
Default="windows-1252"
...
Category="Options"
...
Description="Character
...
set
...
for
...
the
...
page."
...
%>
...
<%@
...
Property
...
Name="IncludeMeta"
...
Type="System.Boolean"
...
Default="True"
...
Optional="False"
...
Category="Options"
...
Description="Include
...
meta
...
tags."
...
%>
...
<html>
...
<head>
...
<%
...
if
...
(IncludeMeta)
...
{
...
%>
...
<meta
...
http-equiv="Content-Type"
...
content="text/html;
...
charset=<%=
...
CharSet
...
%>">
...
<%
...
}
...
%>
...
<title><%=
...
Title
...
%></title>
...
</head>
...
Next, the main template generates the body of the HTML file. Note that it uses the sub-template to generate the header:
...
...
<%@
...
CodeTemplate
...
Language="C#"
...
TargetLanguage="HTML"
...
%>
...
<%@
...
Property
...
Name="Title"
...
Type="System.String"
...
Optional="False"
...
Category="Options"
...
Description="Page
...
title."
...
%>
...
<%@
...
Property
...
Name="Placeholder"
...
Type="System.String"
...
Optional="True"
...
Category="Options"
...
Description="Main
...
placeholder
...
text."
...
%>
...
<%@
...
Register
...
Name="Header"
...
Template="Header.cst"
...
MergeProperties="True"
...
ExcludeProperties="IncludeMeta"
...
%>
...
<%
...
OutputHeader();
...
%>
...
<body>
...
<h1><%=
...
Title
...
%></h1>
...
<p><%=
...
Placeholder
...
%></p>
...
</body>
...
</html>
...
<script
...
runat="template">
...
public
...
void
...
OutputHeader()
...
{
Header header = this.Create<Header>();
...
//
...
include
...
the
...
meta
...
tag
header.IncludeMeta
...
=
...
true;
...
//
...
copy
...
all
...
properties
...
with
...
matching
...
name
...
and
...
type
...
to
...
the
...
sub-template
...
instance
this.CopyPropertiesTo(header);
...
//
...
render
...
the
...
sub-template
...
to
...
the
...
current
...
output
...
stream
header.Render(this.Response);
...
}
...
</script>
...
When you open the master template, the property sheet shows the Title and Placeholder properties defined in the master template, as well as the CharSet property defined in the sub-template (because of the MergeProperties attribute), but not the IncludeMeta property (because of the ExcludeProperties attribute):
The template's output seamlessly merges the output of the sub-template and the output of the main template:
...
<html>
...
language | xml/html |
---|
<head>
<meta http-equiv="Content-Type"
...
content="text/html;
...
charset=windows-1252">
...
<title>My
...
Web
...
Page</title>
...
</head>
...
<body>
...
<h1>My
...
Web
...
Page</h1>
...
<p>Lorem
...
Ipsit</p>
...
</body>
...
</html>
...