Archive for the ‘.net’ Category.

ASP.Net MVC, Fluent Validation and testing

I am finally coming to the end of a project, and I thought it would be good to write a little post on how we have managed to set up our fluent validation for our MVC project. In the start we did some research into how to go about performing validation, and found a number of recommendations. But all involved using data annotations. In this post, I will show you how I set up fluent validation, to work smoothly with my MVC 2 project. I create a custom model binder to validate view models and show how to validate a registration using fluent validation. Finally I show how to unit test the validation rules I needed for registration.

To start with, there are some problems I have with data annotations

1 – Too many annotations make your model s look ugly. Take this example .

public class Product {

      public int Id { get ; set ; }


      [Required]
      [StringLength(10)]
      public string Name { get; set; }

      [Required]
      public string Description { get; set; }

      [DisplayName("Price")]
      [Required]
      [RegularExpression(@"^\$?\d+(\.(\d{2}))?$")]
      public decimal UnitPrice { get; set; }
     }

Now wouldn’t it be nice to have your model/entity just look like this.

public class Product
{
      public int Id { get; set; }
      public string Name { get; set; }
      public string Description { get; set; }
      public decimal UnitPrice { get;set; }
}

2 – Complex data validation with attributes makes your code get even more ugly. Take a lot at this example showing how to achieve slightly more complexity with data annotations. Now trying to reuse and share attributes seem to make things more and more complex….

3- I think there may be a performance issue, as we need to extract the validation attributes using reflection. Now, while these are simple models, with simple validation rules, we may not notice the performance degrading, but I am sure that with numerous complex attributes, things might run a little slow. (I need to prove this though – maybe when I get time, I will write some tests – I could be wrong here, things might change in MVC 3)

So after looking at some examples, such as xVal –dead now, Entity validation with visitors and extension methods these all did the job, but I would need to write lots of helpers, what I needed was some kind of framework for validation. Then I found fluent validation.

Linking MVC with Fluent Validation

So let us look at how we set our MVC project . Firstly, I want to automate the validation, so that any errors are automically added to the models state. With some help from Jeremy I set up an customised BindAndValidate attribute. Here is a simplified attribute we started with.

    1     public class BindAndValidateAttribute : CustomModelBinderAttributeIModelBinder {

    2         AttributedValidatorFactory validatorFactory = new AttributedValidatorFactory();

    3 

    4         public override IModelBinder GetBinder() {

    5             return this;

    6         }

    7 

    8         public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {

    9 

   10             var innerBinder = new DefaultModelBinder();

   11             var boundInstance = innerBinder.BindModel(controllerContext, bindingContext);

   12             if (boundInstance != null)

   13                 ValidateInstance(boundInstance, bindingContext);

   14 

   15             return boundInstance;

   16         }

   17 

   18         void ValidateInstance(object instance, ModelBindingContext context) {

   19             var validator = validatorFactory.GetValidator(context.ModelType);

   20             if (validator != null)

   21             {

   22                 var result = validator.Validate(instance);

   23                 result.AddToModelState(context.ModelState, "");

   24             }

   25         }

   26     }

Now all I need to do is hook this up with my controller method. In the Sign in method, I add the attribute [BindAndValidatiate] and all I need to do is check that the model state is valid. If so, I perform the log in.

    1     public class AccountController : BaseController {

    2         public ActionResult Signin() {

    3             return View();

    4         }

    5 

    6         [HttpPost]

    7         public ActionResult Signin([BindAndValidate] ChangeEmailModel model) {

    8 

    9             if (ModelState.IsValid)

   10                 PerformSignIn();

   11 

   12             return View();

   13         }

   14     }

Linking MVC View Models with Fluent Validation

Lets look at how all this works. What we need to do is create out model, then create our validator. We then hook our validator to our model by adding the validator atrribute to our model. I am using a simple Register View Model here as an example.

    1     [Validator(typeof(RegisterViewModelValidator))]

    2     public class RegisterViewModel

    3     {

    4         public string Email { get; set; }

    5         public string Password { get; set; }

    6         public string ConfirmPassword { get; set; }

    7     }

