模型验证 .Net Core 2.0 Web Api 不起作用

4
我有一个 .Net Core 2.0 的 Web Api。在各个模型中,属性上都有验证特性,例如:
[Required]
public short? Quantity { get; set; }

我有一个检查模型状态的ActionFilter:

if (!context.ModelState.IsValid)
     context.Result = new BadRequestObjectResult(context.ModelState);

无论我做什么,当我故意省略必需的属性时,ModelState 总是返回为有效。我的控制器标记为:

无论我做什么,当我故意省略必需的属性时,ModelState 总是返回为有效。我的控制器标记为:

[Produces("application/json")]

模型已经成功地进行了反序列化,我的操作方法中的模型参数已经标记为[FromBody]。只是似乎没有运行任何验证(标准或自定义)。我看过this答案和这个one以及其他几个答案,但我就是想不出我错在哪里。我的API受到IdenityServer 4的保护,所以不确定是否与此有关,但目前我必须自己验证每个操作方法,这不是我想做的事情。有人有建议吗?


你已将Quantity定义为可空的short类型,并标记为必填,这会导致冲突。请将Quantity更改为short数据类型,然后再试一次。 - Mohsin Mehmood
@MohsinMehmood 感谢您的回复,但如果您查看我提供的链接并查看代码,当Json反序列化整数时,它将反序列化为默认值(0)。由于这是有效的int值,因此它将通过验证。因此,我使我的必需变量可为空。无论如何,如果我将其更改为int,仍将验证为有效。 - user1015196
2个回答

16

看起来我的问题是因为我使用了services.AddMvcCore()而不是services.AddMvc(),所以我必须明确设置.AddDataAnnotations(),而这已经包含在AddMvc中。AddMvcCore()提供基础功能,您可以根据需要添加其他内容,而AddMvc会提供所有内容,无论您是否需要。希望这能帮助其他人。

services.AddMvcCore()
                .AddAuthorization()
                .AddJsonFormatters()
                .AddApiExplorer()
                .AddDataAnnotations()
                .AddMvcOptions(opt =>
                    opt.Filters.Add<RequestFilterAttribute>());

太好了,我找到了这个。已经在这个问题上纠结了一个小时了!+1 - Tom Troughton
完全有帮助。非常感谢。 - Perry

0

如果需要对字段进行验证,请使用 [BindRequired, Range(1, 10, ErrorMessage = "your error message")] 装饰您的函数,而不是使用 [Required]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接