Value binding
The value binding is the most frequently used binding in DotVVM. It allows you to bind a property in the viewmodel to a property of a control in the DotHTML file, or just render the value as a text.
The data-binding works in both directions - whenever the Url
property changes, the control that this property is bound to, will be updated accordingly. Also, if the user makes a change in the control, the property value will be written back to the viewmodel.
Example
Let's have the following viewmodel:
public class MyViewModel {
...
public string Url { get; set; }
...
}
In the DotHTML markup, you can bind the property to the Text
property of a TextBox control:
<dot:TextBox Text="{value: Url}" />
If you run the page and view the page source code, you'll see that DotVVM translated the binding into a Knockout data-bind
attribute. DotVVM uses this popular JavaScript library to perform the data-binding and provide the MVVM experience. This is how the HTML will look like in the browser:
<input type="text" data-bind="attr: { 'href': Url }" />
Supported expressions in value binding
See the supported expressions page for more details.
Null handling
You don't have to worry about null
values in binding expressions. If some part of the expression evaluates to null
, the whole expression will return null
.
Internally, DotVVM treats every .
as .?
in C# 6.
In previous versions of DotVVM, when you tried to call a method in a value binding and any of its arguments evaluated to
null
, the method wasn't invoked and the result of the expression wasnull
. From DotVVM 3.0, this behavior was changed - the method will be invoked andnull
value will be passed as an argument.
Double and single quotes
Because the bindings in HTML attributes are often wrapped in double quotes, DotVVM allows to use single quotes (apostrophes) for strings as well.
This is different from the C# syntax where double quotes are used for string
values while single quotes are used for char
values.
In DotVVM, the single and double quotes can be used interchangeably.
<a class="{value: Active ? 'active' : 'not-active' }"></a>
Enums
If you have a property of an enum type in your viewmodel, you may need to work with that value in the binding.
public class MyViewModel {
...
public MyApp.Enums.ButtonColor Color { get; set; } // ButtonColor is enum
...
}
You can use the @import
directive to import the namespace in which the enum is declared. Then, you can use the ButtonColor.Red
to reference the enum member.
@viewModel ...
@import MyApp.Enums
<div class-red="{value: Color == ButtonColor.Red}"></div>
On the client-side, the enum values are converted to strings on the client side, so you can compare the value with strings. The following expression will also work - this is different from C# where enums cannot be compared with string
values directly.
<a class="{value: Color == 'Red' ? 'button-red' : 'button-normal'}">button</a>