Now for the model validator. Here we have some simple rules. The password must not be empty, and it must also be a good password. The password confirmation must be the same as the password, and finally the Email must be a valid email address, and also not already exisit in our site.

    1     public class RegisterViewModelValidator : AbstractValidator<RegisterViewModel> {

    2         public RegisterViewModelValidator() {

    3             RuleFor(reg => reg.Password)

    4                     .NotEmpty()

    5                     .WithMessage("Please provide a password")

    6                     .Must(BeGoodPassword)

    7                     .WithMessage("Password must be at least 8 characters long, and contain numbers and letters");

    8 

    9             RuleFor(reg => reg.ConfirmPassword)

   10                     .Equal(reg => reg.Password)

   11                     .WithMessage("Passwords do not match");

   12 

   13             RuleFor(reg => reg.Email)

   14                    .EmailAddress()

   15                    .WithMessage("Invalid Email")

   16                    .Must(BeUniqueEmail)

   17                    .WithMessage("Account already Registered");

   18         }

   19 

   20         public bool BeGoodPassword(string password) {

   21             Regex regex = new Regex(@"^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$");

   22             return regex.IsMatch(password);

   23         }

   24 

   25         public bool BeUniqueEmail(string email) {

   26             int count = Repository.GetInstance().CountOccurrencesOfEmail(email);

   27             return (count == 0);

   28         }

   29     }

Test your validation

Now, finally for the testing, whcih is really useful, when I want to make sure that things work 100%! To keep it simepl, I am just going to test the password rule, because testing the email requires a lot more of an explination. So working from some simple examples Here: I have written three tests. Thfirst is to make sure that the password can not be null. The second is to catch a week password. The third makes sure that a strong password does not cause an error.

    1         [Test]

    2         public void Should_have_error_when_Password_is_null() {

    3             validator.ShouldHaveValidationErrorFor(reg => reg.Password, null as string);

    4         }

    5 

    6         [Test]

    7         public void Should_have_error_when_Password_is_weak() {

    8             validator.ShouldHaveValidationErrorFor(reg => reg.Password, "weakpass");

    9         }

   10 

   11         [Test]

   12         public void Should_not_have_error_when_Password_is_strong() {

   13             Validator.ShouldNotHaveValidationErrorFor(reg => reg.Password, "SecretPassword123");

   14         }

And that is it! There is quite a lot you can achieve with fluent validation, such as reusing validators on complex properties and also some useful conditions like when or unless! The reasons I like this are that it uses generics to help build clean code. There is now no need to attributes on every property I have. Also, Jeremy was also very quick to help with any questions I had. Thanks for the help Jeremy.

Nhibernate returns duplicate results on paged data sets – work around

Recently, while implementing a page-able data grid with nHibernate and MVC Contrib Grid, I came across a strange problem. My result set had duplicates, and the strange thing was that it would only happen when paging my record set. Anyway, I thought I would write a little post about how I solved the problem, just in case someone else comes across it.

Firstly, lets look at simplified description of the problem. Those using MySQL have the luxury of limit, which makes paging data sets a breeze, but in SQL Server(and Oracle) things get a bit more “tricky”. The trick is to count the rows on the result set, using RowCount over something, and mix that in with a sub query, but there is a problem with nHibernate T-SQL 2005 Dialect. The RowCount was being used on the sub-query, and not the parent query. Now that I had discovered the problem.

“ROW_NUMBER() OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row” is in the wrong place!

After some research, I found that other people were having this problem too. Marcin Daczkowski has an excellent work-around, that he blogged about, he also describes the problem with some NH generated SQL examples, I won’t repeat myself here, so have a look at his post if you are not sure and check his bug report here.

I found a another solution here too- not sure this one works though, ultimately I had to come up with a solution that suited my project.

There are some reasons why I can’t use Marcin Daczkowski solution.

– Firstly, it does not look like the guys at nHibernate be able to release the patched version of nHibernate any time soon,I guess they are very busy working hard on version 3.0! Can’t wait for that realease! see the comments here.

