Expressions

Liquid Expressions

Accessing Custom Types

Liquid is a secure template language which will only allow a predefined set of members to be accessed, and where model members can't be changed. Property are added to the TemplateOptions.MemberAccessStrategy property. This options object can be reused every time a template is rendered.

Alternatively, the MemberAccessStrategy can be assigned an instance of UnsafeMemberAccessStrategy which will allow any property to be accessed.

Allow-listing a specific type

To configure the liquid engine, implement INotificationHandler<EvaluatingLiquidExpression>. This notification handler will be invoked every time Elsa is about to evaluate a liquid expression.

The following example demonstrates how to allow access to a custom type called MyType from liquid expressions:

public class ConfigureLiquidEngine : INotificationHandler<EvaluatingLiquidExpression>
{
    public Task Handle(EvaluatingLiquidExpression notification, CancellationToken cancellationToken)
    {
        notification.TemplateContext.Options.MemberAccessStrategy.Register<Mytype>();
    }
}

Make sure to register your handler with DI:

services.AddNotificationHandler<EvaluatingLiquidExpression, ConfigureLiquidEngine>();

For more information about stuff you can do with Fluid, the engine used by Elsa for liquid handling, checkout their documentation.

Liquid Expressions

The following Liquid expressions are supported:

Common Variables

Workflow Variables

Use the following syntax to access a workflow variable:

{{ Variables.NameOfVariable }}

For example, given a workflow variable called FirstName with a value of "Alice", the expressionHello {{ Variables.FirstName }} will result in Hello Alice.

Input

Input values can be accessed using the following syntax:

{{ Input }}

Activity Output

To access a named activity's output, use the following syntax:

{{ Activities.SomeActivityName.Output }}

CorrelationId

Returns the correlation ID (if any) of the currently executing workflow.

{{ CorrelationId }}

WorkflowInstanceId

Returns the workflow instance ID of the currently executing workflow.

{{ WorkflowInstanceId }}

WorkflowDefinitionId

Returns the workflow definition ID of the currently executing workflow.

{{ WorkflowDefinitionId }}

WorkflowDefinitionVersion

Returns the workflow definition version of the currently executing workflow.

{{ WorkflowDefinitionVersion }}

Configuration

Provides access to a .NET configuration value.

{{ Configuration.SomeSection }}

As an example, let's say you have the following JSON in appsettings.json:

{
  "Elsa": {
    "Smtp": {
      "Host": "localhost",
      "Port": 2525
    }
  }
}

You can access the configured Port value using the following expression:

{{ Configuration.Elsa.Smtp.Port }}

Common Filters

json

A liquid filter that renders the specified value as a JSON string.

{{ Input | json }}

Example output:

{
  "SomeDocument": {
    "Title": "About Elsa Workflows"
  }
}

base64

A liquid filter that renders the specified value as a bas64 representation. The value is first converted to a string. If the value is an object, array, dictionary or datetime, it is first serialized using JsonConvert.SerializeObject before being encoded as base64.

{{ "Some string value" | base64 }}

Example output:

U29tZSBzdHJpbmcgdmFsdWU=

Workflow Filters

workflow_definition_id

Translates the specified workflow name or workflow tag into a workflow ID. This is useful for activities such as RunWorkflow which require a workflow ID to run.

Usage:

{{ "SomeWorkflowName" | workflow_definition_id }}
{{ "SomeWorkflowTag" | workflow_definition_id: tag }}

HTTP Variables

Request

Provides access to various properties on the current HTTP Request object:

  • {{ Request.QueryString }}
  • {{ Request.ContentType }}
  • {{ Request.ContentLength }}
  • {{ Request.Form }}
  • {{ Request.Protocol }}
  • {{ Request.Path }}
  • {{ Request.PathBase }}
  • {{ Request.Host }}
  • {{ Request.IsHttps }}
  • {{ Request.Scheme }}
  • {{ Request.Method }}

HTTP Filters

signal_url

A liquid filter that generates a fully-qualified absolute signal URL that will trigger the workflow instance from which this function is invoked.

Example:

{{ "MySignal" | signal_url }}

Example output:

https://localhost:5001/signals/trigger/{some base64 token}

Previous
JavaScript