ModelSate.IsValid 在发布到 Web API 操作时返回 true,并且生成的模型为 null

本文关键字:null 模型 true 返回 IsValid Web 操作 API ModelSate | 更新日期: 2023-09-27 18:36:23

使用 Chrome PostMan,我注意到如果我发布到操作方法而不传递任何表单参数,即使我在模型属性上设置了[Required]验证属性,ModelState.IsValid也会返回 true。

奇怪的是,作为参数传递的Model的值为 null,即使IsValidtrue

有没有办法拦截OnActionExecutingModel,以检查模型是否为空并适当地处理这种情况,或者有更好的方法来确保在这种情况下IsValid返回false

ModelSate.IsValid 在发布到 Web API 操作时返回 true,并且生成的模型为 null

没有您的模型数据,就不可能真正帮助您。

但是,您的问题源于以下原因:

  • ModelState.IsValid :调用此函数时,实质上将执行以下操作:Values.All(m => m.Errors.Count == 0) 。 由于集合为空,因此它仍将验证为 true 。 由于集合没有错误。

要正确说明这些信息,您需要执行以下操作:

// If Invalid
if(model == null && !ModelState.IsValid)
     return View("Error");
// If Vaild
if(model != null && ModelState.IsValid)
     return View("Valid");

ModelState.IsValid表示尝试绑定 将窗体发布到操作方法,其中包括验证 信息。 另一种可能的方法是CountDictionary内的KeyValuePair .

if(ModelState.Count != 0)
     return View("Valid");

另一个建议,希望这能澄清。 IsValid将根据潜在错误触发其计数。 如果集合中不存在,它将始终返回true

文档:

  • Microsoft开发人员网络 MSDN。
  • 布拉德·威尔逊的回答,堆栈溢出。
  • Nemesv的答案,堆栈溢出。

编辑:我能找到的最接近"官方"见解的是 ASP.NET 的一篇文章。其示例中所示的代码首先测试模型的 null,然后在单独的步骤中检查模型是否有效。

ASP.NET 模型绑定

这在下面的链接中得到了回答。以下是该帖子中的一些内容:

ModelState.IsValid 在内部检查 Values.All(modelState => modelState.Errors.Count == 0) 表达式。

由于没有输入,因此 Values 集合将为空,因此 ModelState.IsValid 将为 true。

因此,您需要明确处理这种情况:

if (user != null && ModelState.IsValid)
{
}

来源帖子