– Secondly, if I build my own version of nHibernate, I will need to also rebuild all my dependencies, linking them with Marcins patched version. That means FluentNHibernate needs to be rebuilt, NHibernate.Caches.SysCache needs to be rebuilt, NHibernate.ByteCode.Castle needs to be rebuilt, you get the picture?

So after some thought and source code investigation, I came up with the idea of making a customised Dialect, and just use Darcins patched files. Now, I don’t need to build a patched version of my all my open source dependencies, as I have my own SQL dialect set up in the fluent configuration.


_sessionFactory = Fluently.Configure()
      .Database(MsSqlConfiguration
      .MsSql2008
      .ConnectionString(connectionString)
      .CurrentSessionContext("web")
      .Dialect(CustomSQL2008Dialect)
)

My Dialect classes are set up like this:


public class CustomSQL2008Dialect: CustomSQL2005Dialect {
      public GWMsSql2008Dialect () {
            // Duplicate of the contents of MsSsql2008Dialect constructor goes here
      }
}

public class CustomSQL2005Dialect: MsSql2000Dialect {
      // the contents Darcins MsSql2005Dialect file goes here.
      // MsSql2005Dialect at NHibernate JIRA

}

Luckily, I have unit tests set up for all my repository methods, and after seeing the green bar in NUnit, I was more than satisfied with the custom dialect. I hope the guys at NHibernate manage to get things working in their next release, keep up the good work guys! And a special thanks to
to Darcin, for writing the patch.

Here is a copy the Custom Sql 2008 Dialect.

Role Based Access Control in ASP.Net MVC

Currently I am looking at access control systems, and how best to integrate them with ASP.Net MVC framework. While this framework already provides support for role based access control (RBAC), using the membership classes. I need to implement this on a legacy database, and some how integrate the old system with asp.net forms authentication. This post is about how I realised this, and acts a potential solution. If you can think of a better way, of find any devastating flaws, let me know. ;-)

The scenario is simple, we have four roles defined for the system. They are Students, Graduates, Staff and Administrators. Some staff can be graduates, (or even Students). Administrators are, of course staff! So how you model this? We already know of one bitwise trick from Michal’s post, so let us see how we can use bitwise operations to make this a reality!

First let us revise the results of the bitwise AND operations. You can check Wikipedia for full details.

1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
1 & 1 = 1

Converting these back to decimal 1001 is 9 and 0101 is 5. So 9 & 5 = 8. If we convert each of these bits to represent a role in our system, we can come up with a table like this.

Bit 1 0 (false) Student
Bit 2 0 (false) Graduate
Bit 3 0 (false) Staff
Bit 4 1 (true) Admin

So a user of the system with a role number of 8 is an Admin, but in our case, an Admin is also a member of staff, and in fact, a member of staff could also be a student or a graduate. This is where using bitwise operations can really help model such a situation. To get it working, a staff member who is a student will have bits 1 and 3 set to true, while a graduate who is also a staff member will have bits 2 and 3 set to true. We can represent these roles in decimal as User(Staff & Graduate) = 6, while User (Staff & Student) = 5. Get the picture?

Let’s look at a simple real world example. First we have a User class, with a Role property of the type int. The reason we use an integer, is that is can be easily stored in the database.

    1     public class User {

    2 

    3         public string Name { get; set; }

    4         public int Role { get; set; }

    5         public bool IsInRole(Role role) {

    6             //todo

    7             return false;

    8         }

    9     }

We also need to create an enumeration, with a Flags attribute. The flags attribute tells the compiler that this enumeration can be treated as a bit field. We then define a value for each role. The reason for using exponents of 2 should become clearer later.

    1     [Flags]

    2     public enum Role {

    3         Student = 1,    // 0001

    4         Employer = 2,   // 0010

    5         Staff = 4,      // 0100

    6         Admin = 8       // 1000

    7     }

