我是ASP.Net WebApi的新手。因此,如果之前已经问过这个问题(我不确定正确的术语),请道歉,但我只能找到this related answer,这与我的问题略有不同。
我需要创建一个接受复杂类型(Post
)的TestObject
控制器,其中包含:
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个人
为什么会这样?我可以在复杂类型上使用数据注释验证吗?
使用设置的属性值调试图像:
答案 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.
}