我有一个这样的示例类:
public class TestClass
{
[Precision(18,2)]
public decimal? Amount { get; set; }
}
在前端,
Amount
被视为具有以下格式的字符串:$120,555.35
。那么,当我提交表单时,如何自动将此字符串格式转换为十进制格式?
我相信它应该在数据类型验证之前重新格式化。
[HttpPost]
public async Task<IActionResult> Create([FromForm] TestClass request)
{
// ...
}
感谢任何帮助,谢谢。
您可以像下面这样自定义模型绑定器来实现您的要求:
public class CustomDecimalModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
var modelName = bindingContext.ModelName;
var valueProviderResult = bindingContext.ValueProvider.GetValue(modelName);
if (valueProviderResult == ValueProviderResult.None)
{
return Task.CompletedTask;
}
bindingContext.ModelState.SetModelValue(modelName, valueProviderResult);
var value = valueProviderResult.FirstValue;
if (string.IsNullOrWhiteSpace(value))
{
return Task.CompletedTask;
}
// Remove currency symbols and commas, then parse
value = value.Replace("$", "").Replace(",", "");
if (decimal.TryParse(value, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out decimal decimalValue))
{
bindingContext.Result = ModelBindingResult.Success(decimalValue);
}
else
{
bindingContext.ModelState.TryAddModelError(modelName, "Invalid decimal value");
}
return Task.CompletedTask;
}
}
将活页夹应用到
Amount
属性:
public class TestClass
{
[Precision(18, 2)]
[ModelBinder(BinderType = typeof(CustomDecimalModelBinder))]
public decimal? Amount { get; set; }
}