我正在尝试在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,而key
is始终为空。
谁知道为什么?
为了使MVC中的模型绑定起作用(以及JSON.NET,它在JSON主体的幕后使用),你的BookId
和BookName
成员必须是属性,但它们当前是字段。这是它应该是什么样子:
public class Book
{
[Required]
public string BookId { get; set; }
[Required]
public string BookName { get; set; }
}
(我也删除了DataContract
,DataSerializable
和DataMember
,因为不需要这些)。