Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 复杂类型参数属性未发生WebApi数据批注验证_C#_Asp.net Web Api - Fatal编程技术网

C# 复杂类型参数属性未发生WebApi数据批注验证

C# 复杂类型参数属性未发生WebApi数据批注验证,c#,asp.net-web-api,C#,Asp.net Web Api,我是ASP.NETWebAPI新手。因此,如果以前有人问过这个问题(我不确定正确的术语),我表示歉意,但我只能找到与我的问题略有不同的术语 我需要创建一个接受复杂类型的Post控制器(一个TestObject),其中包含: 一个IEnumerable,其中Person具有属性Username和ExternalId 控制器应如何处理数据的选项(一个TestOptions对象) 我使用数据注释定义了以下类,以帮助验证: public class TestObject { public IEn

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

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

  • 一个
    IEnumerable
    ,其中
    Person
    具有属性
    Username
    ExternalId
  • 控制器应如何处理数据的选项(一个
    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;
    }
    
    如果我使用Fiddler发送一个具有正确结构的JSON对象示例,它就可以正常工作。但是,如果我故意引入这样的错误(例如,
    Username
    Option2
    缺失)的话

    {
       "TestPerson":[
          { "ExternalId":"123", "Username":"Bob" },
          { "ExternalId":"123" }
       ],
       "Options":{"Option1":false}
    }
    
    我还是会

    状态200

    发现2人

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

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


    如果您没有使用TestPerson视图,验证程序将不会执行。 使用


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

    [Required, MaxLength(50)]
    public string ExternalId { get; set; }
    
    [Required, MaxLength(50)]
    public string Username { get; set; }
    
    对所有公共字段执行此操作

    您是否使用调试器查看对象,并查看是否设置了字段?它们可能是,但有关modelbinding的详细信息,请参见此处:

    更新:


    我已经试过并测试过了,相信它会解决您的问题。

    您好,这不是MVC项目,所以我没有任何ViewsHanks。我添加了getter和setter,但仍然没有进行验证。我附上了调试器的图像,显示正在设置的值。也许您可以发现遗漏了什么?是的,您没有将
    TestObject
    中的字段设置为properties!阿氏;脸掌心时刻。。。谢谢,它在工作。出于兴趣,您知道为什么此验证不适用于字段,而只适用于属性吗。另一个问题说这是故意的,但这有什么原因吗?我不知道为什么。仔细研究了一下,但还是接受了事实!杰出的无论如何,谢谢你。
    if(ModelState.IsValid && TryValidateModel(model.TestPerson, "TestPerson."))
    {
       //Submodel will be validated here.
    }
    
    [Required, MaxLength(50)]
    public string ExternalId { get; set; }
    
    [Required, MaxLength(50)]
    public string Username { get; set; }