我有一个像这样的示例类:
public class TestClass
{
[Precision(18,2)]
public decimal? Amount{get;set;}
}
在前端,它以字符串形式威胁,示例格式如下:$120,555.35。那么,在提交表单时,如何将此字符串格式自动转换为十进制格式呢?我相信它应该在 netcore 进行数据类型验证之前重新格式化。
[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; }
}