diff -r fdc2ddd7854a pylons/controllers/decorated.py
--- a/pylons/controllers/decorated.py	Wed Mar 05 15:11:42 2008 -0800
+++ b/pylons/controllers/decorated.py	Thu Mar 06 17:15:02 2008 -0700
@@ -25,23 +25,34 @@ class DecoratedController(WSGIController
             return params
         
         new_params = None
+        errors = {}
         if isinstance(validation.validators, dict):
-            errors = {}
-            #new_params = {}
             for field, validator in validation.validators.iteritems():
                 try:
                     new_params[field] = validator.to_python(params.get(field))
                 except formencode.api.Invalid, inv:
                     errors[field] = inv
-
-            if errors:
-                raise formencode.api.Invalid(
-                    formencode.schema.format_compound_error(errors),
-                    params, None, error_dict=errors)
         elif isinstance(validation.validators, formencode.Schema):
             new_params = validation.validators.to_python(params)
         elif hasattr(validation.validators, 'validate'):
-            new_params = validation.validators.validate(params)
+            #the object validates itself
+            try:
+                new_params = validation.validators.validate(params)
+            except  formencode.api.Invalid, inv:
+                error_list = inv.__str__().split('\n')
+                #most invalids come back with a list of fields which are in error in the format: "fieldname1: error\nfieldname2: error"
+                for error in error_list:
+                    field_value = error.split(':')
+                    #if the error has no field associated with it, return the error as a global form error
+                    if len(field_value) == 1:
+                        errors['_the_form'] = field_value[0].strip()
+                        continue
+                    errors[field_value[0]] = field_value[1].strip()
+
+        if errors:
+            raise formencode.api.Invalid(
+                formencode.schema.format_compound_error(errors),
+                params, None, error_dict=errors)
 
         if new_params is None:
             return params
