我是 ASP.Net WebApi 的新手。因此,如果之前有人问过这个问题(我不确定正确的术语),我深表歉意,但我只能找到 this related answer这与我的问题略有不同。
我需要创建一个 Post
接受复杂类型(TestObject
)的 Controller ,包含:
- 安
IEnumerable<Person>
, 其中Person
具有属性Username
和ExternalId
- 关于 Controller 应如何处理数据的选项(
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;
}
Controller 接受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}
}
我还是明白了
Status 200
2 people found
请问为什么会这样?我可以对复杂类型使用数据注释验证吗?
更新
正在设置属性值的调试图像:
最佳答案
您需要将它们转换为属性才能使用,而不是使用字段:
[Required, MaxLength(50)]
public string ExternalId { get; set; }
[Required, MaxLength(50)]
public string Username { get; set; }
对所有公共(public)字段执行此操作。
您是否使用调试器查看对象并查看是否设置了字段?他们可能是,但请参阅此处了解有关模型绑定(bind)的一些详细信息:
ASP.net MVC - Model binding excludes class fields
更新:
我已经对此进行了尝试和测试,相信它会解决您的问题。
关于c# - 复杂类型参数属性未发生 Web Api 数据注释验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34790681/