c# - 复杂类型参数属性未发生 Web Api 数据注释验证

标签 c# asp.net-web-api

我是 ASP.Net WebApi 的新手。因此,如果之前有人问过这个问题(我不确定正确的术语),我深表歉意,但我只能找到 this related answer这与我的问题略有不同。

我需要创建一个 Post接受复杂类型(TestObject)的 Controller ,包含:

  1. IEnumerable<Person> , 其中Person具有属性 UsernameExternalId
  2. 关于 Controller 应如何处理数据的选项(TestOptions 对象)

我已经用数据注释定义了下面的类以协助验证:

public class TestObject
{
    public IEnumerable<TestPerson> TestPerson;
    public TestOptions Options;

    public void TestOject()
    {
        this.TestPerson = new List<TestPerson>();
        this.Options = new TestOptions();
    }
}

public class TestPerson
{
    [Required, MaxLength(50)]
    public string ExternalId;

    [Required, MaxLength(50)]
    public string Username;
}

public class TestOptions
{
    [Required]
    public bool Option1;

    [Required, MaxLength(50)]
    public string Option2;
}

Controller 接受TestObject并在执行任何操作之前执行验证:

    [Route("test")]
    public HttpResponseMessage Post([FromBody] TestObject t)
    {
        if (!ModelState.IsValid)
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
        }
        else
        {
            return Request.CreateResponse(HttpStatusCode.OK, string.Format("Found {0} people", t.TestPerson.Count().ToString()));
        }
    }

如果我使用 Fiddler 发送具有正确结构的示例 JSON 对象,它可以正常工作。但是,如果我像这样故意引入错误(例如 UsernameOption2 丢失)...

{
   "TestPerson":[
      { "ExternalId":"123", "Username":"Bob" },
      { "ExternalId":"123" }
   ],
   "Options":{"Option1":false}
}

我还是明白了

Status 200

2 people found

请问为什么会这样?我可以对复杂类型使用数据注释验证吗?

更新

正在设置属性值的调试图像:

enter image description here

最佳答案

您需要将它们转换为属性才能使用,而不是使用字段:

[Required, MaxLength(50)]
public string ExternalId { get; set; }

[Required, MaxLength(50)]
public string Username { get; set; }

对所有公共(public)字段执行此操作。

您是否使用调试器查看对象并查看是否设置了字段?他们可能是,但请参阅此处了解有关模型绑定(bind)的一些详细信息:

ASP.net MVC - Model binding excludes class fields

更新:

我已经对此进行了尝试和测试,相信它会解决您的问题。

关于c# - 复杂类型参数属性未发生 Web Api 数据注释验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34790681/

相关文章:

c# - 溢出 : hidden hides content in placeholder object

c# - 在 .Net 客户端中创建多个 Signalr hub 代理

c# - 当我期望它选择非泛型方法时,方法重载选择了泛型方法

asp.net-web-api - Web API 2 中的身份验证过滤器

c# - 如何将接口(interface)对象列表发布到 ASP.NET WebApi Action 中?

c# - 如何比较 2 组数组的不同匹配项

c# - C# 中列表的继承,以及在 FindAll() 之后的显式转换

asp.net-web-api - 具有相同名称的多个参数

ios - 不知道如何使用从 Web 服务返回的 JSON 数据

c# - 不支持的媒体类型 web api 发布