在ASP.Net Core Web Api 2.1.1中模型状态始终为true

时间:2018-10-26 05:48:13

标签: c# asp.net-core .net-core asp.net-core-2.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],但在所有情况下都是有价值的,请转到下一步。

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

1 个答案:

答案 0 :(得分:1)

  

在文档中,据说在2.1.1中,“模型状态”错误由ApiController自动处理,但仍未得到正确的结果。并且我还在属性上添加了[Required],但在所有情况下它都是有价值的,请转到下一步。

当您使用ASP.NET Core 2.1(或2.2)时,则选择加入行为发生变化的新功能(例如[ApiController])。

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

您可以在Startup.cs中做到这一点:

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

这将启用具有[ApiController]属性的自动验证。 herehere也对此进行了记录。

  

需要使用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 Blog post