当请求模型实际无效时,ModelState 有效

ModelState is Valid when the Request Model is actually Invalid

我正在尝试验证 POST 请求中的请求模型 API。但是无论我在请求正文中发送的模型是否正确,ModelState.IsValid 总是显示有效。请求正文无效,因为我更改了字段名称或修改了特定属性的字段类型。

代码如下:

ValidateModelStateAttribute class:

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

控制器class:

[HttpPost("Search")]
[Produces("application/json")]
public async Task<IActionResult> SearchBook([FromBody]Book searchRequest)
{
    if (searchRequest!= null && !ModelState.IsValid)
    {
        return BadRequest();
    }
    return new ObjectResult("Book!");
}

图书模型class:

[DataContract]
[Serializable]
public class Book
{
    [Required]
    [DataMember]
    public string BookId;
    [Required]
    [DataMember]
    public string BookName;       
}

在Startup.cs class:

 services.AddMvc(options =>
 {
     options.Filters.Add(typeof(ValidateModelStateAttribute));
 })

当我在ValidateModelStateAttributeclass中调试时,isValid字段始终为真,而key始终为空。

有人知道为什么吗?

为了使 MVC 中的模型绑定工作(以及 JSON.NET,它在幕后用于 JSON 主体),您的 BookIdBookName 成员必须是 properties,但他们目前是 fields。它应该是这样的:

public class Book
{
    [Required]
    public string BookId { get; set; }

    [Required]
    public string BookName { get; set; }
}

(我还删除了 DataContractDataSerializableDataMember,因为不需要这些。