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
- Set Syntax to WorkflowScriptSyntax.Liquid and supply the start value in the LiquidFrom expression field.
- 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).
- Correct/repair the stored workflow definition if it holds an obsolete syntax value.
- 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
- Set Syntax explicitly on ForLoopTask (From, To, Step all share it)
- Keep From/To/Step expression fields consistent with the chosen syntax (LiquidFrom vs From)
- Validate imported workflow definitions before activation
- When adding enum members to WorkflowScriptSyntax, update all consuming activities in the same change
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
- The syntax isn't supported for ForEachTask.
- The syntax isn't supported for IfElseTask.
- The syntax isn't supported for SetOutputTask.
- The syntax isn't supported for SetPropertyTask.
- The syntax isn't supported for WhileLoopTask.
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)