WebApi数据注释验证不会出现复杂的类型参数属性

时间:2016-01-14 13:20:16

标签: c# asp.net-web-api

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

我需要创建一个接受复杂类型(Post)的TestObject控制器,其中包含:

  1. IEnumerable<Person>,其中Person包含属性UsernameExternalId
  2. 控制器应如何处理数据的选项(TestOptions对象)
  3. 我已使用数据注释定义了以下类,以帮助验证:

    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;
    }
    

    控制器接受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}
    }
    

    我还是

      

    状态200

         

    找到2个人

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

    更新

    使用设置的属性值调试图像:

    enter image description here

2 个答案:

答案 0 :(得分:3)

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

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

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

为所有公共领域执行此操作。

您是否使用调试器查看对象并查看字段是否已设置?他们可能是,但在这里看到有关模型绑定的一些细节:

ASP.net MVC - Model binding excludes class fields

更新

我已经尝试并测试了这一点,并确信它会解决您的问题。

答案 1 :(得分:0)

如果您未使用TestPerson View,验证程序将无法执行。 使用

if(ModelState.IsValid && TryValidateModel(model.TestPerson, "TestPerson."))
{
   //Submodel will be validated here.
}