ASP.NET MVC 2 included support for automatically honoring
and enforcing DataAnnotation attributes on model objects that are used with
ASP.NET MVC’s model binding infrastructure. ASP.NET MVC 3 goes further
and also honors the IValidatableObject interface. This combined support
for model validation makes it easy to display appropriate error messages within
forms when validation errors occur.
To see this in action, let’s consider a simple Create form
that allows users to create a new Product:
We can implement the above Create
functionality using a ProductsController class that has two “Create” action
methods like below:
The first Create() method implements a version
of the /Products/Create URL that handles HTTP-GET requests - and displays the
HTML form to fill-out. The second Create() method implements a version of
the /Products/Create URL that handles HTTP-POST requests - and which takes the
posted form data, ensures that is is valid, and if it is valid saves it in the
database. If there are validation issues it redisplays the form with the
posted values.
The razor view template of our “Create” view
(which renders the form) looks like below:
One of the nice things about the above
Controller + View implementation is that we did not write any validation logic
within it. The validation logic and business rules are instead
implemented entirely within our model layer, and the ProductsController simply
checks whether it is valid (by calling the ModelState.IsValid helper method) to
determine whether to try and save the changes or redisplay the form with
errors. The Html.ValidationMessageFor() helper method calls within our view
simply display the error messages our Product model’s DataAnnotations and
IValidatableObject.Validate() method returned.
We can see the above scenario in action by
filling out invalid data within the form and attempting to submit it:
Notice above how when we hit the “Create”
button we got an error message. This was because we ticked the
“Discontinued” checkbox while also entering a value for the UnitsOnOrder (and
so violated one of our business rules).
You might ask – how did ASP.NET MVC know to
highlight and display the error message next to the UnitsOnOrder textbox?
It did this because ASP.NET MVC 3 now honors the IValidatableObject interface
when performing model binding, and will retrieve the error messages from
validation failures with it.
The business rule within our Product model
class indicated that the “UnitsOnOrder” property should be highlighted when the
business rule we hit was violated:
Our Html.ValidationMessageFor() helper method knew to
display the business rule error message (next to the UnitsOnOrder edit box)
because of the above property name hint we supplied: