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.
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; }
}
来源:https://stackoverflow.com/questions/43378709/typeconverter-does-not-work-in-asp-net-core