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
,即使IsValid
是true
。
有没有办法拦截OnActionExecuting
的Model
,以检查模型是否为空并适当地处理这种情况,或者有更好的方法来确保在这种情况下IsValid
返回false
?
没有您的模型数据,就不可能真正帮助您。
但是,您的问题源于以下原因:
-
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
表示尝试绑定 将窗体发布到操作方法,其中包括验证 信息。 另一种可能的方法是Count
对Dictionary
内的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)
{
}
来源帖子