[英]How to avoid invalid error in ModelState when deserializing a json
我正在用 C# 编写一个 API 控制器。 我正在利用 ModelState 进行模型验证。 例如,检查字符串字段的长度,或检查 int 字段是否超过最大值。
但是我发现了一个问题,有时它不能按预期工作。 例如,这里我有一个包含两个字段的模型:
public int A { get; set; }
public bool B { get; set; }
然后我的请求有效负载如下所示:
{
"A": 123.4,
"B": true
}
显然 A 的格式无效,它应该是 int 但我给了它一个浮点数。 所以我在 ModelState 中得到一个错误: Input string '123.4' is not a valid integer. Path 'A', line x, position x.
Input string '123.4' is not a valid integer. Path 'A', line x, position x.
. 这完全有道理。
但同时在 ModelState 中出现另一个错误: Unexpected token when deserializing object: Boolean. Path 'B', line x, position x.
出现Unexpected token when deserializing object: Boolean. Path 'B', line x, position x.
Unexpected token when deserializing object: Boolean. Path 'B', line x, position x.
.
似乎当 A 不是 int 时,C# 在反序列化 json 的其余部分时会出错。 我怎么能避免这种情况? 我希望 ModelState 中只有第一个错误。
谢谢你们!
- - - - - - - - - - - - - - - 编辑 - - - - - - - - - - -------------
非常感谢您的帮助。 我想在这里添加一些评论。 当然,我使用ModelState.IsValid
来检查有效负载是否有效。 结果是假的。 哪个是正确的。 但是这里的错误是,只有第一个字段 A 无效,而 B 有效。 所以我希望在 ModelState 中只有 A 的错误。
如果 ModelState.IsValid 无法正常工作,您可以尝试这种方式:
private int _a;
public int A
{
get
{
return _a;
}
set
{
bool success = Int32.TryParse(value.ToString(), out int number);
if (success)
{
_a = number;
}
}
}
如果不使用 .net core 3,则只需声明 int number; 在 try 解析上方并从那里删除 int
int number
bool success = Int32.TryParse(value.ToString(), out number); 如果(成功){ _a = 数字; }
为了检查有效性(无论是一个属性还是所有属性),我一直使用以下 if 语句。 这通常涵盖具有 1 个或多个错误的请求并返回 BadRequest 状态。
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
如果您有兴趣运行测试并确保所有属性都正确,我可以建议使用TestController
类型的类来验证数据。
阅读此处了解有关如何设置的详细信息。 这里有很多例子。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.