Razor

Tips for creating Open Content Razor Templates

Open Content Razor Templates

The advantage of using Razor templates is that you can create any logic as you are using C# you want and use pretty much any data available in Open Content or DNN.

Razor reference

📘

Intellisens in Visual Studio (Code)

Add this include at the top of you Razor tempalte for Intellisense support:
@inherits Satrabel.OpenContent.Components.OpenContentWebPage
This is also included in the RazorStarter Template

Example template ( the RazorStarter Template)

@inherits Satrabel.OpenContent.Components.OpenContentWebPage
<div class="row">
    @foreach(var col in Model.Columns)
  	{
  <div class="col-md-@(12 / Model.Settings.Columns) col-sm-@(24 / Model.Settings.Columns)">
        <div class="thumbnail">
            @if (!string.IsNullOrEmpty(col.Image))
          	{          
            <img src="@col.Image" alt="@col.Title}}">
            }
          	@if (col.Caption)
          	{
            <div class="caption">
                @if (!string.IsNullOrEmpty(col.Title))
              	{
                <h3>@col.Title</h3>
                }
                @col.Description            
            </div>
          	}
        </div>
    </div>
  	}
</div>

Reserved Keywords

Sometimes there's an attribute in your Model that has the name of a reserved keyword in C#.
An example of this would be an enum from the schema of Open Content.
Use @keyword to prevent C# errors in that case.

@foreach (var role in Model.Schema.properties.Roles.@enum){
     <span class="roles">@role</span>
}

Other Uses of Razor

With the right includes a Razor template can also render data from outside Open Content.
And you can use the DNN Razor helpers (@Dnn.) as they are included by default.
Or you can also use the DNN API directly to combine Open Content data with DNN data.

More info on DNN Razor

@using System
@inherits Satrabel.OpenContent.Components.OpenContentWebPage

<h1>@Dnn.Portal.PortalName</h1>
<p>@Dnn.Portal.Description</p>
  
<h2>@Dnn.Tab.TabName</h2>
<h3>@Dnn.Tab.Title</h3>
<p>@Dnn.Tab.Description</p>

Loading Scripts and Stylesheets

You can load extra JS and CSS dependencies by injecting the following code at the top of the razor file.

@using System
@inherits Satrabel.OpenContent.Components.OpenContentWebPage

@{
    RegisterScript("js/my-script.js");
    RegisterStyleSheet("css/my-stylsheet.css");
}

etc..

Print the Razor Model

You can print the Razor module by inserting the following code in your template.

@ObjectInfo.Print(Model)
@ObjectInfo.Print(Dnn)