Thursday 13 October 2011

ASP NET MVC 3 T4 Template Properties

Here are the properties that ASP.NET MVC 3.0 provides to T4 templates when you use the Add View and Add Controller dialogs inside Visual Studio 2010.

Add Controller

Property Name Type Description
AddActionMethods Boolean Adds action methods to the generated controller class.
AreaName System.String The name of the Area that the controller is created for.
ContextType System.Type The type of the data context.
ControllerName String The name of the controller class that will be generated.
ControllerRootName String The name of the controller class excluding the Controller part at the end of the name.
EntitySetName String Name of the property on the data context class containing the set of entities.
ModelType System.Type The type of the model class specified in the Add Controller dialog.
Namespace String Namespace that will be used for the generated controller class.
PrimaryKeys PrimaryKey[]
(Microsoft.
VisualStudio.
Web.Mvc.
Scaffolding.
BuiltIn)
Primary keys for the model. See table at end for PrimaryKey properties.
RelatedProperties Dictionary<String,
RelatedModel
(Microsoft.
VisualStudio.
Web.
Mvc.
Scaffolding.
BuiltIn)>
Related properties on the model. See table at end for RelatedModel properties.

Add View

Property Name Type Description
AreaName System.String The name of the Area that the view is being created for.
ContentPlaceHolderIDs List<string> List of content place holder IDs in the master page.
IsContentPage Boolean True if the generated view will be created with a master page or a Razor layout page.
IsPartialView Boolean True if the generated view is a partial view (e.g. an ASP.NET user control).
MasterPageFile String Master page file or Razor layout to be used with view (e.g. ~/Views/Shared/Site.Master).
Namespace String Namespace that will be used for the generated view.
PrimaryContentPlaceHolderID String Primary content place holder ID to be used when creating a view using a master page.
ReferenceScriptLibraries Boolean True if checked in the Add View dialog.
ViewDataType System.Type The view model's type.
ViewDataTypeName String Fully qualified name for the view model's type.
ViewName String Name of the view.

Common Properties

Property Name Type Description
AssemblyPath List<string> List of assemblies referenced by the project and the project's output assembly. Internal use.
Errors CompilerErrorCollection
(System.CodeDom.Compiler)
Used to stored errors that occur whilst processing the T4 template. Internal use.
FileEncoding System.Text.Encoding The encoding of the file that will be generated.
FileExtension String Not set.
FrameworkVersion System.Version The .NET framework version.
OutputFileExtension System.String The extension of the file that will be generated.
TemplateFile System.String The full path to the T4 template file being used.

Primary Key Properties

Property Name Type Description
Name String
ShortTypeName String
Type System.Type

Related Model Properties

Property Name Type Description
DisplayPropertyName String
EntitySetName String
ForeignKeyPropertyName String
PrimaryKey String
PropertyName String
TypeName String

Tuesday 4 October 2011

T4 Import Directive - Namespace Alias

How do you specify a namespace alias when using the Import directive in a T4 template?

The Import directive in a T4 template is used to bring a namespace into scope for any code that will be run when processing the T4 template. Here is an example template that imports the System.IO namespace without using a namespace alias.

<#@ template language="C#" #> 
<#@ output extension=".txt" #> 
<#@ import namespace="System.IO" #> 
<# 
 string text = File.ReadAllText(@"d:\MyFile.txt"); 
#> 
File content: <#= text #>

The T4 template reads all the text in the d:\MyFile.txt which is then saved in the file generated by the template.

If we want to use a namespace alias we can specify it in the import directive in a similar way to how you can with C# or VB.NET. Here is the example template modified so that an alias of IO is used for the System.IO namespace.

<#@ template language="C#" #> 
<#@ output extension=".txt" #> 
<#@ import namespace="IO = System.IO" #> 
<# 
 string text = IO.File.ReadAllText(@"d:\temp\test.xsd"); 
#> 
File content: <#= text #>

Why does this Work?

T4 templates use the CodeDom to generate C# or VB.NET code which is then executed as the template is processed. When the T4 templating engine processes the Import directive it creates a CodeNamespaceImport object and passes it the Namespace attribute's value. The CodeNamespaceImport object supports generating a namespace alias when you specify a string of the form "Alias = Namespace" and pass this to its constructor.