WebAPI是否可以在动作参数上处理ValidationAttribute?
例如:
public class SampleController : ApiController
{
public string Get([RegularExpression("sampleExpression")]string id)
{
return "result";
}
}
在此示例中,WebAPI不会调用RegularExpressionAttribute(或任何其他数据注释属性)的任何方法来验证输入参数。但是如果我们将一个对象作为参数传递,例如一个类,那么WebAPI就可以验证属性。
这是一个错误吗?或者我做错了什么?
UPD:这是一个悬而未决的问题: http://aspnetwebstack.codeplex.com/workitem/24?PendingVoteId=24是否有人可以建议解决方法?
答案 0 :(得分:1)
这是一个真实的问题,我很好奇为什么不做这样的事情:
public class SampleController : ApiController
{
public string Get(string id)
{
RegularExpressionHelper.ValidateWith("sampleExpression",id);
return "result";
}
}
对我而言,这似乎相当简洁。验证发生时很明显。我可以放心地假设如果验证失败,那么将抛出异常。我可以轻松添加额外的验证,并对它们发生的顺序充满信心。
关于属性方法,我不知道验证是否用作路由匹配的一部分,我不知道如果失败会发生什么。我不知道在验证之前或之后运行了什么过滤器。我敢肯定,如果我更了解MVC,我会知道这些问题的答案,但我没有看到使用属性的优势,这使得我的代码行为依赖于某些框架控制的基础架构。
我错过了一些重要的好处吗?
答案 1 :(得分:0)
我有同样的疑问。我的解决方法在于创建一个仅用于封装参数的类,因此我可以使用我想要的验证属性来装饰它。我可以在他的回答中使用Darrel提出的解决方法,但我有一个过滤器,用于在进入操作之前检查ModelState.IsValid ,因此我需要在操作执行之前进行验证。
[ModelBinder]
public class Item
{
[RegularExpression("sampleExpression")]
public string Id { get; set; }
}
该类必须使用[ModelBinder]
进行注释,否则参数绑定机制将尝试从请求正文中提取id
字段。请阅读this article了解详情。
另请注意,Id
现在位于 PascalCase 而不是 camelCase 。阅读this article以了解转化的方式。
行动签名是:
public string Get(Item item)