繁体   English   中英

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

[英]WebApi data annotation validation not occuring for complex type parameter properties

我是ASP.Net WebApi的新手。 因此,如果之前已经问过这个问题(我不确定正确的术语),那我很抱歉,但我只能找到我的问题略有不同的相关答案

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

  1. 一个IEnumerable<Person> ,其中Person具有属性UsernameExternalId
  2. 关于控制器应如何处理数据的选项( 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;
}

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

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

更新

调试具有设置的属性值的图像:

在此输入图像描述

您需要将字段转换为属性以使其工作,而不是使用字段:

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

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

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

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

ASP.net MVC - 模型绑定不包括类字段

更新:

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

如果您没有使用TestPerson View,那么验证程序将无法执行。 使用

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM