Asp.net core Asp.net核心Web Api覆盖模型验证

Asp.net core Asp.net核心Web Api覆盖模型验证,asp.net-core,fluentvalidation,Asp.net Core,Fluentvalidation,我正在创建一个asp.net核心web api应用程序。 我尝试使用fluent验证来验证我的模型 这是我的模型和验证器 public class Data { public string Name { get; set; } public int Age { get; set; } } public class DataValidator : AbstractValidator<Data> { public DataValidator() {

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

这是我的模型和验证器

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);
    }
}
我收到了以下验证消息

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

  • 如何覆盖上述默认消息
  • 在Fluent validation中是否有处理上述验证的方法
  • 我希望“姓名”和“年龄”验证消息同时出现

  • 让我们看看您的绑定模型:

    公共类数据
    {
    公共字符串名称{get;set;}
    公共整数{get;set;}
    }
    
    这里,
    Name
    是一个字符串,
    Age
    是一个int

    您的验证器很好,否则在构建应用程序时会出现编译错误

    现在,让我们看看JSON:

    {
        "name": 123,
        "Age" : 100
    }
    
    不要使用
    名称
    ,而应使用
    名称
    。另外,
    Name
    的值应该是一个字符串,即
    “123”
    而不是
    123
    。i、 e

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

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

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

    公共类数据
    {
    公共字符串名称{get;set;}
    公共整数{get;set;}
    }
    
    这里,
    Name
    是一个字符串,
    Age
    是一个int

    您的验证器很好,否则在构建应用程序时会出现编译错误

    现在,让我们看看JSON:

    {
        "name": 123,
        "Age" : 100
    }
    
    不要使用
    名称
    ,而应使用
    名称
    。另外,
    Name
    的值应该是一个字符串,即
    “123”
    而不是
    123
    。i、 e

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

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

    在该JSON中,名称不是字符串。它甚至可能没有击中任何验证中间件,它将无法尝试反序列化到您的模型。将名称值用双引号括起来。@rgvlee我可以重写该反序列化机制吗?因为我想抛出数据类型不匹配验证错误。是;您必须准确地确定是什么中间件组件导致了这个问题(堆栈跟踪应该会告诉您)。自定义模型活页夹可能允许您这样做。这里有一个涉及另一种方法的相关问题。在JSON中,名称不是字符串。它甚至可能没有击中任何验证中间件,它将无法尝试反序列化到您的模型。将名称值用双引号括起来。@rgvlee我可以重写该反序列化机制吗?因为我想抛出数据类型不匹配验证错误。是;您必须准确地确定是什么中间件组件导致了这个问题(堆栈跟踪应该会告诉您)。自定义模型活页夹可能允许您这样做。这里有一个涉及另一种方法的相关问题。关键的大小写可能无关紧要,不管JSON中是“name”还是“name”,默认行为都会很好地绑定。我同意Name的值是个问题,因为它需要更改为字符串——正如我昨天在OP评论中指出的那样。谢谢你的回答。正如@rgvlee所说,名字和名字没有问题。我想通知用户name是一个字符串,但您已经设置了一个int。@vimeshsah如果
    isNaN(parseInt(name))===false,表示用户输入了一个数字,则可以使用javascript进行此检查。在本例中,您将通知用户。密钥大小写可能无关紧要,默认行为将愉快地绑定,无论在JSON中是“name”还是“name”。我同意Name的值是个问题,因为它需要更改为字符串——正如我昨天在OP评论中指出的那样。谢谢你的回答。正如@rgvlee所说,名字和名字没有问题。我想通知用户name是一个字符串,但您已经设置了一个int。@vimeshsah如果
    isNaN(parseInt(name))===false,表示用户输入了一个数字,则可以使用javascript进行此检查。在这种情况下,您将通知用户。