[水煮 ASP.NET Web API2 方法论](3-3)路由默认…
2018-06-22 06:06:33来源:未知 阅读 ()
问题
如何为路由中参数设置默认值。
解决方案
不管使用属性路由还是集中式路由,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
注意事项 默认路由的使用是一种“贪心”路由,在上面的例子中,就不能在不使用参数的情况下获取所有的数据。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- asp.net源程序编译为dll文件并调用的实现过程 2020-03-29
- Asp.net MVC SignalR来做实时Web聊天实例代码 2020-03-29
- ASP.NET MVC中jQuery与angularjs混合应用传参并绑定数据 2020-03-29
- Asp.Net中WebForm的生命周期 2020-03-29
- ASP.NET使用Ajax返回Json对象的方法 2020-03-23
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash