c# - 验证 POST 请求的输入?

标签 c# json asp.net-core controller json-schema-validator

我已经为 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/

相关文章:

c# - 如何使用 Microsoft 的 EWS API 2.0 获取联系人的电子邮件地址?

php - 如何用jquery mobile和ajax实现浏览器历史记录和书签

javascript - Node.js 无法使用 JSON 数据读取未定义的属性

ruby - mongoid 文档 to_json 包括所有嵌入的文档,每个文档都没有 ':include'

asp.net - 使用 "dnu publish"排除发布项目上的文件夹

c# - 检索每个用户对特定 Google 文档所做的更改

c# - 删除相关实体时出现“集合已修改”错误

javascript - Asp .Net MVC5应用程序不会在setInterval方法中发送ajax请求

c# - 将 SQL 函数添加到 .NET Core SaveChanges 方法

asp.net-core - 在 TFS Build vnext 中运行 powershell 任务时出错