我已经为 REST POST api 端点制作了一个 Controller ,如下所示
public IActionResult POST([FromBody]Person person)
{
....
}
Person 定义为
public class Person
{
public string Name {get; set;}
public int Age {get; set;}
}
意味着 post 请求能够反序列化这样的输入
{
"Name": "Peter",
"Age": 2
}
没有任何问题...
当我传递类似
的东西时,问题就出现了{
"Name": "Peter",
"Age": 2,
"Error": 123123123
}
它仍然创建了一个 Person
,其中前两个已填写..
我想在这里触发一个错误,说明输入格式错误。
我正在存储第一个输入 - 然后使用它来根据第一个输入比较下一个输入。 如果它们相同 - 什么都不应该发生。
但由于最后一个输入包含一个无效字段,但输入创建的实际实例与第一个完全相似 - 我得到了它们不相等的错误?
我假设 JSON 中的 error
语句以某种方式存储在新实例中?
但是我如何确保在 Controller 创建给定 JSON 输入的实例之前验证输入?
最佳答案
1) 为了验证你的 Person 模型,你可以有类似的东西
using System.ComponentModel.DataAnnotations;
public class Person
{
[Required]
[StringLength(250, MinimumLength = 2)]
public string Name { get; set; }
[Required]
[Range(1, 121)]
public int Age { get; set; }
}
在 Controller 的 POST 操作中,您可以使用 if(!ModelState.IsValid){.....}
2) 比较两个 Person 实例是否相等,您可以覆盖 Equals():
public class Person
{
...
...
public override bool Equals(object obj) =>
(obj is Person otherPerson) ? (Name,Age) == (otherPerson.Name,otherPerson.Age): false;
}
此处将当前实例的名称和年龄与其他实例的名称和年龄进行比较。它将允许使用 if ( person.Equals ( someOtherPErsonInstance ) ){....}
3) 如果您需要确保额外字段不出现在 POST 请求中,您可以添加自定义实现 IModelBinder,或者在 POST 操作中接受原始数据,然后解析和检查。
关于c# - 验证 POST 请求的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60575964/