Learn More





DNN Community Blog

The Community Blog is a personal opinion of community members and by no means the official standpoint of DNN Corp or DNN Platform. This is a place to express personal thoughts about DNNPlatform, the community and its ecosystem. Do you have useful information that you would like to share with the DNN Community in a featured article or blog? If so, please contact .

The use of the Community Blog is covered by our Community Blog Guidelines - please read before commenting or posting.

DotNetNuke and Fluent Validation

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:

using FluentValidation;
namespace FluentTest
    public class CustomerValidator : 
        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 System;
using FluentValidation.Results;
using System.Collections.Generic;
namespace FluentTest
    public partial class FluentTestDALDataContext
        partial void InsertFluentTest_Customer(FluentTest_Customer instance)
            CustomerValidator validator = new CustomerValidator();
            ValidationResult results = validator.Validate(instance);
            if (!results.IsValid)
                // There was an error
                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

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)
    if (e.Exception != null)
        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:

  • The validation rules are easy to read
  • They can be stored in one place so they are easy to find


Download Sample Code:

Requires: DotNetNuke 05.01.04 (or higher) / ASP.NET 3.5


Comment Form

Only registered users may post comments.


2sic Daniel Mettler (124)
Aderson Oliveira (15)
Alec Whittington (11)
Alex Shirley (10)
Andrew Nurse (30)
Anthony Glenwright (5)
Antonio Chagoury (28)
Ash Prasad (21)
Ben Schmidt (1)
Benjamin Hermann (25)
Benoit Sarton (9)
Beth Firebaugh (12)
Bill Walker (36)
Bob Kruger (5)
Brian Dukes (2)
Brice Snow (1)
Bruce Chapman (20)
Bryan Andrews (1)
cathal connolly (55)
Charles Nurse (163)
Chris Hammond (203)
Chris Paterra (55)
Clinton Patterson (28)
Cuong Dang (21)
Daniel Bartholomew (2)
Dave Buckner (2)
David Poindexter (3)
David Rodriguez (2)
Doug Howell (11)
Erik van Ballegoij (30)
Ernst Peter Tamminga (74)
Geoff Barlow (6)
Gifford Watkins (3)
Gilles Le Pigocher (3)
Ian Robinson (7)
Israel Martinez (17)
Jan Blomquist (2)
Jan Jonas (3)
Jaspreet Bhatia (1)
Jenni Merrifield (6)
Joe Brinkman (269)
John Mitchell (1)
Jon Henning (14)
Jonathan Sheely (4)
Jordan Coopersmith (1)
Joseph Craig (2)
Kan Ma (1)
Keivan Beigi (3)
Ken Grierson (10)
Kevin Schreiner (6)
Leigh Pointer (31)
Lorraine Young (60)
Malik Khan (1)
Matthias Schlomann (15)
Mauricio Márquez (5)
Michael Doxsey (7)
Michael Tobisch (3)
Michael Washington (202)
Mike Horton (19)
Mitchel Sellers (28)
Nathan Rover (3)
Navin V Nagiah (14)
Néstor Sánchez (31)
Nik Kalyani (14)
Peter Donker (52)
Philip Beadle (135)
Philipp Becker (4)
Richard Dumas (22)
Robert J Collins (5)
Roger Selwyn (8)
Ruben Lopez (1)
Ryan Martinez (1)
Salar Golestanian (4)
Sanjay Mehrotra (9)
Scott McCulloch (1)
Scott S (11)
Scott Wilkinson (3)
Scott Willhite (97)
Sebastian Leupold (80)
Shaun Walker (237)
Shawn Mehaffie (17)
Stefan Cullmann (12)
Stefan Kamphuis (12)
Steve Fabian (31)
Timo Breumelhof (24)
Tony Henrich (3)
Torsten Weggen (2)
Vicenç Masanas (27)
Vincent Nguyen (3)
Vitaly Kozadayev (6)
Will Morgenweck (37)
Will Strohl (163)
William Severance (5)
Try Evoq
For Free
Start Free Trial
a Demo
See Evoq Live
Need More Information?