• [水煮 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

     

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

  • 相关阅读:
    基于goahead 的固件程序分析
    ELK
    weblogic doc
    shell 查找与替换
    简单的shell命令
    weblogic 安装配置打补丁
    WLST Hangs Up Because of Java VM ClassLoader Deadlock
    WLST
    常用weblogic搜索关键字
    How to Apply Patches to a WLS 8.1 Environment
  • 原文地址:https://www.cnblogs.com/shuizhucode/p/6107399.html
Copyright © 2020-2023  润新知