OrchardCMS/OrchardCore · error · NotSupportedException

The syntax isn't supported for ForLoopTask.

Error message

The syntax {Syntax} isn't supported for ForLoopTask.

What it means

ForLoopTask's EvaluateFromAsync computes the loop's starting value by switching on the activity's Syntax. Only Liquid (parse LiquidFrom) and JavaScript (evaluate From) are implemented; any other WorkflowScriptSyntax value hits the default arm and throws NotSupportedException, aborting the loop before it starts.

Solutions

  1. Set Syntax to WorkflowScriptSyntax.Liquid and supply the start value in the LiquidFrom expression field.
  2. Or set Syntax to WorkflowScriptSyntax.JavaScript and put the numeric start expression in the From field (a plain double literal string also works via TryParse).
  3. Correct/repair the stored workflow definition if it holds an obsolete syntax value.
  4. If a new syntax member was introduced, update/rebuild OrchardCore.Workflows so EvaluateFromAsync handles it.

Example fix

// before
var loop = new ForLoopTask(); // Syntax unset -> unsupported in EvaluateFromAsync
// after
var loop = new ForLoopTask
{
    Syntax = WorkflowScriptSyntax.JavaScript,
    From = new JavaScriptExpression { Expression = "1" },
    To = new JavaScriptExpression { Expression = "10" },
    Step = new JavaScriptExpression { Expression = "1" }
};
Defensive patterns

Strategy: validation

Validate before calling

// before running the workflow
if (forLoopTask.Syntax is not (WorkflowScriptSyntax.Liquid or WorkflowScriptSyntax.JavaScript))
    throw new InvalidOperationException($"ForLoopTask From requires Liquid or JavaScript syntax; got {forLoopTask.Syntax}");

Type guard

static bool IsSupportedSyntax(WorkflowScriptSyntax s) => s is WorkflowScriptSyntax.Liquid or WorkflowScriptSyntax.JavaScript;

Try / catch

try { result = await activity.ExecuteAsync(workflowContext, activityContext); }
catch (NotSupportedException ex) { logger.LogError(ex, "ForLoopTask 'from' evaluation failed for syntax {Syntax}", syntax); /* halt workflow */ }

Prevention

When it happens

Trigger: Starting a workflow containing a ForLoopTask whose Syntax property is neither WorkflowScriptSyntax.Liquid nor WorkflowScriptSyntax.JavaScript (default/0 enum value, deserialized unknown value from workflow JSON, or programmatic construction without setting Syntax).

Common situations: Workflow definitions imported from another environment or older version with a syntax name that no longer maps; a newly added WorkflowScriptSyntax member not yet handled by ForLoopTask; forgetting to set Syntax when building the activity in code.

Related errors


AI-assisted analysis of OrchardCMS/OrchardCore@4306c0717f (2026-09-13). Data as JSON: /api/errors/25d37e8a9df70e0b. Report an issue: GitHub.

Appendix: source

Thrown at src/OrchardCore.Modules/OrchardCore.Workflows/Activities/ForLoopTask.cs:134

            return Outcome("Iterate");
        }
        else
        {
            Index = from;

            return Outcome("Done");
        }
    }

    private async Task<double> EvaluateFromAsync(WorkflowExecutionContext workflowContext)
    {
        return Syntax switch
        {
            WorkflowScriptSyntax.Liquid => double.Parse(await _expressionEvaluator.EvaluateAsync(LiquidFrom, workflowContext, null)),
            WorkflowScriptSyntax.JavaScript when double.TryParse(From.Expression, out var from) => from,
            WorkflowScriptSyntax.JavaScript => await _scriptEvaluator.EvaluateAsync(From, workflowContext),
            _ => throw new NotSupportedException($"The syntax {Syntax} isn't supported for ForLoopTask.")
        };
    }

    private async Task<double> EvaluateToAsync(WorkflowExecutionContext workflowContext)
    {
        return Syntax switch
        {
            WorkflowScriptSyntax.Liquid => double.Parse(await _expressionEvaluator.EvaluateAsync(LiquidTo, workflowContext, null)),
            WorkflowScriptSyntax.JavaScript when double.TryParse(To.Expression, out var to) => to,
            WorkflowScriptSyntax.JavaScript => await _scriptEvaluator.EvaluateAsync(To, workflowContext),
            _ => throw new NotSupportedException($"The syntax {Syntax} isn't supported for ForLoopTask.")
        };
    }

    private async Task<double> EvaluateStepAsync(WorkflowExecutionContext workflowContext)
    {
        return Syntax switch
        {

View on GitHub (pinned to 4306c0717f)