【问题标题】:ModelState is Valid when the Request Model is actually Invalid当请求模型实际上无效时,ModelState 是有效的
【发布时间】:2019-08-23 02:29:00
【问题描述】:

我正在尝试在 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 字段始终为真,key 始终为空。

有人知道为什么吗?

【问题讨论】:

  • @KirkLarkin 我认为BookIdBookName 是属性.. 我应该如何更改代码?
  • 我会添加一个答案。
  • 是否有任何演示可以重现您的问题?我用netcoreapp2.1 web api做了一个测试,它工作正常。您是如何发送请求的?
  • 我只是将请求正文放在正文部分并将其设置为 json/application.. 我必须删除 [required] 属性,因为它们都不是必需的.. 这就是为什么它不工作?无论类型有多么错误,它总是显示context.ModelState.IsValid 为真..

标签: c# asp.net-core asp.net-core-webapi model-binding modelstate


【解决方案1】:

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

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

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

(我还删除了 DataContractDataSerializableDataMember,因为它们不需要)。

【讨论】:

  • 感谢您的回答。但是isValid字段仍然是true,而我将请求模型修改为错误的模型,例如将BookId更改为BookIdd...而keys仍然显示为null.. :(
  • 我看到context.ActionArguments在body里面有我请求的请求模型,那我应该在这个类中手动做验证吗?或者模型绑定器实际上可以自己进行验证?
  • 这种方法应该可以正常工作,而无需做额外的工作。周涛在你的问题上证实了它确实可以正常工作(感谢涛!)所以下一步是一个很好的复制。
  • 我找到了一个使用流利验证库的解决方法。但是该库只能为我检查字段名称,而不是字段类型。你上面提到的方法是否能够验证字段类型?顺便说一句,我没有使用 MVC.. 我使用 ASP.Net 核心作为 Web API.. 这会是原因吗?
猜你喜欢
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
相关资源
最近更新 更多