Samples

Take a look at sample code to learn more about Razor Functions

The following are a few sample .cshtml files you can learn from about Razor functions in C1 CMS.

To use them on your website, copy these files to ~/App_Data/Razor/Examples.

Breadcrumb.cshtml

Shows a breadcrumb-like menu on a page.

@inherits RazorFunction

@functions {
    override public string FunctionDescription
    {
        get { return "Shows a breadcrumb-like menu on a page."; }
    }	
	
    private IEnumerable<PageNode> OpenPages(PageNode selectedPageNode)
    {
        var openPages = new List<PageNode>();
        var openPage = selectedPageNode;

        while (openPage != null)
        {
            openPages.Add(openPage);
            openPage = openPage.ParentPage; // crawl up
        }

        return openPages;
    }
}

<ul id="Breadcrumb">
    @foreach (var page in OpenPages(@CurrentPageNode).OrderBy(op => op.Level))
    {
        <li>
            <a href="@(page.Url)" >@(String.IsNullOrWhiteSpace(page.MenuTitle) ? page.Title : page.MenuTitle)</a>
        </li>
    }
</ul>

Download the sample

Sitemap.cshtml

Shows a sitemap of the website.

@inherits RazorFunction

@functions{
    override public string FunctionDescription
    {
        get { return "Shows a sitemap of the website."; }
    }	
}

<div id="Sitemap">
    @NavigationTree(@HomePageNode.ChildPages, 5)
</div>

@helper NavigationTree(IEnumerable<PageNode> pages, int endRenderLevel)
{
    if (pages.Any() && pages.First().Level <= endRenderLevel)
    {
        <ul class ="sitemapLevel@(pages.First().Level)">
            @foreach  (var subPage in pages)
            {
                if  (!String.IsNullOrWhiteSpace(subPage.MenuTitle))
                {
                    <li>
                        <a href="@(subPage.Url)">@subPage.MenuTitle</a>
                        @NavigationTree(subPage.ChildPages, endRenderLevel)
                    </li>
                }
            }
        </ul>
    }
}

Download the sample

Subnavigation.cshtml

Shows a sub-level navigation menu.

@inherits RazorFunction
              
@functions {

    override public string FunctionDescription
    {
        get { return "Shows a sub-level navigation menu."; }
    }	
    
    private IEnumerable<PageNode> OpenPages(PageNode selectedPageNode)
    {
        var openPages = new List<PageNode>();
        var openPage = selectedPageNode;

        while (openPage != null)
        {
            openPages.Add(openPage);
            openPage = openPage.ParentPage; // crawl up
        }

        return openPages;
    }
}

<div id="Subnavigation">
    @if (OpenPages(@CurrentPageNode).Where(p => p.Level == 2).Any())
    {
        var openLevel2Page = OpenPages(@CurrentPageNode).Where(p => p.Level == 2).First();
        <h1>
            <a href="@(openLevel2Page.Url)">@(openLevel2Page.MenuTitle)</a>
        </h1>
        @NavigationTree(openLevel2Page.ChildPages, 5)
    }
</div>

@helper NavigationTree(IEnumerable<PageNode> pages, int endRenderLevel)
{
    if (pages.Any() && pages.First().Level <= endRenderLevel)
    {
        <ul class ="subnavigationLevel@(pages.First().Level)">
            @foreach  (var subPage in pages)
            {
                if  (!String.IsNullOrWhiteSpace(subPage.MenuTitle))
                {
                    var isOpen = OpenPages(@CurrentPageNode).Any(op => op.Id == subPage.Id);
                    var isSelected = @CurrentPageNode.Id == subPage.Id;
                        
                    <li>
                        <a href="@(subPage.Url)" class ="@(isOpen ? " open" : " closed") @(isSelected ? " selected" : " ")">
                            @subPage.MenuTitle
                        </a>
                        @if (isOpen)
                        {
                            @NavigationTree(subPage.ChildPages, endRenderLevel);
                        }
                    </li>
                }
            }
        </ul>
    }
}

Download the sample

Topnavigation.cshtml

Shows a top-level navigation menu.

@inherits RazorFunction

@functions{
    override public string FunctionDescription
    {
        get { return "Shows a top-level navigation menu."; }
    }	
}

<ul id="Topnavigation">
    @foreach  (var page in @HomePageNode.ChildPages.Where(tp => !String .IsNullOrWhiteSpace(tp.MenuTitle)))
    {
        <li class ="@SelectedClass(page)">
            <a href="@(page.Url)" >@(String.IsNullOrWhiteSpace(page.MenuTitle) ? page.Title : page.MenuTitle)</a>
        </li>
    }
</ul>

