DNN Blog

Nov 14

Posted by: Michael Washington
11/14/2009  RssIcon

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:
Categories:

1 comment(s) so far...


Gravatar

Re: DotNetNuke and Fluent Validation

Using class makes the coding easier by far. Linq is powerful as well as easy to use once you get a feel of it.

By drop ship reviews on   11/16/2009
Attend A Webinar
Try An Online Demo
Download DotNetNuke Professional Edition Trial
Have Someone Contact Me

Like Us on Facebook Join our Network on LinkedIn Follow DNN Corporate on Twitter Follow DNN on Twitter

Advertisers

Sponsors

DotNetNuke Corporation

DotNetNuke Corp. is the steward of the DotNetNuke open source project, the most widely adopted Web Content Management Platform for building web sites and web applications on Microsoft .NET. Organizations use DotNetNuke to quickly develop and deploy interactive and dynamic web sites, intranets, extranets and web applications. The DotNetNuke platform is available in a free Community and subscription-based Professional and Enterprise Editions with an Elite Support option. DotNetNuke Corp. also operates Snowcovered.com where users purchase third party apps for the platform.