2

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

有人可以提出解决方法吗?

4

2 回答 2

1

这是一个真正的问题,我很好奇为什么不这样做:

public class SampleController : ApiController
{
   public string Get(string id)
   {
      RegularExpressionHelper.ValidateWith("sampleExpression",id);

      return "result";
   }
}

对我来说,这似乎同样简洁。验证发生时很明显。我可以放心地假设,如果验证失败,则会引发异常。我可以轻松地添加额外的验证,并对它们发生的顺序充满信心。

关于属性方法,我不知道验证是否被用作路由匹配的一部分,我不知道如果它失败了会发生什么。我不知道在验证之前或之后运行哪些过滤器。我敢肯定,如果我更了解 MVC,我会知道这些问题的答案,但我看不到使用使我的代码行为依赖于某些框架控制的基础设施的属性的优势。

我错过了一些重要的好处吗?

于 2012-08-05T20:57:47.343 回答
0

我也有同样的疑问。我的解决方法是创建一个仅用于封装参数的类,因此我可以使用我想要的验证属性来装饰它。我可以使用 Darrel 在他的回答中提出的解决方法,但是我有一个过滤器可以在输入操作之前检查 ModelState.IsValid 是否存在,因此我需要在执行操作之前进行验证。

[ModelBinder]
public class Item
{
    [RegularExpression("sampleExpression")]
    public string Id { get; set; }
}

类必须用 注释[ModelBinder],否则参数绑定机制会尝试id从请求体中提取字段。阅读这篇文章了解更多信息。

另外,请注意Id现在是PascalCase而不是camelCase。阅读本文以了解如何进行转换。

动作签名是:

public string Get(Item item)
于 2013-09-27T23:10:28.863 回答