WebApi动作参数由ValidationAttribute验证

时间:2012-08-05 13:31:46

标签: validation data-annotations asp.net-web-api

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

是否有人可以建议解决方法?

2 个答案:

答案 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)