2012-08-05 86 views
1

WebAPI是否可以在操作参数上处理ValidationAttribute?通过ValidationAttribute验证WebApi操作参数

例如:

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

有谁可以提出一个解决办法?

回答

1

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

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

     return "result"; 
    } 
} 

对我来说,这似乎是等效简洁。验证发生时很明显。我可以安全地假设,如果验证失败,那么将引发异常。我可以轻松添加额外的验证并对其发生的顺序有信心。

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

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

0

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

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

类必须用[ModelBinder]进行注释,否则参数绑定机制将尝试从请求的主体提取id字段。阅读this article了解更多信息。

另外,还要注意Id现在是在PascalCase代替驼峰。阅读this article以了解如何进行转换。

行动签名是:

public string Get(Item item)