Ich habe eine Reihe von Formularen, in denen Währungswerte eingegeben werden und ich möchte, dass sie "$ 1,234.56" eingeben können. Standardmäßig werden die Modellbinder das nicht in eine Dezimalzahl parsen.So filtern Sie Formulardaten mit benutzerdefinierten Modellbinder
Was ich vorhabe, ist die Erstellung eines benutzerdefinierten Modellbinders, der DefaultModelBinder erbt, die BindProperty-Methode überschreibt, prüft, ob der Eigenschaftsdeskriptortyp dezimal ist, und wenn dies der Fall ist, streichen Sie einfach die $ und die Werte aus.
Ist dies der beste Ansatz?
Code:
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);
}
}
aktualisieren
Dies ist, was ich tun endete:
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);
}
}
in diesem Beitrag von Haacked einen Blick: http://haacked.com/archive/2011/03/ 19/Fixing-Bindung-zu-Dezimalen.aspx – VinnyG