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

问题描述 投票:2回答:1

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

这是代码:

ValidateModelStateAttribute类:

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

控制器类:

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

书籍模型类:

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

在Startup.cs类中:

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

当我在ValidateModelStateAttribute类中调试时,isValid字段始终为true,而keyis始终为空。

谁知道为什么?

c# asp.net-core asp.net-core-webapi model-binding modelstate
1个回答
4
投票

为了使MVC中的模型绑定起作用(以及JSON.NET,它在JSON主体的幕后使用),你的BookIdBookName成员必须是属性,但它们当前是字段。这是它应该是什么样子:

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.