为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
UYOU 2022-11-22 15:12:24

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


这是代码:


验证模型状态属性类:


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字段始终为真,并且key始终为空。


任何人都知道为什么?


查看完整描述

1 回答

?
慕侠2389804

TA贡献1460条经验 获得超6个赞

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


public class Book

{

    [Required]

    public string BookId { get; set; }


    [Required]

    public string BookName { get; set; }

}

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


查看完整回答
反对 回复 2022-11-22
  • 1 回答
  • 0 关注
  • 7 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信