【问题标题】:How to customize validation message for model?如何自定义模型的验证消息?
【发布时间】:2022-02-07 20:34:58
【问题描述】:

我有一个类 TestClass,我想自定义验证消息而不是默认消息。

TestClass是控制器中的post模型,继承自ControllerBase。

这是我尝试过的:

TestClass.cs

public class TestClass
{       
    [TestAtrribute(1.00, 99.99)]
    public double TestNumber { get; set; }
}

TestAttribute.cs

public class TestAttribute : ValidationAttribute
{
    private double _min;
    private double _max;

    public TestAttribute(double min, double max)
    {
        _min = min;
        _max = max;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var error = $"{value} is invalid, must be between {_min} and {_max}";
        try
        {
            var convertNum = Convert.ToDouble(value);
            if (convertNum < _min || convertNum > _max)                
                return new ValidationResult(errorMessage);                
        }
        catch (Exception)
        {
            return new ValidationResult(error);
        }

        return ValidationResult.Success;
    }
}

但是,当我发布字符串值时,我的自定义属性不起作用。 它返回默认消息:

无法将字符串转换为双精度:测试。路径'TestClass.TestNumber', 第 36 行,第 22 位。

我的期望是:

测试无效,必须在 1.00 和 99.99 之间

请告诉我如何解决它。

【问题讨论】:

  • 当我进行调试时,它不会出现在我的 IsValid 方法中。我相信在它可以到达我的 IsValid 方法之前已经完成了一些验证。

标签: c# validation .net-core webapi


【解决方案1】:

请覆盖FormatErrorMessage方法:

    public override string FormatErrorMessage(string name)
    {
        return $"{name} is invalid, must be between {_min} and {_max}";
    }

很难说,因为我没有看到行号,也不确定何时抛出异常。但是你可以使用 TryParse 而不是抛出异常然后捕获。

int result;

if (double.TryParse(custBal.Text, out result))
{

            if (result< _min || result> _max)                
                return new ValidationResult(errorMessage); 
}
else
{
            return new ValidationResult(error);

}

【讨论】:

  • 感谢您的回答,但我相信在它到达我的 IsValid 方法之前已经完成了验证。你有什么想法吗?
  • 你能告诉哪一行你得到了这个异常吗?
  • 不,它不会抛出异常。问题是当我单击从 Postman 发送时,我立即收到消息“无法将字符串转换为双精度:测试。路径 'TestClass.TestNumber',第 36 行,位置 22。”。 TestAttribute 的构造函数中的调试点未命中。所以我相信在某个地方一定有一个验证。
  • 可能是绑定值的问题。你能看看这个并尝试类似的方法吗? stackoverflow.com/a/59322077/2347999
【解决方案2】:

据我了解,我相信您已经开发了一个 WebApi 并尝试使用 PostMan 传递数据。您发布的错误由于其类型安全功能而被 .Net 框架拒绝。由于您传递的是“字符串”而不是“双”。

考虑到,您正在使用“FormBody”或通过传递任何 JSON 或 XML 字符串对象来接受模型“TestClass”的数据。

最好的方法是在将输入数据分配给模型“TestClass”之前通过 if 条件验证输入数据。如果它包含字符串,那么您的自定义消息。

希望这能解决您的问题。

【讨论】:

  • 你理解的没错。但我不清楚第 3 段。你能更详细地解释一下吗?谢谢。
  • 在Action Result中,在赋值给属性(TestNumber)之前,只需检查下面的if条件(伪代码供参考) double _testNumber = 0; //将保存 TryParse 返回的值 //注意:TryParse 参数中的“_value”变量应替换为 FormBody 的 TestNumber 属性值。 if (Double.TryParse(_value, out _testNumber)) { // 将值赋给模型 } else { // 返回您自定义的错误消息 }
  • 问题是TestClass是Controller中方法的参数。当我发送请求时它会自动映射。
猜你喜欢
  • 2010-12-31
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 2012-12-12
相关资源
最近更新 更多