Sunday, March 14, 2010    
Blog  
OpenLight Blog
Nov 14

Written by: Michael Washington
11/14/2009 2:40 PM 

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

Tags:

Your name:
Your email:
(Optional) Email used only to show Gravatar.
Your website:
Title:
Comment:
Add Comment   Cancel 
  
Copyright 2009 by OpenLightGroup.net   |  Privacy Statement  |  Terms Of Use