Fluent programming strives to provide for more readable code. Fluent validation provides more readable validation code. This is really important when you are building applications that have a lot of validation logic. There are two Fluent Validation ASP.NET libraries that I found:
Because it was the first one I found, I decided to give Fluent Validation a try.
Creating the Sample
First I create a table.
Next, I create a Linq to SQL Class.
Then I create a .ascx control and place a LinqDataSource control on the page and configure it to point to the FluentTest_Customer table.
I drop a ListView control on the page and configure it to point to the LinqDataSource control and then click Configure ListView…
The wizard allows me to quickly configure the ListView.
I now have a form that allows me to insert, edit, update, and delete.
For more information on using Linq to SQL with DotNetNuke see: Creating a DotNetNuke Module using LINQ to SQL (VB and C#).
Adding Validation
I now place the FluentValidation.dll in the “bin” directory of my DotNetNuke website
I create a class with the following validation rules:
public class CustomerValidator :
AbstractValidator<FluentTest_Customer>
public CustomerValidator()
RuleFor(customer => customer.Surname).
NotEmpty().WithMessage("Please specify last name");
RuleFor(customer => customer.Forename).
NotEmpty().WithMessage("Please specify a first name");
RuleFor(customer => customer.Address).
NotEmpty().WithMessage("Please specify an address");
Then a I create a partial class, and implement a partial method, that calls the validation rules when inserting into the FluentTest_Customer table:
using FluentValidation.Results;
using System.Collections.Generic;
public partial class FluentTestDALDataContext
partial void InsertFluentTest_Customer(FluentTest_Customer instance)
CustomerValidator validator = new CustomerValidator();
ValidationResult results = validator.Validate(instance);
List<string> ColErrors = new List<string>();
IList<ValidationFailure> failures = results.Errors;
foreach (var failure in results.Errors)
ColErrors.Add(String.Format(@"<p class='style1'>* {0}</p>",
throw new Exception(String.Join(" ", ColErrors.ToArray()));
// No errors - proceed with insert
this.ExecuteDynamicInsert(instance);
The last step is to add code, in the code behind of the .ascx control, to display any errors:
protected void ListView1_ItemInserted(object sender,
ListViewInsertedEventArgs e)
lblError.Text = e.Exception.Message;
e.ExceptionHandled = true;
Now I can test out the form:
The errors are displayed if the proper values are not entered.
Advanced Validation
I really would not need to implement a validation framework for such simple validation. Lets add two more rules to the validation class:
RuleFor(customer => customer.Address).
Matches(@"(?=.*\d)").WithMessage("Address must contain a number");
RuleFor(customer => customer.Discount).
Must(x => x.Length == 0).
When(y => y.Surname == "Washington").
WithMessage("Cannot give a discount to the Washington's");
Now when I enter the following:
It returns:
And if I enter:
It returns:
Using Linq for Validations
If you have not used Linq much, the attractiveness of this may be lost on you. Linq is extremely powerful, and once you get used to it, you generally want to use it for everything.
However, using a fluent validation library provides additional benefits:
Download Sample Code:
Requires: DotNetNuke 05.01.04 (or higher) / ASP.NET 3.5
http://www.adefwebserver.com/DotNetNukeHELP/Misc/Files/FluentTest_01.00.00_Install.zip