Ho un mucchio di moduli in cui sono inseriti i valori di valuta e voglio che siano in grado di inserire "$ 1,234.56". Per impostazione predefinita, i raccoglitori di modelli non li analizzeranno in un decimale.Come filtrare i dati del modulo con il raccoglitore modello personalizzato
Quello che sto pensando di fare è creare un raccoglitore modello personalizzato che erediti DefaultModelBinder, sovrascrivi il metodo BindProperty, controlla se il tipo di descrittore di proprietà è decimale e, in caso affermativo, basta estrarre $ e, dai valori.
È questo l'approccio migliore?
Codice:
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);
}
}
Aggiornamento
Questo è quello che ho finito per fare:
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);
}
}
un'occhiata a questo post da Haacked: http://haacked.com/archive/2011/03/ 19/fixing-binding-to-decimals.aspx – VinnyG