¿Cómo hacer que todas las cadenas en todos los ViewModel en un proyecto en MVC .Net se les aplique Trim o ToUpper? DefaultModelBinder

Cuando se trabaja en un equipo de desarrollo que sobre pasa los 3 programadores muchas veces se debe obligar a que se realicen tareas básicas como recortar los espacios en las cadenas por medio de Trim, o quizá si existe un requerimiento del cliente de que todas las cadenas estén en mayúsculas realizar un ToUpper o por lo contrario un ToLower, bueno, cualquier función sobre algún tipo de dato en todos nuestros modelos de nuestra aplicación.

Para asegurarnos de que siempre sean ejecutadas este tipo de operaciones existe en MVC .Net algo llamado Binder o ModelBinder el cual trabaja como cubierta de la información y puede transformarla a lo que deseemos, validar o realizar una operación.

A continuación incluyo una clase la cual hará que todas las cadenas que existan en nuestros View Model se les aplique una función Trim y una función ToUpper, así evitamos ponerlas en todos los controles, haciendo que esto ya sea un proceso por defecto en toda la aplicación.


namespace Sistema.Models.Binders
{
    public class TrimToUpperBinder : DefaultModelBinder
    {

        protected override void SetProperty(ControllerContext controllerContext,
         ModelBindingContext bindingContext,
         System.ComponentModel.PropertyDescriptor propertyDescriptor, object value)
        {
             //Solo modificaremos los string, por lo cual detectamos el tipo de dato
            if (propertyDescriptor.PropertyType == typeof(string))
            {
                var stringValue = (string)value;
                if (!string.IsNullOrEmpty(stringValue))
                {
                    stringValue = stringValue.Trim(); //trimeamos
                    stringValue = stringValue.ToUpper(); //mayuscula
                }

                value = stringValue;
            }

            base.SetProperty(controllerContext, bindingContext,
                                propertyDescriptor, value);
        }
    }
}

Y para que sea ejecutado en toda la aplicación debemos inicializar nuestra clase en el archivo Global.asax en el método Application_Start() de la siguiente manera:


 protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            //Aquí remplazamos el binder por defecto con el nuestro
            ModelBinders.Binders.DefaultBinder = new Sistema.Models.Binders.TrimToUpperBinder();
        }

Autor: Héctor de León

Desarrollador de software, lector compulsivo.