Twitter Feed Popout byInfofru

OverrideThis.com

Adventures in .NET Software Craftsmanship!

MVC Model Validation–Refactor (Part Deux)

This post enhances the functionality of the code in the Blog titled “MVC2 Validation and Testing” at the following link. 
http://blog.overridethis.com/blog/post/2010/04/22/MVC2-Model-Validation-and-Testing-Scenarios.aspx

 

A comment was made on one of my previous blogs requesting additional functionality for the extension method I wrote in April for testing controller action’s that rely on MVC2 Model Validation.  The request was simple, to be able to test class level validation attributes such as the ones found on the ChangePasswordModel in the default MVC2 project template.   Well, as requested!

 

public static class ControllerExtensions {

    public static ActionResult CallWithModelValidation<TController, TResult, TModel>(
            this TController controller, 
            Func<TController, TResult> action, 
            TModel model)
        where TController : Controller
        where TResult : ActionResult
        where TModel : class {

        var provider = new DataAnnotationsModelValidatorProvider();

        var metadata = new List<ModelMetadata>();
        metadata.Add(GetMetadataForClass(model));
        metadata.AddRange(GetMetadataForProperties(model));

        foreach (ModelMetadata modelMetadata in metadata) {
            ApplyValidatorsFromMetadata(model, provider, modelMetadata, controller);
        }        
        
        return action(controller);
    }

    private static ModelMetadata GetMetadataForClass<TModel>(TModel model) 
        where TModel : class {

        return ModelMetadataProviders
            .Current
            .GetMetadataForType(() => model, typeof (TModel));
    }

    private static IEnumerable<ModelMetadata> GetMetadataForProperties<TModel>(TModel model)
       where TModel : class {
        return ModelMetadataProviders
            .Current
            .GetMetadataForProperties(model, typeof(TModel));
    }

    private static void ApplyValidatorsFromMetadata<TModel, TController>(TModel model, 
        DataAnnotationsModelValidatorProvider provider, 
        ModelMetadata modelMetadata, 
        TController controller)
            where TController : Controller
            where TModel : class {
        
        IEnumerable<ModelValidator> validators = provider
            .GetValidators(modelMetadata, new ControllerContext());
            
        foreach (ModelValidator validator in validators) {
            IEnumerable<ModelValidationResult> results = validator.Validate(model);
            foreach (ModelValidationResult result in results)
                controller.ModelState.AddModelError(
                    modelMetadata.PropertyName ?? "Model", 
                    result.Message);
        }
    }
}

MVC Extensibility–CMAP Code Camp

downloadThe following is the download link for the demo code and slides for my presentation on MVC Extensibility done at the Central Maryland Association of .NET Professionals Code Camp (CMAP Code Camp).  Thanks to all who attended my presentation, it was extremely fun plowing through a ton of code all across the stack of the ASP.NET MVC Framework request execution lifecycle.

 

Download Demo Code & Slides

 

Also, big thanks to Christopher Steen and Randy Hayes for hosting and allowing me to participate as a speaker in such a wonderful event.

Code and Slides on “Intro to NHibernate 3.0 Alpha”

As promised, and in record time, the code and slides for my presentation on NHibernate 3.0 Alpha are now available for download.  As usual, I would like to express my thanks to Justin Etheredge and Kevin Hazzard for hosting and allowing me to present at Richmond Code Camp 2010.2 (http://www.richmondcodecamp.org).

The following are links to the materials used in the presentation.

Download Slides & Demo Code

Happy coding in .NET!!!

image      Richmond Code Camp

Microsoft C# MVP 2010 – Thank You!

I got an email yesterday congratulating and welcoming me as a Microsoft C# MVP for 2010.  I tweeted about it but had a hard time coming up with words (140 chars) that expressed my gratitude towards the Virginia, Maryland, and DC developer community. This award would not have happened without their support. 

 

I moved to the region in late 2007 and I was saddened to leave behind a lot of the communities that I  had helped to build in Puerto Rico and the Dominican Republic. But, I was excited and impressed with the large number of developer communities that thrive in the region and the quality and professionalism of the leaders that run these communities.  As a developer and active participant of many of these developer communities I encourage you to exploit these invaluable resources of knowledge and growth.

 

A special thanks to,

Washington, DC -  District Of Columbia Developer’s Community (DCDNUG)

Maryland – Central Maryland Association of .NET Professionals (CMAP)

Maryland – Rockville .NET User’s Group (ROCKNUG)

Virginia – Capital Area .NET User’s Group (CAPAREA)

Virginia – ALT.NET DC Chapter (ALTNETDC)

Virginia – Richmond Code Camp (RichCC)

Code and Slides on “Intro to Dependency Injection”

I hIIS Express, Razor, and WebMatrix, oh my! ad the opportunity to participate as the speaker at the Washington DC Dot Net User’s group and really enjoyed presenting an “Introduction to Dependency Injection”. I would like to thank Ganesan Muthiah, the leader of DCDNUG community, for inviting me and also for hosting and managing this fast growing new .NET developer community. 

 

The following are links to the materials used in the presentation.

 

Download Slides & Demo Code

 

Happy coding in .NET!!!