Executing Other Functions

You can execute other CMS Functions in User Control functions.

Using Function Markup in ASCX files

You can use the function's markup to execute a CMS Function (similar to how you do in XSLT functions or XHTML templates).

.ascx

<%@ Control Language="C#" AutoEventWireup="true" 
	CodeFile="ExecuteFunctionMarkup.ascx.cs" Inherits="C1Function" %>
<f:function name="Composite.Navigation.Distributed"	runat="server">
    <f:param name="Level" value="1" />
    <f:param name="ShowParent" value="False" />
    <f:param name="ShowChildPages" value="True" />
    <f:param name="Expand" value="False" />
    <f:param name="NavigationId" value="NavigationSideBar" />
</f:function>

Download the sample

.ascx.cs

using System;
using Composite.Functions;
public partial class C1Function : Composite.AspNet.UserControlFunction
{
    public override string FunctionDescription
    {
        get 
        { 
            return "A demo function that executes the Distributed Menu function."; 
        }
    }
    protected void Page_Load(object sender, EventArgs e)
    {
    }
}

Download the sample

You can quickly insert the function markup via the menu: Insert | Function Markup.

When you manually insert the function markup, make sure to specify runat="server".

Executing functions in ASCX.CS files

You can execute standard .NET code in .ascx.cs files.

.ascx

<%@ Control Language="C#" AutoEventWireup="true" 
	CodeFile="HelloWorldWithQueryString.ascx.cs" Inherits="C1Function" %>
Hello <%= this.Name %>!

Download the sample

.ascx.cs

using System;
using Composite.Functions;
public partial class C1Function : Composite.AspNet.UserControlFunction
{
    public override string FunctionDescription
    {
        get 
        { 
            return "A demo function that outputs a hello message read from the query string parameter."; 
        }
    }
    [FunctionParameter(DefaultValue = "World")]
    public string Name { get; set; }
    protected void Page_Load(object sender, EventArgs e)
    {
        string Param1 = Request.QueryString["Param1"];
		// fall back to the default value if no query parameter is specified
        if(!String.IsNullOrEmpty(Param1))
            Name = Param1;
    }
}

Download the sample

If you need to execute some CMS Functions, make use of the FunctionFacade's methods to get the function by name (GetFunction) and execute it (Execute).

.ascx

 
<%@ Control Language="C#" AutoEventWireup="true" 
	CodeFile="ExecuteWithFunctionFacade.ascx.cs" Inherits="C1Function" %>
<%= this.distributedMenu %>

Download the sample

.ascx.cs

using System;
using Composite.Functions;
using Composite.Core.Xml;
using System.Collections.Generic;
using System.Xml.Linq;
public partial class C1Function : Composite.AspNet.UserControlFunction
{
    public override string FunctionDescription
    {
        get 
        { 
            return "A demo function that outputs executes the Distributed Menu function."; 
        }
    }
    public XhtmlDocument distributedMenu { get; set; }
    protected void Page_Load(object sender, EventArgs e)
    {
        distributedMenu = FunctionFacade.Execute<XhtmlDocument>(
            FunctionFacade.GetFunction("Composite.Navigation.Distributed"),
            new Dictionary<string, object>() {
                { "Level", 1 }, { "ShowParent", false }, 
				{ "ShowChildPages", true }, { "Expand", false }, 
				{"NavigationId",  "NavigationSideBar"} });
        // removing the class attribute from the level menu's elements
        foreach (var item in distributedMenu.Descendants())
        {
            item.SetAttributeValue("class", null);
        }
    }
}

Download the sample