@helper SelectedClass(PageNode page)
{
    if (page.Id == @CurrentPageNode.Id)
    {
        <text>selected</text>
    }
}

Download the sample

ColorCube.cshtml

Displays a customizable color cube.

@inherits RazorFunction

@functions {
    override public string FunctionDescription
    {
        get { return "Displays a customizable color cube."; }
    }	

    // C1 Function parameters defined below...
    [FunctionParameter(Label = "Total width", Help = "How wide the cube should by, in pixels", DefaultValue = 500)]
    public int TotalWidth { get; set; }

    [FunctionParameter(Label = "Number of columns", Help = "Specify how many columns the cube should have across the X axis", DefaultValue = 10)]
    public int NumOfColumns { get; set; }

    [FunctionParameter(Label = "Number of rows", Help = "Specify how many rows the cube should have along the Y axis", DefaultValue = 10)]
    public int NumOfRows { get; set; }

    [FunctionParameter(Label = "Minimum Red 0 - 255", Help = "A higher number will make this color more dominant", DefaultValue = 10)]
    public int MinimumRed { get; set; }

    [FunctionParameter(Label = "Minimum Green 0 - 255", Help = "A higher number will make this color more dominant", DefaultValue = 10)]
    public int MinimumGreen { get; set; }

    [FunctionParameter(Label = "Minimum Blue 0 - 255", Help = "A higher number will make this color more dominant", DefaultValue = 10)]
    public int MinimumBlue { get; set; }

    [FunctionParameter(Label = "Border width", Help = "Increase to make outset border more dominant", DefaultValue = 3)]
    public int BorderWidth { get; set; }

    [FunctionParameter(Label = "Spacing between boxes", Help = "If spacing is desired, specify how many pixels", DefaultValue = 4)]
    public int SiblingPadding { get; set; }
}
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <style media="screen" type="text/css">
            #@(InstId) {
                background-color: #bba;
                padding: @SiblingMarginString 0 0 @SiblingMarginString;
                width: @(OuterBoxDimension * NumOfColumns)px;
            
            }
            #@(InstId) .CubeBox {
                width: @(BoxDimension)px;
                height: @(BoxDimension)px;
                margin: 0 @SiblingMarginString @SiblingMarginString 0;
                border: @(BorderWidth)px outset;
                float: left;
            
            }
            .clear { clear: both; }

            @for (int i = 0; i < NumOfColumns * NumOfRows; i++)
            {
                @String.Format("            #{0} #{0}BoxNumber{1} {{ background-color: {2}; border-color: {2};  }}\n",
                    InstId,
                    i,
                    RandomColor());
            }
        </style>
    </head>
    <body>
        <div id="@(InstId)">
            @for (int row = 0; row < NumOfRows; row++)
            {
                for (int col = 0; col < NumOfColumns; col++)
                {
                    <div id="@(InstId)BoxNumber@(row * NumOfColumns + col)" class="CubeBox"></div>
                }
                
                <div class="clear"></div>
            }
        </div>
    </body>
</html>

@functions {
    // plumbing that turns the input numbers into things like css width strings etc...

    private string RandomColor()
    {
        return String.Format("rgb({0},{1},{2})",
            Math.Max(MinimumRed, random.Next(0, 255)),
            Math.Max(MinimumGreen, random.Next(0, 255)),
            Math.Max(MinimumBlue, random.Next(0, 255)));
    }

    private string SiblingMarginString { get { return (SiblingPadding == 0 ? "0" : SiblingPadding + "px"); } }
    private int OuterBoxDimension { get { return TotalWidth / NumOfColumns; } }
    private int BoxDimension { get { return OuterBoxDimension - (2 * BorderWidth + SiblingPadding); } }
    private int SurplusSpace { get { return TotalWidth - (BoxDimension * NumOfColumns); } }
    private Random random = new Random();
    private string InstId
    {
        get
        {
            if (_myId == null) _myId = Guid.NewGuid().GetHashCode().ToString();
            
            return "cube" + _myId;
        }
    }
    private string _myId;
}

Download the sample

ExecuteOtherFunctions.cshtml

Executes the ColorCube function (see above) with and without parameters.

@inherits RazorFunction

@functions{
    override public string FunctionDescription
    {
        get { return "Executes the ColorCube function with and without parameters."; }
    }	
}

@Function("Examples.ColorCube");

<br /> <br />

@Function("Examples.ColorCube", new { MinimumRed = 255 }) 

<br /> <br />

@Function("Examples.ColorCube", new { MinimumGreen = 255, BorderWidth = 10 }) 

<br /> <br />

@Function("Examples.ColorCube",
    new Dictionary<string, object>() 
    {
        { "MinimumRed", 40 },
        { "BorderWidth", 30 }
    })

Download the sample