I have Amount
stored in the database as decimal
. I want to show that value on UI with thousand separator. I can add [DisplayFormat(DataFormatString = "{0:N2}", ApplyFormatInEditMode = true)]
attribute on amount property and that would display number with thousand separator however when i POST the value back to server, the MVC model binding would not work because of commas.
I have created a custom type converter that converts from decimal
to string
and then string
to decimal
public class NumberConverter : TypeConverter
{
public override bool CanConvertFrom(
ITypeDescriptorContext context,
Type sourceType)
{
if (sourceType == typeof(decimal))
{
return true;
}
return base.CanConvertFrom(context, sourceType);
}
public override object ConvertFrom(ITypeDescriptorContext context,
CultureInfo culture, object value)
{
if (value is decimal)
{
return string.Format("{0:N2}", value);
}
return base.ConvertFrom(context, culture, value);
}
public override bool CanConvertTo(ITypeDescriptorContext context,
Type destinationType)
{
if (destinationType == typeof(decimal))
{
return true;
}
return base.CanConvertTo(context, destinationType);
}
public override object ConvertTo(ITypeDescriptorContext context,
CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(decimal) && value is string)
{
return Scrub(value.ToString());
}
return base.ConvertTo(context, culture, value, destinationType);
}
private decimal Scrub(string modelValue)
{
NumberStyles _currencyStyle = NumberStyles.Currency;
CultureInfo _culture = new CultureInfo("en-US");
var modelDecimal = 0M;
decimal.TryParse(
modelValue,
_currencyStyle,
_culture,
out modelDecimal
);
return modelDecimal;
}
}
and then i applied it on one of the model property. Note that model may have other decimal properties which may not required this conversion.
public class MyModel
{
[TypeConverter(typeof(NumberConverter))]
[Display(Name = "Enter Amount")]
public decimal Amount { get; set;}
public string Name { get; set; }
}
Index.cshtml
<form asp-action="submit" asp-controller="home">
@Html.EditorFor(m => m.Amount)
<button type="submit" class="btn btn-primary">Save</button>
</form>
However the converter code never gets fired. When i put break point in NumberConverter
none of the break point hit. Do i need to register type converter anywhere? I am using asp.net core.
CanConvertTo(Type) Returns whether this converter can convert the object to the specified type. ConvertFrom(ITypeDescriptorContext, CultureInfo, Object) Converts the given object to the type of this converter, using the specified context and culture information. ConvertFrom(Object)
Type converters let you convert one type to another type. Each type that you declare can optionally have a TypeConverter associated with it using the TypeConverterAttribute. If you do not specify one the class will inherit a TypeConverter from its base class.
Based on my observations asp.net core
doesn't take into account properties decorated by TypeConverters
.
So it only supports TypeConverters
that are decorating actual type class declaration.
Works
[TypeConverter(typeof(MyModelStringTypeConverter))]
public class MyModel
{
}
Doesn't work
public class OtherModel
{
[TypeConverter(typeof(MyModelStringTypeConverter))]
public MyModel MyModel { get;set; }
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With