Statiq supports the Razor engine from ASP.NET Core 3.0.
In Statiq Web and Statiq Docs, the Razor engine is executed automatically for Razor file types. In Statiq Framework you must use the RenderRazor
module from the Statiq.Razor
package in your pipeline to render Razor content.
Document And Context Access
The Razor engine in Statiq uses a custom Razor base page type of StatiqRazorPage<TModel>
. This exposes several additional properties including @Document
to access the currently rendering document and @Context
to access the current execution context.
Model
The default model for a Razor page in Statiq is typically also set to the current document and can be accessed using @Model
as you would in Razor from ASP.NET Core. However, it is strongly recommended that you get in the habit of referencing your document via the strongly-typed @Document
property of the Statiq Razor base page to avoid model typing problems (see below).
Imports File and Intellisense
Because Statiq uses a custom Razor base page, the Razor Intellisense engine doesn't actually know about the default namespaces, base page, or model. While these will be set during generation, it might be helpful to also let the Intellisense version of Razor know about them so you get better hints and errors. To do so, create a _ViewImports.cshtml
file in your input folder:
@using Statiq.Common
@using Statiq.Razor
@using Statiq.Web
@using Statiq.Web.Pipelines
@using Microsoft.Extensions.Logging
@inherits StatiqRazorPage<IDocument>
View Imports Model
Important note: if you do create a _ViewImports.cshtml
file, it will also instruct the Statiq Razor engine during generation. Generally this isn't a problem since the file is just reiterating what Statiq is doing behind the scenes. However, if any of your partial views change the model with a @model
directive, the @inherits
directive in the _ViewImports.cshtml
file will take precedence and the model you define in the partial view will not work. In this case you should define your partial model using a full @inherits
directive. For example, @model int
should become @inherits StatiqRazorPage<int>
.
Layouts and Partials Model
Razor layouts and partials need to generally handle all model types (since different views with different model types can call them), so by default they use a model type of dynamic
unless explicitly specified otherwise. Unlike normal views where dynamic
model types are converted to IDocument
(since we know there aren't other "callers" of each individual view), a layout or partial will keep
it's default dynamic
model type. This means that treating the @Model
property as an IDocument
will fail in some cases (specifically when using extension methods like IDocument.GetString()
). If you see "does not contain a definition" error messages during Razor compilation, try changing @Model
property access to @Document
in your layouts and partials, or using an explicit @model
directive at the top of the layout partial file to explicitly specify the model type as IDocument
for that layout or partial.