这(在 ASP.NET Core 3.1 中)是我的属性在类中的样子:
[BindProperty]
[Required(ErrorMessage = "Enter the valid amount")]
[ValidDecimal(ErrorMessage = "Enter the amount correctly")]
public decimal? QuoteAmountTotal { get; set; }
这是自定义
ValidDecimal
值的代码是:
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
public class ValidDecimalAttribute : ValidationAttribute{
protected override ValidationResult? IsValid(object? value, ValidationContext validationContext)
{
if (value == null || value.ToString().Length == 0)
{
return ValidationResult.Success;
}
return decimal.TryParse(value.ToString(), out _) ? ValidationResult.Success : new ValidationResult(ErrorMessage);
}
我在此字段中输入一个包含空格或字母数字的值。例如 2 0 0 0。
但是,它显示默认的 ASP.NET Core MVC 错误,而不是我的自定义错误
值“2 0 0 0”对于 QuoteAmountTotal 无效。
这是
AttemptedvalueisInvalidAccessor
:
我需要显示我的自定义错误消息,而不是默认的 ASP.NET Core MVC 错误消息,在这种情况下不会显示。
如果你在 IsValid 方法上设置断点,当你调试时,你会发现该方法永远不会被执行
如doc所示:
模型状态表示来自两个子系统的错误:模型绑定和模型验证。模型绑定产生的错误一般是数据转换错误。模型验证发生在模型绑定之后,报告数据不符合业务规则的错误。
更新日期: 您可以尝试用您的客户模型活页夹替换模型活页夹,我尝试如下:
public class SomeEntityBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
var modelName = bindingContext.ModelName;
// Try to fetch the value of the argument by name
var valueProviderResult = bindingContext.ValueProvider.GetValue(modelName);
if (valueProviderResult == ValueProviderResult.None)
{
return Task.CompletedTask;
}
bindingContext.ModelState.SetModelValue(modelName, valueProviderResult);
var value = valueProviderResult.FirstValue;
// Check if the argument value is null or empty
if (string.IsNullOrEmpty(value))
{
return Task.CompletedTask;
}
if (!decimal.TryParse(value, out var QuoteAmountTotal))
{
// Non-decimal arguments result in model state errors
bindingContext.ModelState.TryAddModelError(modelName,"Enter the amount correctly");
return Task.CompletedTask;
}
bindingContext.Result = ModelBindingResult.Success(QuoteAmountTotal);
return Task.CompletedTask;
}
}
型号:
[ModelBinder (typeof(SomeEntityBinder))]
public decimal QuoteAmountTotal { get; set; }
结果: