[英]WebApi data annotation validation not occuring for complex type parameter properties
我是ASP.Net WebApi的新手。 因此,如果之前已经问过这个问题(我不确定正确的术语),那我很抱歉,但我只能找到与我的问题略有不同的相关答案 。
我需要创建一个接受复杂类型( TestObject
)的Post
控制器,其中包含:
IEnumerable<Person>
,其中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;
}
控制器接受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对象,它可以正常工作。 但是,如果我故意引入错误(例如,缺少Username
和Option2
)...
{
"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; }
为所有公共领域执行此操作。
您是否使用调试器查看了对象并查看是否正在设置字段? 他们可能是,但在这里看到有关模型绑定的一些细节:
更新:
我已经尝试并测试了这一点,我相信它会解决您的问题。
如果您没有使用TestPerson View,那么验证程序将无法执行。 使用
if(ModelState.IsValid && TryValidateModel(model.TestPerson, "TestPerson."))
{
//Submodel will be validated here.
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.