C# 反序列化json时如何避免ModelState中的无效错误
我正在用C#编写一个API控制器。我正在利用ModelState进行模型验证。例如,检查字符串字段的长度,或检查整型字段是否超过最大值 但我发现了一个问题,有时它并没有像预期的那样工作。例如,这里有一个带有两个字段的模型:C# 反序列化json时如何避免ModelState中的无效错误,c#,.net,api,C#,.net,Api,我正在用C#编写一个API控制器。我正在利用ModelState进行模型验证。例如,检查字符串字段的长度,或检查整型字段是否超过最大值 但我发现了一个问题,有时它并没有像预期的那样工作。例如,这里有一个带有两个字段的模型: public int A { get; set; } public bool B { get; set; } 然后,我的请求有效负载如下所示: { "A": 123.4, "B": true } 显然,A的格式无效,应该是int,但我给了它一个float。因此
public int A { get; set; }
public bool B { get; set; }
然后,我的请求有效负载如下所示:
{
"A": 123.4,
"B": true
}
显然,A的格式无效,应该是int,但我给了它一个float。因此,我在ModelState中出错:输入字符串“123.4”不是有效的整数。路径“A”,第x行,位置x.
。这完全有道理
但是ModelState中同时发生另一个错误:反序列化对象时出现意外标记:Boolean。路径“B”,第x行,位置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;
}
}
}
如果不使用.NETCore3,则只需声明整数;在上面,请尝试解析并从中删除int
int number
bool success=Int32.TryParse(value.ToString(),out number);
如果(成功)
{
_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;
}
}
}
如果不使用.NETCore3,则只需声明整数;在上面,请尝试解析并从中删除int
int number
bool success=Int32.TryParse(value.ToString(),out number);
如果(成功)
{
_a=数字;
}为了检查有效性(无论是一个属性还是所有属性),我总是使用下面的if语句。这通常会覆盖包含1个或多个错误的请求,并返回BADDREQUEST状态
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
如果您对运行测试和确保所有属性都正确感兴趣,我建议使用TestController
类型的类来验证数据
有关如何设置的详细信息。这里有很多例子。为了检查有效性(无论是一个属性还是所有属性),我总是使用下面的if语句。这通常会覆盖包含1个或多个错误的请求,并返回BADDREQUEST状态
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
如果您对运行测试和确保所有属性都正确感兴趣,我建议使用TestController
类型的类来验证数据
有关如何设置的详细信息。这里有很多例子。您可以在api控制器中使用if语句来检查ModelState.IsValidThank You@Jawad,我是否应用了它。它返回false。但它包含两个错误,这对我来说是不正确的。A无效,但B应该有效。您可以在api控制器中使用if语句检查ModelState.IsValidThank You@Jawad,我应用了它。它返回false。但它包含两个错误,这对我来说是不正确的。A无效,但B应有效。