Tengo un montón de formularios donde se ingresan los valores de moneda y quiero que puedan ingresar "$ 1,234.56". Por defecto, los archivadores modelo no analizarán eso en un decimal.Cómo filtrar datos con el clasificador de modelo personalizado
Lo que estoy pensando hacer es crear un encuadernador de modelo personalizado hereda DefaultModelBinder, anula el método BindProperty, comprueba si el tipo de descriptor de propiedad es decimal y si lo está, simplemente quita $ y, de los valores.
¿Es este el mejor enfoque?
Código:
public class CustomModelBinder : DefaultModelBinder
{
protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor)
{
if(propertyDescriptor.PropertyType == typeof(decimal) || propertyDescriptor.PropertyType == typeof(decimal?))
{
var newValue = Regex.Replace(bindingContext.ValueProvider[propertyDescriptor.Name].AttemptedValue, @"[$,]", "", RegexOptions.Compiled);
bindingContext.ValueProvider[propertyDescriptor.Name] = new ValueProviderResult(newValue, newValue, bindingContext.ValueProvider[propertyDescriptor.Name].Culture);
}
base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
}
}
actualización
Esto es lo que terminé haciendo:
public class CustomModelBinder : DataAnnotationsModelBinder
{
protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor)
{
if(propertyDescriptor.PropertyType == typeof(decimal) || propertyDescriptor.PropertyType == typeof(decimal?))
{
decimal newValue;
decimal.TryParse(bindingContext.ValueProvider[propertyDescriptor.Name].AttemptedValue, NumberStyles.Currency, null, out newValue);
bindingContext.ValueProvider[propertyDescriptor.Name] = new ValueProviderResult(newValue, newValue.ToString(), bindingContext.ValueProvider[propertyDescriptor.Name].Culture);
}
base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
}
}
echar un vistazo a este post de Haacked: http://haacked.com/archive/2011/03/ 19/fixing-binding-to-decimales.aspx – VinnyG