Products

Solutions

Resources

Partners

Community

About

New Community Website

Ordinarily, you'd be at the right spot, but we've recently launched a brand new community website... For the community, by the community.

Yay... Take Me to the Community!

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

 

image

First I create a table.

image

Next, I create a Linq to SQL Class.

image

Then I create a .ascx control and place a LinqDataSource control on the page and configure it to point to the FluentTest_Customer table.

image

I drop a ListView control on the page and configure it to point to the LinqDataSource control and then click Configure ListView

image

The wizard allows me to quickly configure the ListView.

image

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 : 
        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 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>",
                        failure.ErrorMessage));
                }
                
                throw new Exception(String.Join(" ", ColErrors.ToArray()));
            }
            else
            {
                // 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)
{
    if (e.Exception != null)
    {
        lblError.Text = e.Exception.Message;
        e.ExceptionHandled = true;
    }
}

Now I can test out the form:

image

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:

image

It returns:

image

And if I enter:

image

It returns:

image

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

http://www.adefwebserver.com/DotNetNukeHELP/Misc/Files/FluentTest_01.00.00_Install.zip

Comments

Comment Form

Only registered users may post comments.

NewsArchives


Aderson Oliveira (22)
Alec Whittington (11)
Alessandra Daniels (3)
Alex Shirley (10)
Andrew Hoefling (3)
Andrew Nurse (30)
Andy Tryba (1)
Anthony Glenwright (5)
Antonio Chagoury (28)
Ash Prasad (37)
Ben Schmidt (1)
Benjamin Hermann (25)
Benoit Sarton (9)
Beth Firebaugh (12)
Bill Walker (36)
Bob Kruger (5)
Bogdan Litescu (1)
Brian Dukes (2)
Brice Snow (1)
Bruce Chapman (20)
Bryan Andrews (1)
cathal connolly (55)
Charles Nurse (163)
Chris Hammond (213)
Chris Paterra (55)
Clint Patterson (108)
Cuong Dang (21)
Daniel Bartholomew (2)
Daniel Mettler (181)
Daniel Valadas (48)
Dave Buckner (2)
David Poindexter (12)
David Rodriguez (3)
Dennis Shiao (1)
Doug Howell (11)
Erik van Ballegoij (30)
Ernst Peter Tamminga (80)
Francisco Perez Andres (17)
Geoff Barlow (12)
George Alatrash (12)
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 (274)
John Mitchell (1)
Jon Henning (14)
Jonathan Sheely (4)
Jordan Coopersmith (1)
Joseph Craig (2)
Kan Ma (1)
Keivan Beigi (3)
Kelly Ford (4)
Ken Grierson (10)
Kevin Schreiner (6)
Leigh Pointer (31)
Lorraine Young (60)
Malik Khan (1)
Matt Rutledge (2)
Matthias Schlomann (16)
Mauricio Márquez (5)
Michael Doxsey (7)
Michael Tobisch (3)
Michael Washington (202)
Miguel Gatmaytan (3)
Mike Horton (19)
Mitchel Sellers (40)
Nathan Rover (3)
Navin V Nagiah (14)
Néstor Sánchez (31)
Nik Kalyani (14)
Oliver Hine (1)
Patricio F. Salinas (1)
Patrick Ryan (1)
Peter Donker (54)
Philip Beadle (135)
Philipp Becker (4)
Richard Dumas (22)
Robert J Collins (5)
Roger Selwyn (8)
Ruben Lopez (1)
Ryan Martinez (1)
Sacha Trauwaen (1)
Salar Golestanian (4)
Sanjay Mehrotra (9)
Scott McCulloch (1)
Scott Schlesier (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)
Steven Fisher (1)
Tony Henrich (3)
Torsten Weggen (3)
Tycho de Waard (4)
Vicenç Masanas (27)
Vincent Nguyen (3)
Vitaly Kozadayev (6)
Will Morgenweck (40)
Will Strohl (180)
William Severance (5)
What is Liquid Content?
Find Out
What is Liquid Content?
Find Out
What is Liquid Content?
Find Out