首页 > 解决方案 > 模型状态在 asp.Net Core web Api 2.1.1 中始终为真

问题描述

当我使用 .net Core 2.1.0 版和使用下面的代码进行模型状态验证时工作正常。

Startup.cs文件中添加以下代码

services.AddMvc(config =>
{
    config.Filters.Add(new ValidateModelAttribute());
});

并像这样创建ValidateModelAttribute

public class ValidateModelAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.ModelState.IsValid)
        {
            context.Result = new BadRequestObjectResult(context.ModelState);
        }
    }
}

但现在我正在使用2.1.1,我尝试了所有google and SO post but Model State is always true

即使我正在发送空的 json 对象。

在文档中说,在 2.1.1 中,模型状态错误由 自动处理,ApiController但仍然没有给出正确的结果。我也添加[Required]了属性,但在所有情况下它都是价值并进入下一步。

如果有人需要任何其他信息,请发表评论。我也会添加其他信息。

标签: c#asp.net-core.net-coreasp.net-core-2.1

解决方案


在文档中说,在 2.1.1 中,模型状态错误由 ApiController 自动处理,但仍然没有给出正确的结果。我也在属性上添加[必需],但在所有情况下它都是价值并进入下一步。

当您使用 ASP.NET Core 2.1(或 2.2)时,行为改变的新功能 (例如[ApiController])是可选的。

[ApiController]仅当您选择加入 ASP.NET Core 2.1(或 2.2,如果您使用 ASP.NET Core 2.2)功能时,使用属性的自动模型验证才有效。

您可以在 Startup.cs 中执行此操作:

services.AddMvc()
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)

这将启用[ApiController]属性的自动验证。这也记录在这里这里

SetCompatibilityVersion使用此属性需要2.1 或更高版本的兼容版本(通过 设置)。例如,中突出显示的代码Startup.ConfigureServices 设置了 2.2 兼容性标志:

services.AddMvc()
   .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
   .ConfigureApiBehaviorOptions(options =>
   {
       options.SuppressConsumesConstraintForFormFileParameters = true;
       options.SuppressInferBindingSourcesForParameters = true;
       options.SuppressModelStateInvalidFilter = true;
       options.SuppressMapClientErrors = true;

       options.ClientErrorMapping[404] = "https://httpstatuses.com/404";
   });

另请参阅ASP.NET Core 2.1-preview1 博客文章


推荐阅读