The menu of our website needs to be generated depending on the user role. The menu selection code below should generate the correct menu depending on the user role.

    1     <div class="LeftMenu"> 

    2 

    3         <% if (user.IsInRole(Role.Student)) %>

    4             <% Html.RenderPartial("StudentMenu"); %>

    5 

    6         <% if (user.IsInRole(Role.Graduate)) %>

    7             <% Html.RenderPartial("GraduateMenu"); %>

    8 

    9         <% if (user.IsInRole(Role.Staff)) %>

   10             <% Html.RenderPartial("StaffMenu"); %>

   11 

   12         <% if (user.IsInRole(Role.Admin)) %>

   13             <% Html.RenderPartial("AdminMenu"); %>

   14 

   15     </div>

Ok, so let see where the magic happens! If we AND (&) the user assigned role, with the role required, and we compare this result to the role required, we can determine if a user is in the role. Summarised, the end result of the AND operation needs to equal that of the role required. In user class we have the method:

    1         public bool IsInRole(Role role) {

    2             Role userRole = (Role)this.Role;

    3             return ((userRole & role) == role);

    4         }

Looking at some binary examples, we can see how it works. In the first example, an admin user wants accesses a graduate item.

Role Required Staff(4) 0 1 0 0
User Role Admin (8) 1 0 0 0
Result of & Access Denied (0) 0 0 0 0


It is clear that we have a problem here, because we said that admin could be both staff, and staff may also be graduates. What we need to do is add up the roles, so that this user will access both admin and staff content. Assigning the user the role of Admin and Staff is easy. All we do is:

    1             User user = new User();

    2             user.Role = (int)Role.Staff;

    3             user.Role += (int) Role.Admin;

And the resulting table is:

Role Required Staff(4) 0 1 0 0
User Role Admin + Staff (12) 1 1 0 0
Result of & Access Granted (4) 0 1 0 0

Now we can easily draw our menu depending on the roles assigned to a user. Adding or removing roles for a user is also easy, just add it or subtract it. I wrote a little project to go with this so you can test it our your self. Thanks to Michi for introducing this, and Dan for helping work it out!

Download the Roles sample project You’ll need to use nUnit to test it.

picnik comes with a free-to-use image editing API for your website

picnic.gif Ever heard from Picnik? It allows you editing your images direclty within your browser. Forget Adobe Photoshop :) Picnik has been around for a while now but recently it started to offer its service for the public. for free! I played around a bit and must say that it is amazing .. Use it within PHP, classic ASP, .net, Ruby on Rails or whatever… especially i like the idea of the whole service which works like this…

  1. Send your images to their service (existing image via URL or encoded as multi-part)
  2. Then the user modifies the picture (size, colors, rotation, special effects…)
  3. Picnik sends you the picture back to your server (either an URL where you can download it or directly as multi-part image)

Here comes an example I have built for demonstration… Continue reading ‘picnik comes with a free-to-use image editing API for your website’ »

C# tips, tricks and things you should know

.net components During my previous holidays (i have to admit 1.5 months surfing in portugal) I had some literature with me which also included the book Programming .net components released with O’Reilly. It talks about the aspects of components in general and provides good examples how to achieve those in .net. Although these pages are a very good read (rather for experienced devs) for ppl interested in component development, I found it more interesting because of its general C# content. There are concepts & approaches, small tips & tricks and intersting things about C# which can be used not only in component based architectures and are therefore good to know anyway.

As I always make notes while reading “geek” books I thought: “so why not summarize them all up in a nice list and blog’em”. Here we go… Continue reading ‘C# tips, tricks and things you should know’ »

8 Reasons to Stick with ASP 3.0 in 2006 (and 2007)

Today I was browsing through the microsoft.­public.­inetserver.­asp.­general newsgroup and found a nice article linked within a topic where people are talking about classic ASP and its brother .net. The article outlines 8 reasons to stick with the good old classic ASP … Unfortunately I cannot really figure out when the article was written but i think it must be quite recent because they bring up VS2005 and web 2.0.

As I have done already some projects with .net I love this statement (refers to web-projects):

Sluggish is a word to describe the whole of the .NET development environment. Starting a new project? Go make a cup of coffee. Switching between tabs? ‘Go large’ with your coffee. Pressing F1 for help? Make your coffee a take-out and go and have a stroll in the park.

http://www.packtpub.com/article/Classic-ASP