2

如何验证 ASP.NET Web API 中可选参数的数据类型?

我的路由如下所示:

context.MapHttpRoute(
    name: "ItemList",
    routeTemplate: "api/v1/projects/{projectId}/items",
    defaults: new
        {
            area = AreaName,
            controller = "Items",
            action = "GetItems",
            offset = RouteParameter.Optional,
            count = RouteParameter.Optional,
        }
);

这些都是有效的请求:

http://localhost/api/v1/projects/1/items  
http://localhost/api/v1/projects/1/items?offset=20  
http://localhost/api/v1/projects/1/items?count=10  
http://localhost/api/v1/projects/1/items?offset=20&count=10

一切正常,除非为其中一个参数提供了无效值。例如,

http://localhost/api/v1/projects/1/items?count=a

没有验证错误,计数只是变为空。

有没有办法检测到这一点并返回错误消息?我想我记得在某个地方看到了一个带有自定义消息处理程序的解决方案,但我再也找不到它了。

控制器方法如下所示:

public IEnumerable<Item> GetItems([FromUri]GetItemsParams getItemsParams)
{
    // logic
}

params 类如下所示:

[DataContract]
public class GetItemsParams
{
    [DataMember] public int? offset { get; set; }
    [DataMember] public int? count { get; set; }
}
4

2 回答 2

0

听起来你会想要添加约束。约束在此处记录,用于确保您的路径中有有效输入。如果违反了约束,就好像控制器/动作不匹配,因此不被调用。约束可以是正则表达式,如下例所示,或者可以通过实现一个类来定制IRouteConstraint

例如:

context.MapHttpRoute(
    name: "ItemList",
    routeTemplate: "api/v1/projects/{projectId}/items",
    defaults: new
        {
            area = AreaName,
            controller = "Items",
            action = "GetItems",
            offset = RouteParameter.Optional,
            count = RouteParameter.Optional,
        },
     constraints: new
        {
            offset = @"\d+",
            count = @"\d+"
        }
);
于 2013-04-25T20:08:16.893 回答
0

只需将模型验证添加到您的方法或控制器,您将自动获得所需的内容:

[ValidateModel]
public IEnumerable<Item> GetItems([FromUri]GetItemsParams getItemsParams)
{
    // logic
}

现在当调用

http://localhost/api/v1/projects/1/items?count=a

您将收到一条错误消息:

{"Message":"The request is invalid.","ModelState":{"getItemsParams.offset":["The value 'a' is not valid for offset."]}}

阅读有关模型验证的完整故事

于 2015-12-17T20:45:54.973 回答