更改模型状态绑定器中的默认错误消息 - 不起作用

问题描述 投票:0回答:1

这(在 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
:

enter image description here

我需要显示我的自定义错误消息,而不是默认的 ASP.NET Core MVC 错误消息,在这种情况下不会显示。

asp.net-core-mvc modelstate custom-errors error-messaging
1个回答
0
投票

如果你在 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; }

结果:

© www.soinside.com 2019 - 2024. All rights reserved.