[水煮 ASP.NET Web API2 方法论](3-3)路由默认值

问题

如何为路由中参数设置默认值。

 

解决方案

不管使用属性路由还是集中式路由,ASP.NET WEB API 都可以很方便的为路由定义默认参数。在每次客户端请求的时候,如果客户端没有传这些参数,框架会自动给他们赋值。

 

对于集中式路由,MapHttpRoute 扩展方法接收默认值使用的是第三个参数 IDictionary<string,object> 的形式(也是一个匿名类)。Key(或者匿名对象的属性)必须与路由模板中参数名称一致。

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new {id = VALUE}
    );

 

在属性路由中,直接在属性声明中定义默认值。

[Route("items/{id:int=VALUE}")]
public HttpResponseMessage Get(int id) { }

 

最后,对于这两种类型的路由,也可以为 Action 签名提供默认值。

public HttpResponseMessage Get(int id = VALUE) { }

 

工作原理

当我们使用集中式路由的时候,声明在路由上的默认值被用于 IHttpRpute 的对象,在客户端调用中忽略了一些请求路由参数的情况下,都是调用 Request.GetRouteData 方法(我们显示的调用或被框架调用)来补全这些默认值。

对于属性路由,除了一些额外的注册步骤,处理上也是一样的。应用程序启动的时候,所有路由属性都被处理成 RouteEntry 实例。这是通过每个在 Controller 和 Action 上的属性路由上调用 CreateRoute 方法来完成的。CreateRoute 会在内部调用 DirectRouteFactoryContext 的 CreateBuilder 方法。InlineRouteTemplateParser 是用来解析定义在路由属性中的路由模板、处理相关约束、以及默认值。然后,路由的注册就像是集中式路由的默认值和约束。

 

代码演示

如代码片段 3-7 所示例子

代码片段 3-7. 路由默认值的简单使用

// 集中式路由
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "{controller}/{id}",
    defaults: new {id = 100}
    );

 

// 属性路由
[Route("items/{id:int=100}")]
public HttpResponseMessage Get(int id) { }

 

// 方法内的默认值
public HttpResponseMessage Get(int id = 100) { }

 

在上面的例子中,下面两个请求都是一样的,返回的都是 Id 为 100 的数据:

  • myapi.com/items/
  • myapi.com/items/100

 

注意事项 默认路由的使用是一种“贪心”路由,在上面的例子中,就不能在不使用参数的情况下获取所有的数据。

 

posted @ 2016-11-28 08:02  水煮Code  阅读(814)  评论(0编辑  收藏  举报