Skip to main content Link Search Menu Expand Document Toggle dark mode Copy Code (external link)

Binding Expressions Support

Scryber uses a Handlebars-style expression syntax ({{...}}) to bind data and execute functions within templates. This chart covers all supported helpers, operators, functions, and special variables.

All binding features are Scryber-specific β€” standard HTML has no equivalent built-in template engine.


On this page

Expression Syntax

Syntax Example Description
Output value {{model.name}} Renders a data value as text
Expression {{price * qty}} Evaluates an inline expression
Function call {{toUpper(model.name)}} Calls a built-in function
Conditional expression {{if(score >= 90, 'A', 'B')}} Inline ternary
CSS variable {{var(--theme-color)}} Reads a CSS custom property value
CSS calc {{calc(100% - 20pt)}} CSS calculation

Handlebars Helpers

Block-level helpers for control flow and iteration.

Helper Syntax Description
each {{#each items}}...{{/each}} Iterate over a collection; access current item with {{this}}
with {{#with object}}...{{/with}} Change the data context to a specific object
if {{#if condition}}...{{/if}} Conditional block; condition is any expression
else if {{else if condition}} Additional branch in an if block
else {{else}} Fallback branch when no condition is met
log {{log "message"}} Writes a debug message to the trace log

Operators

Used within {{expression}} bindings. Operator precedence follows standard mathematical rules.

Mathematical

Operator Example Description Reference
+ {{a + b}} Addition β†’
- {{a - b}} Subtraction β†’
* {{a * b}} Multiplication β†’
/ {{a / b}} Division β†’
% {{a % b}} Modulus (remainder) β†’
^ {{a ^ b}} Power (exponentiation) β†’

Comparison

Operator Example Description Reference
== {{a == b}} Equality β†’
!= {{a != b}} Inequality β†’
< {{a < b}} Less than β†’
<= {{a <= b}} Less than or equal β†’
> {{a > b}} Greater than β†’
>= {{a >= b}} Greater than or equal β†’

Logical

Operator Example Description Reference
&& {{a && b}} Logical AND β†’
\|\| {{a \|\| b}} Logical OR β†’
! {{!a}} Logical NOT Β 
Operator Example Description Reference
. {{model.address.city}} Property access Β 
[] {{items[0]}} Array index access Β 
.. {{../parentValue}} Navigate to parent context Β 
?? {{value ?? 'default'}} Null coalescing β€” returns right side if left is null β†’
this {{this.name}} Current context reference Β 

Special Variables

Available automatically in specific contexts.

Variable Context Description
@index {{#each}} loops Zero-based index of the current item
@first {{#each}} loops true if this is the first item
@last {{#each}} loops true if this is the last item
this Any Current data context
. Any Shorthand for current context
.. Nested contexts Parent context reference
model Root Root data model (from doc.Params["model"])

Functions

Conversion

Function Signature Description
string string(value, format?) Convert to string with optional format
int int(value) Convert to 32-bit integer
long long(value) Convert to 64-bit integer
double double(value) Convert to double-precision float
decimal decimal(value) Convert to decimal number
bool bool(value) Convert to boolean
date date(value) Convert to DateTime
typeof typeof(value) Returns the type name as a string

String

Function Signature Description
concat concat(s1, s2, ...) Concatenate strings
join join(separator, array) Join array elements with a separator
substring substring(str, start, length?) Extract a portion of a string
replace replace(str, find, replace) Replace text in a string
toLower toLower(str) Convert to lowercase
toUpper toUpper(str) Convert to uppercase
trim trim(str) Remove whitespace from both ends
trimEnd trimEnd(str) Remove trailing whitespace
length length(str) Get string length
contains contains(str, search) Check if string contains text
startsWith startsWith(str, prefix) Check if string starts with prefix
endsWith endsWith(str, suffix) Check if string ends with suffix
indexOf indexOf(str, search) Find position of a substring
padLeft padLeft(str, len, char) Pad string on the left
padRight padRight(str, len, char) Pad string on the right
split split(str, separator) Split string into an array
format format(value, formatStr) Format value using a .NET format string
regexIsMatch regexIsMatch(str, pattern) Test if string matches a regex
regexMatches regexMatches(str, pattern) Return all regex matches
regexSwap regexSwap(str, pattern, replacement) Replace using a regex

Mathematical

Function Signature Description
abs abs(value) Absolute value
ceiling ceiling(value) Round up to nearest integer
floor floor(value) Round down to nearest integer
round round(value, decimals?) Round to nearest value
truncate truncate(value) Remove decimal portion
sqrt sqrt(value) Square root
pow pow(base, exponent) Raise to a power
exp exp(value) e raised to a power
log log(value) Natural logarithm
log10 log10(value) Base-10 logarithm
sign sign(value) Returns -1, 0, or 1
sin sin(angle) Sine (radians)
cos cos(angle) Cosine (radians)
tan tan(angle) Tangent (radians)
asin asin(value) Arcsine
acos acos(value) Arccosine
atan atan(value) Arctangent
degrees degrees(radians) Convert radians to degrees
radians radians(degrees) Convert degrees to radians
pi pi() Ο€ constant (3.14159…)
e e() Euler’s number (2.71828…)
random random() Random value between 0 and 1

Date & Time

Function Signature Description
addDays addDays(date, n) Add days to a date
addMonths addMonths(date, n) Add months to a date
addYears addYears(date, n) Add years to a date
addHours addHours(date, n) Add hours to a date
addMinutes addMinutes(date, n) Add minutes to a date
addSeconds addSeconds(date, n) Add seconds to a date
addMilliseconds addMilliseconds(date, n) Add milliseconds to a date
daysBetween daysBetween(d1, d2) Days between two dates
hoursBetween hoursBetween(d1, d2) Hours between two dates
minutesBetween minutesBetween(d1, d2) Minutes between two dates
secondsBetween secondsBetween(d1, d2) Seconds between two dates
yearOf yearOf(date) Extract the year
monthOfYear monthOfYear(date) Extract the month (1–12)
dayOfMonth dayOfMonth(date) Extract the day of month
dayOfWeek dayOfWeek(date) Extract the day of week
dayOfYear dayOfYear(date) Extract the day of year (1–365)
hourOf hourOf(date) Extract the hour (0–23)
minuteOf minuteOf(date) Extract the minute (0–59)
secondOf secondOf(date) Extract the second (0–59)
millisecondOf millisecondOf(date) Extract the millisecond (0–999)

Logical

Function Signature Description
if if(condition, trueVal, falseVal) Ternary conditional
ifError ifError(expression, fallback) Return fallback if expression throws
in in(value, a, b, ...) Check if value exists in a list

Collection

Function Signature Description
count count(array) Count elements
countOf countOf(array) Alias for count()
sum sum(array) Sum numeric values
sumOf sumOf(array, 'prop') Sum a property across elements
min min(array) Minimum value
minOf minOf(array, 'prop') Minimum of a property
max max(array) Maximum value
maxOf maxOf(array, 'prop') Maximum of a property
collect collect(expr, array) Map an expression over an array
each each(array) Iterate over array (returns array)
firstWhere firstWhere(array, condition) First matching element
selectWhere selectWhere(array, condition) Filter array by condition
sortBy sortBy(array, 'prop') Sort by property
reverse reverse(array) Reverse array order

Statistical

Function Signature Description
average average(array) Mean of array values
averageOf averageOf(array, 'prop') Mean of a property
mean mean(array) Alias for average()
median median(array) Middle value
mode mode(array) Most common value

CSS / Document

Function Signature Description
calc calc(expression) CSS calculation (prefer inline operators)
var var(--name) Read a CSS custom property value

Custom Functions & Operators

The binding system can be extended with custom functions and operators registered at startup:

// Register a custom function
BindingCalcExpressionFactory.RegisterFunction(new MyCustomFunction());

// Register a custom operator
BindingCalcExpressionFactory.RegisterOperator(new MyCustomOperator());

See the Configuration section for more on extending Scryber.


Common Patterns

Format a currency value:

{{format(model.price, 'C2')}}

Format a date:

{{format(orderDate, 'yyyy-MM-dd')}}

Conditional class:

<div class="{{if(isActive, 'active', 'inactive')}}">

Null-safe navigation:

{{user.address.city ?? 'No city'}}

Sum a collection property:

Total: {{format(sumOf(items, .price), 'C2')}}

Loop with index:

{{#each items}}
  <p>{{@index}}. {{this.name}}</p>
{{/each}}

See Also