How many times did you write a code like this:

Workflow is usually this: 

  • Try to validate user input

    • If error, return same view with error messages

  • Invoke business logic, map data to persistence model

  • Try to save data

    • If error, log to db, return view with user-readable error message (this is generic approach, true, in real app we would probably try to check what kind of error was returned and then do something specific)

  • Redirect somewhere (we are in Post-Redirect-Get loop)

To avoid of repetition of some steps there we can decorate Save actions with our special attribute!

Here's the whole filter, with all the code comments which hopefully explains how it works.

Usage is simple, just decorate your POST action with [ValidateModel] attribute, and then you can remove if(!ModelState.IsValid) checks, and also exception catch if there's any.