【问题标题】:Asp.net Core Web Api Override Model ValidationAsp.net Core Web Api 覆盖模型验证
【发布时间】:2020-06-13 06:54:04
【问题描述】:

我正在创建一个 asp.net 核心 web api 应用程序。 我在哪里尝试使用流利的验证来验证我的模型。

这是我的模型和验证器。

public class Data
{
    public string Name { get; set; }

    public int Age { get; set; }
}

public class DataValidator : AbstractValidator<Data>
{
    public DataValidator()
    {
        RuleFor(x => x.Name)
            .NotEmpty()
            .MaximumLength(5);

        RuleFor(x => x.Age)
            .LessThan(80);
    }
}

一切正常。 Fluent 验证将所有验证一起返回,但以下情况除外。

当我的请求包含以下 JSON 时,Fluent Validation 不会被命中。 进行 Asp.net 核心模型验证。 在这种情况下,我会收到单个验证错误。

{
    "name": 123,
    "Age" : 100
}

我收到以下验证消息。

无法将 JSON 值转换为 System.String。路径

  1. 如何覆盖上述默认消息?
  2. 在 Fluent Validation 中是否可以处理上述验证?
  3. 我希望将“姓名”和“年龄”验证消息放在一起。

【问题讨论】:

  • 在该 JSON 中,名称不是字符串。它甚至可能没有触及任何验证中间件,它会尝试反序列化到您的模型失败。将名称值用双引号括起来。
  • @rgvlee 我可以覆盖反序列化机制吗?因为我想抛出数据类型不匹配验证错误。
  • 是的;您必须准确确定导致问题的中间件组件(堆栈跟踪应该为您提供)。自定义模型绑定器可能允许您执行此操作。这里有一个相关的问题stackoverflow.com/a/57003369/2975810 涵盖了另一种方法。

标签: asp.net-core fluentvalidation


【解决方案1】:

让我们看看你的绑定模型:

public class Data
{
    public string Name { get; set; }
    public int Age { get; set; }
}

这里,Name 是一个字符串,而 Age 是一个 int。

您的验证器没问题,否则在构建应用程序时应该会出现编译错误。

现在,让我们看看 JSON:

{
    "name": 123,
    "Age" : 100
}

您应该使用Name,而不是使用name。另外,Name 的值应该是一个字符串,即 "123" 而不是 123。即

{
  "Name": "123",
  "Age": 100
}

之后,您应该能够得到预期的验证错误。

【讨论】:

  • 密钥大小写可能无关紧要,默认行为将愉快地绑定,无论它是 JSON 中的“名称”还是“名称”。我同意 Name 的值是问题所在,因为它需要更改为字符串 - 正如我昨天在 OP cmets 中指出的那样。
  • 感谢您的回答。正如@rgvlee 所说,nameName 没有问题。我想通知用户 name 是一个字符串,但您设置了一个 int。
  • @VimeshShah 您可以使用 javascript 进行此检查,如果 isNaN(parseInt(name)) === false 表示用户输入了一个数字。在这种情况下,您通知用户。
猜你喜欢
  • 2019-03-26
  • 1970-01-01
  • 2016-12-22
  • 2021-09-08
  • 2022-10-07
  • 2017-12-14
  • 2018-08-24
相关资源
最近更新 更多