Asp.net core Asp.net核心Web Api覆盖模型验证
我正在创建一个asp.net核心web api应用程序。 我尝试使用fluent验证来验证我的模型 这是我的模型和验证器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() {
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。路径
让我们看看您的绑定模型:
公共类数据
{
公共字符串名称{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进行此检查。在这种情况下,您将通知用户。