Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反序列化json时如何避免ModelState中的无效错误_C#_.net_Api - Fatal编程技术网

C# 反序列化json时如何避免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。因此

我正在用C#编写一个API控制器。我正在利用ModelState进行模型验证。例如,检查字符串字段的长度,或检查整型字段是否超过最大值

但我发现了一个问题,有时它并没有像预期的那样工作。例如,这里有一个带有两个字段的模型:

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应有效。